Tho*_*mas 6 python pandas rolling-computation rolling-average
我想计算下面数据帧中每一行的1年滚动平均值
测试:
index id date variation
2313 7034 2018-03-14 4.139148e-06
2314 7034 2018-03-13 4.953194e-07
2315 7034 2018-03-12 2.854749e-06
2316 7034 2018-03-09 3.907458e-06
2317 7034 2018-03-08 1.662412e-06
2318 7034 2018-03-07 1.346433e-06
2319 7034 2018-03-06 8.731700e-06
2320 7034 2018-03-05 7.145597e-06
2321 7034 2018-03-02 4.893283e-06
...
Run Code Online (Sandbox Code Playgroud)
例如,我需要计算:
2018-03-13和2017-08-13之间的变化均值为7034
等等
我试过了:
test.groupby(['id','date'])['variation'].rolling(window=1,freq='Y',on='date').mean()
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误消息:
ValueError: invalid on specified as date, must be a column (if DataFrame) or None
Run Code Online (Sandbox Code Playgroud)
我怎样才能使用pandas rolling()
功能呢?
[编辑1]
谢谢Sacul
我测试过:
df['date'] = pd.to_datetime(df['date'])
df.set_index('date').groupby('id').rolling(window=1, freq='Y').mean()['variation']
Run Code Online (Sandbox Code Playgroud)
但是freq='Y'
不起作用(我得到了:) ValueError: Invalid frequency: Y
然后我用了window = 365, freq = 'D'
.
但是还有另一个问题:因为每对夫妇的id-date永远不会有365个连续的日期,所以结果总是空的.即使缺少日期,我也要忽略它们并考虑当前日期和当前日期之间的所有日期 - 365以计算滚动均值.例如,假设我有:
index id date variation
2313 7034 2018-03-14 4.139148e-06
2314 7034 2018-03-13 4.953194e-07
2315 7034 2017-03-13 2.854749e-06
Run Code Online (Sandbox Code Playgroud)
然后,
我怎样才能做到这一点?
[编辑2]
最后,我使用下面的公式计算1年的滚动中位数,平均值和标准差,忽略缺失值:
pd.rolling_median(df.set_index('date').groupby('id')['variation'],window=365, freq='D',min_periods=1)
pd.rolling_mean(df.set_index('date').groupby('id')['variation'],window=365, freq='D',min_periods=1)
pd.rolling_std(df.set_index('date').groupby('id')['variation'],window=365, freq='D',min_periods=1)
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助!
托马斯
我相信这应该对你有用:
# First make sure that `date` is a datetime object:
df['date'] = pd.to_datetime(df['date'])
df.set_index('date').groupby('id').rolling(window=1, freq='A').mean()['variation']
Run Code Online (Sandbox Code Playgroud)
当索引为索引时,与 datetime 一起使用pd.DataFrame.rolling
效果很好,这就是我使用的原因(如文档示例之一所示)date
df.set_index('date')
我无法真正测试它是否适用于您的示例数据帧的一年平均值,因为只有一年和一个 ID,但它应该有效。
[编辑]正如 Mihai-Andrei Dinculescu 所指出的,freq
现在是一个已弃用的参数。这是一种替代(可能更面向未来)的方法来完成您正在寻找的事情:
df.set_index('date').groupby('id')['variation'].resample('A').mean()
Run Code Online (Sandbox Code Playgroud)
您可以查看resample
文档以了解有关其工作原理的更多详细信息,以及有关频率参数的链接。
归档时间: |
|
查看次数: |
2127 次 |
最近记录: |