【发布时间】:2018-05-18 20:36:32
【问题描述】:
我的目标是能够在记录表中识别价格增长。
我知道这可能与使用数据工具实现的功能相去甚远,因此我感谢任何帮助或改进建议。
我遇到的直接问题是,如果 pandas 行中的某些数据不存在,scipy.stats.linregress 不会返回。我认为需要某种掩蔽或填充来返回存在空值的行的斜率测量。抛出异常,但它仍然有效。
另外,我是否使用最佳解决方案来找到增长? 我观察到,如果我过滤具有正斜率、较高右值(相关性)和较低标准错误(标准错误)的记录,这些行的趋势线是向上且一致的。
我尝试使用斜率和其他数值来量化价格增长的原因是,如果我在 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))
【问题讨论】: