我本以为这将是 pd.DataFrame().rolling()
或 pd.Series().rolling()
的基本应用,但似乎 pandas 滚动函数无法处理应用于滚动窗口的标量乘法;我希望我错了,有人可以发现错误。
我正在尝试获取一个系列(或数据帧)的滚动窗口,并将该系列/数据帧的每一行乘以一个系列/数据帧的权重(这些权重已预先计算)。我认为应该工作的代码是:
data.rolling(5).apply( lambda x: x*weights )
与
data = pd.Series( np.random.randint(1,101,2000) )
weights = pd.Series([ 0.10650, 0.1405310, 0.1854318, 0.2446788, 0.3228556 ])
我认为 data.rolling(5).apply( lambda x: x*weights ) 会产生一个新的滚动系列,但每次都会返回以下错误“TypeError: cannot convert the series to
我应该注意,我尝试乘以权重的唯一原因是之后在新的滚动序列/数据帧上应用 corr/cov/mean 统计......类似
rolling_weighted_corr = data.rolling(5).apply( lambda x: x*weights ).corr()
有谁知道如何将一个系列与一个滚动系列相乘(标量)以产生一个新的滚动系列?
答案 0 :(得分:0)
Scipy 可以使用 signal.convolve
做到这一点。例如,使用 mode="same"
标志将返回一个与 data
大小相同的数组,其中每行周围的居中窗口乘以权重并求和(因此,np.sum(weights)
用于归一化)。示例:
from scipy import signal
data_smoothed = signal.convolve(data, weights, mode="same")/np.sum(weights)
np.var(data) # 836.0666897499997
np.var(data_smoothed) # 185.52213418878418