列日期的1年滚动平均大熊猫

时间:2018-03-20 15:20:48

标签: 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
...

例如,我需要计算:

  • 2018-03-14和2017-08-14之间7034的变异均值
  • 2018-03-13与2017-08-13之间的变异均为7034

我试过了:

test.groupby(['id','date'])['variation'].rolling(window=1,freq='Y',on='date').mean()

但是我收到了错误消息:

ValueError: invalid on specified as date, must be a column (if DataFrame) or None

如何在这种情况下使用pandas rolling()函数?

[编辑1]

谢谢Sacul

我测试过:

df['date'] = pd.to_datetime(df['date'])

df.set_index('date').groupby('id').rolling(window=1, freq='Y').mean()['variation']

但是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

然后,

  • for 7034 2018-03-14:我想计算平均值(4.139148e-06,4.953194e-07,2.854749e-06)
  • for 7034 2018-03-13:我想计算MEAN(4.139148e-06,4.953194e-07,2.854749e-06)

我该怎么做?

[编辑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)

非常感谢你的帮助!

托马斯

1 个答案:

答案 0 :(得分:2)

我相信这对你有用:

select column_name
from information_schema.columns c
where table_name = 'core_banking_mpesa';
# 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'] 是索引时,使用pd.DataFrame.rolling和日期时间很有效,这就是我使用date的原因(可以在其中一个documentation's examples中看到)< / p>

我无法真正测试它是否适用于您的示例数据框中的年份平均值,因为只有一年且只有一个ID,但它应该有用。

可以说是更好的解决方案:

[编辑] 正如Mihai-Andrei Dinculescu所指出的,df.set_index('date')现在是一个弃用的论点。这是一种替代(并且可能更适合未来的)方式来做你正在寻找的东西:

freq

您可以查看resample文档,了解有关其工作原理的详细信息,以及有关频率参数的this link