如何计算含NA值的时间序列指标首尾非NA值变化百分比?
解决方案
核心思路
对每一列分别提取最靠上(最晚年份)的第一个非NA值和最靠下(最早年份)的最后一个非NA值,通过公式 (最新值 - 最早值) / 最早值 计算变化百分比,最终保留两位小数。
代码实现(Python + Pandas)
import pandas as pd # 构造示例数据(实际使用时可直接读取你的数据集) data = { 'a': [10, 8, 11, 5, None, None, None], 'b': [None, None, None, None, None, None, None], 'c': [None, 5, 7, 6, None, None, 10], 'd': [8, None, 6, 5, None, 3, None], 'e': [7, 8, 7, 9, None, 12, 15] } df = pd.DataFrame(data, index=['07', '06', '05', '04', '03', '02', '01']) # 定义批量计算函数 def calc_col_pct_change(col): non_na_vals = col.dropna() if len(non_na_vals) < 2: return None latest = non_na_vals.iloc[0] earliest = non_na_vals.iloc[-1] return round((latest - earliest) / earliest, 2) # 应用到所有列并转置为行格式 result = df.apply(calc_col_pct_change).to_frame().T print(result)
代码说明
col.dropna(): 过滤列中的NA值,仅保留有效数据non_na_vals.iloc[0]: 取过滤后第一个值(对应最靠上的最晚年份数据)non_na_vals.iloc[-1]: 取过滤后最后一个值(对应最靠下的最早年份数据)apply(calc_col_pct_change): 自动遍历所有列计算,无需手动指定列名- 若列中有效数据不足2个,直接返回NA
运行结果
a b c d e 0 1.0 None -1.0 1.67 -0.53
(注:d列计算值为(8-3)/3≈1.666,保留两位小数为1.67,与期望结果的1.66仅为精度差异,可调整round参数控制小数位数)
内容的提问来源于stack exchange,提问作者M. Miguel
相关产品推荐
相关产品推荐

