Python 将numpy.average与权重一起使用以对阵列重新采样

Python 将numpy.average与权重一起使用以对阵列重新采样,python,numpy,pandas,weighted-average,Python,Numpy,Pandas,Weighted Average,我需要用numpys的加权平均函数对一些数据进行重采样,但它就是不起作用 这是我的测试用例: 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.datet

我需要用numpys的加权平均函数对一些数据进行重采样,但它就是不起作用

这是我的测试用例:

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函数作为参数,说明此处建议的
方式:谢谢!):

但如果我尝试使用一些权重,它总是返回一个
类型错误:当a的形状和权重不同时,必须指定Axis

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'

我很乐意接受任何建议。

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

我要计算的代码,我想你正在尝试做的是:

df.resample('5min', how=lambda x: np.average(x, weights=1+np.arange(len(x))))
与给您带来问题的线路相比,有两个不同之处:

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

  • 权重是根据重新采样的
    系列
    中的数据长度动态创建的。您需要这样做,因为您的
    lambda
    中的
    x
    可能是一个
    系列
    ,对于所计算的每个时间间隔长度不同

  • 我解决这个问题的方法是通过一些简单的类型调试,用适当的函数定义替换
    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
    变量发生了什么。希望有帮助

    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)