【问题标题】:Resample a Pandas dataframe with coefficients使用系数重新采样 Pandas 数据帧
【发布时间】:2015-04-20 13:46:32
【问题描述】:

我有一个包含以下列的数据框:{'day','measurement'}

一天内可能会有多次测量(或根本没有测量)

例如:

day     |    measurement
1       |     20.1
1       |     20.9
3       |     19.2
4       |     20.0
4       |     20.2

和一个系数数组: coef={-1:0.2, 0:0.6, 1:0.2}

我的目标是对数据进行重新采样并使用系数对其进行平均(缺失的数据应该被忽略)。

这是我编写的计算代码

window=[-1,0,-1]
df['resampled_measurement'][df['day']==d]=[coef[i]*df['measurement'][df['day']==d-i].mean() for i in window if df['measurement'][df['day']==d-i].shape[0]>0].sum()
df['resampled_measurement'][df['day']==d]/=[coef[i] for i in window if df['measurement'][df['day']==d-i].shape[0]>0].sum()

对于上面的例子,输出应该是:

Day  measurement
1    20.500
2    19.850
3    19.425
4    19.875

问题是代码永远运行,我很确定有更好的方法来重新采样系数。

任何建议将不胜感激!

【问题讨论】:

  • 能否请您帮助我了解相关性如何转化为上述预期输出?我的理解是,例如,在第 4 天,您需要(0.2 * 19.2 + 0.6 * 20.1) / 0.8,即19.875,而不是19.97。如果您可以仅完成第 4 天或第 3 天的计算,那会有所帮助。
  • 我的错误,谢谢@SANand
  • @UriGoren 第 2 天、第 3 天的测量结果是否符合预期?我想,你也应该更新这些!

标签: python pandas dataframe moving-average weighted-average


【解决方案1】:

这是您正在寻找的可能的解决方案:

        # This is your data
In [2]: data = pd.DataFrame({
   ...:     'day': [1, 1, 3, 4, 4],
   ...:     'measurement': [20.1, 20.9, 19.2, 20.0, 20.2]
   ...: })

        # Pre-compute every day's average, filling the gaps
In [3]: measurement = data.groupby('day')['measurement'].mean()

In [4]: measurement = measurement.reindex(pd.np.arange(data.day.min(), data.day.max() + 1))

In [5]: coef = pd.Series({-1: 0.2, 0: 0.6, 1: 0.2})

        # Create a matrix with the time-shifted measurements
In [6]: matrix = pd.DataFrame({key: measurement.shift(key) for key, val in coef.iteritems()})

In [7]: matrix
Out[7]:
       -1     0     1
day
1     NaN  20.5   NaN
2    19.2   NaN  20.5
3    20.1  19.2   NaN
4     NaN  20.1  19.2

        # Take a weighted average of the matrix
In [8]: (matrix * coef).sum(axis=1) / (matrix.notnull() * coef).sum(axis=1)
Out[8]:
day
1    20.500
2    19.850
3    19.425
4    19.875
dtype: float64

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2013-11-22
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多