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

如何对不同密度、长度的时间序列计算加权平均值?

多时间序列加权平均值实现方案

核心思路

通过对齐时间序列数据,分别计算加权值总和与有效权重总和(仅统计存在数据的对应权重),最终用两者相除得到加权平均值,无有效数据的位置自动设为np.nan。

代码实现步骤

import pandas as pd
import numpy as np

# 1. 拼接三个时间序列,按索引对齐,缺失数据填充为NaN
combined_df = pd.concat([df1, df2, df3], axis=1)

# 2. 定义对应df1、df2、df3的权重
weights = [0.1, 0.2, 0.3]

# 3. 计算每个时间点的加权值总和(自动忽略NaN项)
weighted_sum = combined_df.mul(weights, axis=1).sum(axis=1, skipna=True)

# 4. 计算每个时间点的有效权重总和(仅统计有数据的列对应的权重)
valid_weight_sum = combined_df.notna().mul(weights, axis=1).sum(axis=1)

# 5. 计算加权平均值,无有效数据时设为np.nan
weighted_avg = weighted_sum.div(valid_weight_sum).where(valid_weight_sum > 0, np.nan)

代码解释

  • 数据拼接:pd.concat会自动按时间索引对齐三个序列,不存在的数据位置填充为NaN,确保每个时间点的所有序列数据在同一行。
  • 加权值总和:mul(weights, axis=1)给每列数据乘以对应权重,sum(axis=1, skipna=True)仅对非NaN的加权值求和,符合“只计算存在数据的项”的要求。
  • 有效权重总和:notna()生成布尔矩阵标记数据存在性,再乘以权重后求和,得到当前时间点所有有效数据对应的权重之和。
  • 最终结果:div做除法,where将有效权重和为0(即所有序列无数据)的位置替换为np.nan。

适配特殊场景

针对你提到的df3仅2017年有数据的情况:

  • 2017年的时间点:若三个序列均有数据,分母为0.1+0.2+0.3=0.6;若仅df1、df2有数据,分母为0.3,逻辑自动适配。
  • 非2017年的时间点:df3数据为NaN,计算时会自动忽略其权重,仅用df1、df2的有效权重求和作为分母。

内容的提问来源于stack exchange,提问作者Xu Shan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:40:58