【问题标题】:Use numpy.average with weights for resampling a pandas array使用带有权重的 numpy.average 对 pandas 数组进行重采样
【发布时间】:2014-10-14 21:39:44
【问题描述】:

我需要使用 numpys weighted-average-function 重新采样一些数据 - 它只是不起作用...。

这是我的测试用例:

import numpy as np
import pandas as pd
time_vec = [datetime.datetime(2007,1,1,0,0)
             ,datetime.datetime(2007,1,1,0,1)
             ,datetime.datetime(2007,1,1,0,5)
             ,datetime.datetime(2007,1,1,0,8)
             ,datetime.datetime(2007,1,1,0,10)
             ]
df = pd.DataFrame([2,3,1,7,4],index = time_vec)

没有权重的普通重采样可以正常工作(此处建议使用 lambda 函数作为how 的参数:Pandas resampling using numpy percentile? 谢谢!):

df.resample('5min',how = lambda x: np.average(x[0]))

但是如果我尝试使用一些权重,它总是返回一个TypeError: Axis must be specified when shapes of a and weights differ

df.resample('5min',how = lambda x: np.average(x[0],weights = [1,2,3,4,5]))

我尝试了许多不同数量的权重,但没有变得更好:

for i in xrange(20):
    try:
        print range(i)
        print df.resample('5min',how = lambda x:np.average(x[0],weights = range(i)))
        print i
        break
    except TypeError:
        print i,'typeError'

如果有任何建议,我都会很高兴。

【问题讨论】:

    标签: python numpy pandas weighted-average


    【解决方案1】:

    这里的简短回答是,lambda 中的权重需要根据被平均的系列长度动态创建。此外,您需要注意您正在操作的对象的类型。

    计算我认为您正在尝试执行的操作的代码如下:

    df.resample('5min', how=lambda x: np.average(x, weights=1+np.arange(len(x))))
    

    与给您带来问题的那一行相比,有两个不同之处:

    1. x[0] 现在只是 xlambda 中的 x 对象是 pd.Series,因此 x[0] 仅给出系列中的第一个值。这在第一个示例(没有权重)中没有引发异常,因为当c 是标量时,np.average(c) 只返回c。但我认为即使在这种情况下,它实际上也计算了不正确的平均值,因为每个采样子集都只是将其第一个值作为“平均值”返回。

    2. 权重是根据被重新采样的Series 中的数据长度动态创建的。您需要这样做,因为您的lambda 中的x 可能是每个计算时间间隔的不同长度的Series

    我发现这一点的方法是通过一些简单的类型调试,将lambda 替换为适当的函数定义:

    def avg(x):
        print(type(x), x.shape, type(x[0]))
        return np.average(x, weights=np.arange(1, 1+len(x)))
    
    df.resample('5Min', how=avg)
    

    这让我看看x 变量发生了什么。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多