1

我需要使用 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)

how没有权重的正常重采样工作正常(这里建议使用 lambda 函数作为参数: 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'

我很高兴有任何建议。

4

1 回答 1

1

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

我必须计算我认为你正在尝试做的代码如下:

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

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

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

  2. 权重是根据被重新采样的数据长度动态创建的Series。您需要这样做,因为对于每个要计算的时间间隔x,您的长度lambda可能不同。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变量发生了什么。希望有帮助!

于 2014-10-14T22:41:58.030 回答