gpt4 book ai didi

python - 使用带有权重的 numpy.average 对 pandas 数组进行重新采样

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:44 25 4
gpt4 key购买 nike

我需要使用 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 函数作为how的参数:Pandas resampling using numpy percentile? 谢谢!):

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

但是如果我尝试使用一些权重,它总是返回一个 TypeError: Axis must be specified when a 的形状和权重不同:

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))))

与给您带来问题的线路相比,有两个区别:

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

  2. 权重是根据重新采样的系列中的数据长度动态创建的。您需要执行此操作,因为您的 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 变量发生了什么。希望有帮助!

关于python - 使用带有权重的 numpy.average 对 pandas 数组进行重新采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com