【问题标题】:Weighted average grouping by date (in index) in pandas DataFramepandas DataFrame中按日期(在索引中)的加权平均分组
【发布时间】:2021-08-17 18:47:21
【问题描述】:

我需要一些帮助来尝试根据日期时间索引和另一个“质量”列获取列的加权平均值。 例如:

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 小时获得一次“%”的加权平均值,作为权重列的“质量”。

我需要这样的输出:

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'])

不过,这仅在我有重复索引时才有效,而这次不是这样。

【问题讨论】:

  • 我们应该如何确定间隔开始和结束。我的意思是为什么预期的输出从 13:00:00 而不是 12:00:00 开始。请为可能的数据框提供此信息。
  • 开始和结束的间隔由一天的开始和结束给出......总是从 00:00 开始,到 23:00 结束。通常我需要按天或每 4 或 8 小时分组

标签: python pandas dataframe weighted-average


【解决方案1】:

尝试每 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']

【讨论】:

  • 是否可以帮助我尝试设置每天 5 小时的偏移量...这意味着我的一天应该从早上 5 点开始,而不是从 00:00 开始?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多