【问题标题】:Pandas rolling apply multiplication熊猫滚动应用乘法
【发布时间】:2021-06-27 00:23:27
【问题描述】:

我原以为这是pd.DataFrame().rolling()pd.Series().rolling() 的基本应用,但熊猫滚动函数似乎无法处理应用于滚动窗口的标量乘法;我希望我错了,有人能发现错误。

我正在尝试获取系列(或数据框)的滚动窗口,并将该系列/数据框的每一行乘以权重系列/数据框(这些权重已预先计算)。我认为应该工作的代码是:

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 ”。

我应该注意,我试图将权重相乘的唯一原因是之后对新的滚动 seres/数据框应用 corr/cov/mean 统计...类似于

rolling_weighted_corr  = data.rolling(5).apply( lambda x: x*weights ).corr()

有谁知道如何将一个级数与一个滚动级数相乘(标量)以产生一个新的滚动级数?

【问题讨论】:

  • 你能为更小的数据集提供预期的输出吗?
  • 你想对乘法后的五行做什么?将它们相加返回一行?
  • 你看过pd.rolling_apply
  • 澄清一下,您是否希望将单独的 5 元素窗口乘以该权重向量?因为在滚动操作中,窗口将移动 1(而不是 5),您将得到原始系列中的相同元素乘以五个不同的值。这似乎不是你想要的。
  • 所以,基本上,我想要的输出是一个新的滚动系列,它已经通过我传递给我的原始滚动系列的权重进行了调整....第一个调整后的滚动系列 = 数据 [: 5]*weights,第二次调整滚动序列=data[1:6]*weights,第三次调整滚动序列=data[2:7]*weights,以此类推。这只是一个新的滚动系列,已通过我尝试传递给原始滚动系列的权重进行了调整。一旦我有了新的滚动系列,我可以添加 .corr() 或 .mean() 来获得我想要的调整后滚动窗口的统计数据。

标签: pandas apply product rolling-computation


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我稍微研究了一下 scipy.signal.convolve。这显然是在做一些接近所需输出的事情,但它与滚动窗口计算的手动检查不匹配。
  • 根据文档,调整后的滚动序列应为: data_adj = pd.Series( signal.convolve( data, weights, mode = 'full' ) ) 注意:权重之和 = 1,所以对输出没有影响。其中0 1.065026369243 1 4.600389806537 4 41.99446065395 5 617 78/3777039303/4477039314 4 48.58907999985/447770395/3037 78.589079499999999981734 4 76.5890399999999993714 4 76.58999999999999893734 4 76.58999999999998135 5 614 76/30137 7677037本发明
  • 但是,对计算的手动检查(逐个窗口)给出:| scipy |手册 | |-----------| ------------------ | |0 | 1.065026369243 |1.065026369243| |1 |4.600389827127|4.215932158194| |2 |13.099424806537 |12.238502834840| |3 |23.994460785031 |15.414764883561| |4 |41.991636602235 |31.316995365661|注意:手动计算只是:'data[i:i+1].reset_index(drop=True)*weights'
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2017-09-28
  • 2018-06-26
  • 2017-03-30
  • 2019-04-11
相关资源
最近更新 更多