使用Pandas和Scipy回归线斜率来识别生长



我的目标是能够在记录表中识别价格增长。

我知道这可能与数据工具的可能性相距甚远,因此我感谢任何改进的帮助或建议。

我遇到的直接麻烦是,如果不存在熊猫行中的某些数据,则scipy.stats.linregress不会返回。我认为需要某种掩盖或填充才能返回无效的行的坡度度量。有一个例外,但仍然有效。

另外,我是否使用最佳解决方案来找到增长?我已经观察到,如果我过滤为具有正斜率,较高rvalue(相关性)和较低stderr(标准误差)的记录,则这些行的趋势线是向上且一致的。

我尝试用坡度和其他数字值量化价格增长的原因是因为如果我绘制Excel图表中所有数据的线条,那么选择显示一致的向上移动的行是压倒性的,因为有很多噪音。可以更好地完成吗?

这是工作样本:

# credit  jezrael
import pandas as pd
import numpy as np
import scipy
from scipy import stats
def calc_slope(row):
    a = scipy.stats.linregress(row, y=axisvalues)
    return pd.Series(a._asdict())
table=pd.DataFrame({'Category':['A','A','A','B','C','C','C','B','B','A','A','A','B','B','D','A','B','B'],
           'Quarter':['2016-Q1','2017-Q2','2017-Q3','2017-Q4','2017-Q2','2016-Q2','2017-Q2','2016-Q3','2016-Q4','2016-Q2','2016-Q3','2017-Q4','2016-Q1','2016-Q2','2016-Q4','2016-Q4','2017-Q2','2017-Q3'],
            'Value':[100,200,500,800,700,900,300,400,600,200,300,400,200,300,100,300,500,600]})
db=(table.groupby(['Category','Quarter']).filter(lambda group: len(group) >= 1)).groupby(['Category','Quarter'])["Value"].mean()
db=db.unstack()
axisvalues=list(range(1,len(db.columns)+1)) #used in calc_slope function
db = db.join(db.apply(calc_slope,axis=1))

您可以使用:

#np.arange instead range
axisvalues= np.arange(1,len(db.columns)+1)
def calc_slope(row):
    #mask NaNs out
    mask = row.notnull()
    a = scipy.stats.linregress(row[mask.values], y=axisvalues[mask])
    return pd.Series(a._asdict())

db = db.join(db.apply(calc_slope,axis=1))
print (db)
print (db)
          2016-Q1  2016-Q2  2016-Q3  2016-Q4  2017-Q2  2017-Q3  2017-Q4  
Category                                                                  
A           100.0    200.0    300.0    300.0    200.0    500.0    400.0   
B           200.0    300.0    400.0    600.0    500.0    600.0    800.0   
C             NaN    900.0      NaN      NaN    500.0      NaN      NaN   
D             NaN      NaN      NaN    100.0      NaN      NaN      NaN   
             slope  intercept    rvalue    pvalue    stderr  
Category                                                     
A         0.012895   0.315789  0.802955  0.029677  0.004281  
B         0.010057  -0.885057  0.947623  0.001172  0.001516  
C        -0.007500   8.750000 -1.000000  0.000000  0.000000  
D              NaN        NaN  0.000000       NaN       NaN  

但最后一行获得RuntimeWarning s,因为2016-Q4中只有一个值。

可能需要使用filterwarnings,请删除警告,谢谢KDOG:

import warnings 
warnings.filterwarnings("ignore") 

最新更新