如何对不同密度、长度的时间序列计算加权平均值?
多时间序列加权平均值实现方案
核心思路
通过对齐时间序列数据,分别计算加权值总和与有效权重总和(仅统计存在数据的对应权重),最终用两者相除得到加权平均值,无有效数据的位置自动设为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
相关产品推荐
相关产品推荐

