【问题标题】:Time Series with Pandas / Cumulative average of previous values for different groups (lagged variabled for different groups)Pandas 的时间序列/不同组的先前值的累积平均值(不同组的滞后变量)
【发布时间】:2019-05-11 18:44:45
【问题描述】:

我正在尝试使用 Pandas 获取不同组的先前值的累积平均值。

我的原始数据框(df)是:

idx = [np.array(['Jan-18', 'Jan-18', 'Feb-18', 'Mar-18', 'Mar-18', 'Mar-18','Apr-18', 'Apr-18', 'May-18', 'Jun-18', 'Jun-18', 'Jun-18','Jul-18', 'Aug-18', 'Aug-18', 'Sep-18', 'Sep-18', 'Oct-18','Oct-18', 'Oct-18', 'Nov-18', 'Dec-18', 'Dec-18',]),np.array(['A', 'B', 'B', 'A', 'B', 'C', 'A', 'B', 'B', 'A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'A', 'B', 'C'])]
data = [{'xx': 1}, {'xx': 5}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3},{'xx': 1}, {'xx': 6}, {'xx': 3}, {'xx': 5}, {'xx': 2}, {'xx': 3},{'xx': 1}, {'xx': 9}, {'xx': 3}, {'xx': 2}, {'xx': 7}, {'xx': 3}, {'xx': 6}, {'xx': 8}, {'xx': 2}, {'xx': 7}, {'xx': 9}]
df = pd.DataFrame(data, index=idx, columns=['xx'])
df.index.names=['date','type']
df=df.reset_index()
df['date'] = pd.to_datetime(df['date'],format = '%b-%y') 
df=df.set_index(['date','type'])
df['xx'] = df.xx.astype('float')

我正在寻找的结果(不同类型的先前值的累积平均值)如下所示:

         date type   xx        yy
0  2018-01-01    A  1.0       NaN
1  2018-01-01    B  5.0       NaN
2  2018-02-01    B  3.0  5.000000
3  2018-03-01    A  2.0  1.000000
4  2018-03-01    B  7.0  4.000000
5  2018-03-01    C  3.0       NaN
6  2018-04-01    A  1.0  1.500000
7  2018-04-01    B  6.0  5.000000
8  2018-05-01    B  3.0  5.250000
9  2018-06-01    A  5.0  1.333333
10 2018-06-01    B  2.0  4.800000
11 2018-06-01    C  3.0  3.000000
12 2018-07-01    A  1.0  2.250000
13 2018-08-01    B  9.0  4.333333
14 2018-08-01    C  3.0  3.000000
15 2018-09-01    A  2.0  2.000000
16 2018-09-01    B  7.0  5.000000
17 2018-10-01    C  3.0  3.000000
18 2018-10-01    A  6.0  2.000000
19 2018-10-01    B  8.0  5.250000
20 2018-11-01    A  2.0  2.571429
21 2018-12-01    B  7.0  5.555556
22 2018-12-01    C  9.0  3.000000

我尝试了以下 Pandas 代码但没有成功(滚动操作时出错):

df['yy'] = (df.assign(H=(df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1)))).groupby('type').H.rolling(1).apply(lambda x: x[-1])

请注意,代码的第一部分工作正常:

df['yy'] = (df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1))

** 如果你能解决我的错误,或者你提出另一种优雅的方式对 Pandas 做同样的事情,那将会很有用。谢谢!

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    我正在使用expanding

    df.groupby('type')['xx'].expanding(min_periods=2).mean().\
         reset_index(level=0,drop=True).reindex(df.index)
    date        type
    2018-01-01  A            NaN
                B            NaN
    2018-02-01  B       4.000000
    2018-03-01  A       1.500000
                B       5.000000
                C            NaN
    2018-04-01  A       1.333333
                B       5.250000
    2018-05-01  B       4.800000
    2018-06-01  A       2.250000
                B       4.333333
                C       3.000000
    2018-07-01  A       2.000000
    2018-08-01  B       5.000000
                C       3.000000
    2018-09-01  A       2.000000
                B       5.250000
    2018-10-01  C       3.000000
                A       2.571429
                B       5.555556
    2018-11-01  A       2.500000
    2018-12-01  B       5.700000
                C       4.200000
    Name: xx, dtype: float64
    

    【讨论】:

    • ## 不是我问的## 我提到了以前/过去的时期(不包括当前时期##
    【解决方案2】:

    我找到了两个解决方案,使用 shift():

    df['yy'] = (df.assign(H=(df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1)))).groupby('type').H.shift()
    

    并且(使用滚动):

    df['yy'] = (df.assign(H=(df.groupby('type').xx.transform('cumsum')/(df.groupby('type').xx.cumcount()+1)))).groupby('type').H.rolling(2).apply(lambda x: x[-2]).reset_index(level=0,drop=True).reindex(df.index)
    

    欢迎任何其他方式!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多