【问题标题】:pandas rolling functions with time groupby带有时间 groupby 的 pandas 滚动功能
【发布时间】:2015-10-30 10:22:21
【问题描述】:

这是我的问题。 我所拥有的是一个 DataFrame,如下所示:

df:

2013-10-24      1
2013-10-25      2
2013-11-27      3 
2013-11-28      4
2013-12-01      5 
2013-12-02      6

我想要的是这样的 DataFrame:

rolling_mean(df, window='1M'):

2013-10      1.5
2013-11      3.5
2013-12      5.5 

rolling_mean(df, window='2M'):

2013-10      NAN
2013-11      2.5
2013-12      4.5 

rolling_mean(df, window='3M'):

2013-10      NAN
2013-11      NAN
2013-12      3.5 

rolling_mean(df, window='1Y'):

2013-10      NAN
2013-11      NAN
2013-12      NAN

其中 1M 是“1 个月”,2M 是“2 个月”。窗口不是一个int值,而是一个时间间隔,如'1D'、'3M'、'1Y'等。该函数可以将数据帧按'D'、'M'、'Y'等时间单位分组,然后将数据帧滚动到时间单位之前的数字如1、3...

我需要这样的滚动功能吗? 有人可以帮助我吗?我描述清楚了吗? 非常感谢。

更新:

我还有一个谜。 我需要实现这样一个函数,它可以计算每天的滚动标准偏差,而不是按月重新采样,而是按月加权窗口步长单位。

在这种情况下, 我所拥有的也是 df:

2013-10-24      1
2013-10-25      2
2013-11-27      3 
2013-11-28      4
2013-12-01      5 
2013-12-02      6

pd.rolling_std(df.resample('1M'),window=1):

结果是

2013-10    NAN
2013-11    NAN 
2013-12    NAN

我真正是这样的数据框(window = 1):

2013-10    0.5
2013-11    0.5 
2013-12    0.5

第一个 0.5 是标准偏差,可以通过 np.sqrt([1,2]) 从 10 月开始计算。 其他 0.5 也来自 [3,4] 和 [5,6]。 但是,无论怎么='xxx'方法在resample函数中,结果都不对。 2个月的客观结果是,

df (window = 2 ):

2013-10    NAN
2013-11    1.1180 
2013-12    1.1180

第一个 1.1180 是标准差,可以通过 np.sqrt([1,2,3,4]) 从 10 月和 11 月计算。 2013-12 的 1.1180 来自 2013-11 和 2013-12 的 [3,4,5,6]。

附言 标准偏差是我想要实现滚动的功能之一...... 谢谢~

【问题讨论】:

  • 我认为 rolling_meanfreq 参数是你所追求的,但你需要一个 datetimeindex 才能工作
  • 你能给我看一个简单的示例代码吗?熊猫新手,谢谢! @EdChum

标签: python pandas


【解决方案1】:

您可以在日期列上使用to_datetime 来生成日期时间索引。

df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6]},
                  index=['2013-10-24', '2013-10-25', '2013-11-27', 
                         '2013-11-28', '2013-12-01', '2013-12-02'])           
df.index = pd.to_datetime(df.index)

>>> pd.rolling_mean(df.resample('1M'), 1, freq='1M')
            value
2013-10-31    1.5
2013-11-30    3.5
2013-12-31    5.5

>>> pd.rolling_mean(df.resample('2M'), window=1, freq='1M')
            value
2013-10-31    1.5
2013-11-30    NaN
2013-12-31    4.5

>>> pd.rolling_mean(df.resample('1M'), window=2, freq='1M')
            value
2013-10-31    NaN
2013-11-30    2.5
2013-12-31    4.5

>>> pd.rolling_mean(df.resample('1M'), window=3, freq='1M')
            value
2013-10-31    NaN
2013-11-30    NaN
2013-12-31    3.5

>>> pd.rolling_mean(df.resample('1M'), window=12, freq='1M')
            value
2013-10-31    NaN
2013-11-30    NaN
2013-12-31    NaN

【讨论】:

  • 对你有好处! @Alexander 你能帮我解决我的新困惑吗?
猜你喜欢
  • 2018-03-09
  • 2020-02-22
  • 1970-01-01
  • 2021-09-22
  • 2018-10-06
  • 2023-04-07
  • 2019-07-06
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多