pandas DataFrame 中按日期(在索引中)的加权平均分组
Weighted average grouping by date (in index) in pandas DataFrame
我需要一些帮助来尝试根据 datetime-index 和另一个 'mass' 列获取列的加权平均值。
例如:
d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'],
'mass': [23, 40, 10, 12, 15, 11],
'%': [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
}
df = pd.DataFrame(data=d)
df.set_index('date')
我需要的是每2小时获取'%'的加权平均值,即'mass'权重列。
我需要这样的输出:
date(index) | mass | %
2021-08-01 13:00:00 | 43 | 0.865
2021-08-02 15:00:00 | 22 | 0.464
2021-08-02 17:00:00 | 26 | 0.454
作为加权平均值计算的“%”:
0.865 = ((23 x 0.4) + (40 x 0.7))/ (40 + 23)
请注意,我的索引中可能没有连续的日期时间,例如,我可能会因为缺少数据而跳过几个小时,甚至几天。在那种情况下,如果没有可用于计算的数据,我需要输出为 NaN。
如果只有一行数据,则假设该行是该期间的加权平均值...
经期也可能有所不同,从 2 小时到 12 个月不等...
在上一个问题中,已经有人帮我解决了这个问题:
out = df.assign(k=df['mass'].mul(df['%']))[['mass','k']].sum(level=0)
out['%'] = out.pop('k').div(out['mass'])
不过,这仅在我有重复索引时有效,而这次情况并非如此。
试着每2小时分组一次,你会离得更近-
d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'],
'mass': [23, 40, 10, 12, 15, 11],
'%': [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
}
df = pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
df['mass_wt'] = df['mass'] * df['%']
op = df.groupby(pd.Grouper(freq='2H')).agg({'mass': 'sum', 'mass_wt': 'sum'}).query('mass > 0')
op['op'] = op['mass_wt'] / op['mass']
我需要一些帮助来尝试根据 datetime-index 和另一个 'mass' 列获取列的加权平均值。 例如:
d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'],
'mass': [23, 40, 10, 12, 15, 11],
'%': [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
}
df = pd.DataFrame(data=d)
df.set_index('date')
我需要的是每2小时获取'%'的加权平均值,即'mass'权重列。
我需要这样的输出:
date(index) | mass | %
2021-08-01 13:00:00 | 43 | 0.865
2021-08-02 15:00:00 | 22 | 0.464
2021-08-02 17:00:00 | 26 | 0.454
作为加权平均值计算的“%”:
0.865 = ((23 x 0.4) + (40 x 0.7))/ (40 + 23)
请注意,我的索引中可能没有连续的日期时间,例如,我可能会因为缺少数据而跳过几个小时,甚至几天。在那种情况下,如果没有可用于计算的数据,我需要输出为 NaN。 如果只有一行数据,则假设该行是该期间的加权平均值...
经期也可能有所不同,从 2 小时到 12 个月不等...
在上一个问题中,已经有人帮我解决了这个问题:
out = df.assign(k=df['mass'].mul(df['%']))[['mass','k']].sum(level=0)
out['%'] = out.pop('k').div(out['mass'])
不过,这仅在我有重复索引时有效,而这次情况并非如此。
试着每2小时分组一次,你会离得更近-
d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'],
'mass': [23, 40, 10, 12, 15, 11],
'%': [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
}
df = pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
df['mass_wt'] = df['mass'] * df['%']
op = df.groupby(pd.Grouper(freq='2H')).agg({'mass': 'sum', 'mass_wt': 'sum'}).query('mass > 0')
op['op'] = op['mass_wt'] / op['mass']