You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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,以此类推

初步思路:

  1. 将DataFrame转换为numpy数组:
df.to_numpy()
  1. 使用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')

遇到的问题:

  1. 如何对numpy数组的列而非行使用这些函数?
  2. 如何在重构数据框前,动态地对每个“列切片”应用自适应权重函数?
解决方案

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:33:31