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