熊猫如何计算基于时间窗的聚合均值?



对于这个问题,我想计算具有3年时间窗口的特定成员的平均值。例如以下数据帧:

tbody> <<tr>11122
member_id 特征1 特征2 特征3 日期
10.10.50.21/2/20
0.20.30.31/2/18
0.30.20.21/2/16
0.10.20.11/4/17
0.40.10.41/2/18
0.50.10.21/2/15

按如下步骤进行:

  1. 定义一个函数来获取特定行的平均特征当前组,所需时间段:

    def getRowMeans(row, grp):
    dTo = row.Date
    return grp[grp.Date.between(dTo - pd.DateOffset(years=3), dTo)]
    .loc[:, 'Feature 1' : 'Feature 3'].mean()
    

    思路是:

    • 当前对象是,来自一组行(对于某些member_id,
    • 对于整个集团以下的操作也必须是已知的;所以它是这个函数的另一个参数(grp),
    • fromgrp日期获取之前3年的行当前行(包括此日期),
    • 从这些行中获取所有3特征列并返回它们的平均值。
  2. 定义一个函数,为每组行调用(对于某些member_id),返回包含所有Feature列的该组的副本替换为它们的方法(由getRowMeans生成):

    def FeaturesToMeans(grp):
    means = grp.apply(getRowMeans, axis=1, grp=grp)
    rv = grp.copy()
    rv.update(means)
    return rv
    

    第一步是计算特征均值。

    为了不改变原组,对象必须是finally返回的(rv)必须创建为副本

    然后用刚刚计算的means更新。但是请注意update在的位置操作并且不返回任何值结果。

    返回的对象是更新后的组。

  3. 生成实际结果,作为一个新的DataFrame:

    result = df.groupby('member_id', group_keys=False).apply(FeaturesToMeans)
    

对于您的示例数据,结果为:

member_id  Feature 1  Feature 2  Feature 3       Date
0          1   0.133333   0.333333       0.20 2020-01-02
1          1   0.200000   0.233333       0.20 2018-01-02
2          1   0.300000   0.200000       0.20 2016-01-02
3          1   0.200000   0.200000       0.15 2017-01-04
4          2   0.450000   0.100000       0.30 2018-01-02
5          2   0.500000   0.100000       0.20 2015-01-02

最新更新