如何对DataFrame列滑动窗口内元素应用自适应权重函数求和
问题描述
现有如下格式的DataFrame:
a b c e f 2 3 4 5 1 9 8 6 4 6 1 2 2 2 3 9 8 8 9 1 3 6 8 6 2 . . . . . . . . . . 7 5 4 1 8
需求是对每一列,在大小为4的滑动窗口内(仅使用最近4条原始数据)应用自适应权重函数。例如给定权重awa = [0.1, 0.2, 0.3, 0.4]:
- 列a的第5个元素
a5 = sum([2, 9, 1, 9] * awa) = 0.2 + 1.8 + 0.3 + 3.6 = 5.9 - 后续计算仅依赖原始数据,比如
a6 = sum([9, 1, 9, 3] * awa) = 5,以此类推
初步思路:
- 将DataFrame转换为numpy数组:
df.to_numpy()
- 使用
np.convolve或sliding_window_view:
from numpy.lib.stride_tricks import sliding_window_view np.sum(sliding_window_view(values, window_shape = 4), axis = 1) np.convolve(mydata,np.ones(4,dtype=int),'valid')
遇到的问题:
- 如何对numpy数组的列而非行使用这些函数?
- 如何在重构数据框前,动态地对每个“列切片”应用自适应权重函数?
解决方案
问题1:对numpy数组的列应用滑动窗口操作
两种核心思路:
- 先将数组转置(行变列、列变行),处理完成后再转置回原结构
- 直接给
sliding_window_view指定axis=0参数,针对列方向执行滑动窗口操作
问题2:对每个列切片应用自适应权重
以下是两种可落地的实现方式:
方式一:使用sliding_window_view(直观易理解)
import numpy as np from numpy.lib.stride_tricks import sliding_window_view import pandas as pd # 假设df是你的原始DataFrame awa = np.array([0.1, 0.2, 0.3, 0.4]) arr = df.to_numpy() # 生成列方向的滑动窗口(每个窗口包含当前列的连续4条原始数据) windows = sliding_window_view(arr, window_shape=4, axis=0) # 对每个窗口计算加权和,最后转置回原列方向 weighted_sums = (windows * awa).sum(axis=2).T # 将结果转为DataFrame,若需要和原始数据对齐(前3行补NaN),则用reindex result_df = pd.DataFrame(weighted_sums, columns=df.columns, index=df.index[3:]) result_df = result_df.reindex(df.index)
方式二:使用np.convolve(高效简洁)
import numpy as np import pandas as pd awa = np.array([0.1, 0.2, 0.3, 0.4]) arr = df.to_numpy() # 对每一列应用卷积操作,mode='valid'仅保留完整窗口的计算结果 # 注意:卷积计算顺序与直接加权求和相反,需将权重反转 weighted_sums = np.apply_along_axis(lambda x: np.convolve(x, awa[::-1], mode='valid'), axis=0, arr=arr) # 转换为DataFrame并对齐原始索引 result_df = pd.DataFrame(weighted_sums, columns=df.columns, index=df.index[3:]) result_df = result_df.reindex(df.index)
内容的提问来源于stack exchange,提问作者Sentient AI Turing
相关产品推荐
相关产品推荐

