熊猫的滚动相关性和每组的平均值(最近3个)

时间:2019-12-24 07:32:46

标签: python python-3.x pandas numpy pandas-groupby

我有一个这样的数据框

data = [["ID1", 1, 5], ["ID1", 2, 6], ["ID1", 3, 7],
    ["ID1", 4, 4], ["ID1", 5, 2], ["ID1", 6, 2],
    ["ID2", 1, 4], ["ID2", 2, 6], ["ID2", 3, 1], 
    ["ID2", 4, 1], ["ID2", 5, 4]]
data = pd.DataFrame(data = data, columns=["ID", "colA", "colB"])
data

    ID      colA    colB
0   ID1     1       5
1   ID1     2       6
2   ID1     3       7
3   ID1     4       4
4   ID1     5       2
5   ID1     6       2
6   ID2     1       4
7   ID2     2       6
8   ID2     3       1
9   ID2     4       1
10  ID2     5       4

我想计算每个组中最后3个项目的平均值和相关性。

但是我的数据集非常大(> 10Mn)

一般而言,我正在尝试这种方式,但是它适用于小数据,而对实际数据却很扼制

data['Avg_last3'] = data.groupby(['ID'])['colB'].apply(lambda x: x.rolling(min_periods = 1, window = 3).mean())

相关性在colAcolB之间。平均值仅适用于colB

我最终的预期输出是

    ID      colA    colB    Corr_last3  Avg_last3
0   ID1     1       5       0           5
1   ID1     2       6       1           5.5
2   ID1     3       7       1           6
3   ID1     4       4       -0.65       5.66
4   ID1     5       2       -0.99       4.33
5   ID1     6       2       -0.86       2.66
6   ID2     1       4       0           4
7   ID2     2       6       1           5
8   ID2     3       1       -0.59       3.66
9   ID2     4       1       -0.86       2.66
10  ID2     5       4       0.86        2

1 个答案:

答案 0 :(得分:1)

尝试:

data['Avg_last3'] = data.groupby(['ID'])['colB'].rolling(min_periods = 1, window = 3).mean().reset_index(drop=True)

data['Corr_last3'] = data.groupby(['ID'])['colB', 'colA'].rolling(min_periods = 1, window = 3).corr().iloc[0::2, -1].reset_index(drop=True)

输出:

     ID  colA  colB  Avg_last3  Corr_last3
0   ID1     1     5   5.000000         NaN
1   ID1     2     6   5.500000    1.000000
2   ID1     3     7   6.000000    1.000000
3   ID1     4     4   5.666667   -0.654654
4   ID1     5     2   4.333333   -0.993399
5   ID1     6     2   2.666667   -0.866025
6   ID2     1     4   4.000000         NaN
7   ID2     2     6   5.000000    1.000000
8   ID2     3     1   3.666667   -0.596040
9   ID2     4     1   2.666667   -0.866025
10  ID2     5     4   2.000000    0.866025