Python中基于跨国产品关联的通胀缺失值填充方案
基于国家-产品关联的缺失值填充实现方案(Python)
核心思路
基于“各国同类产品通胀完全相关”的假设,我们先计算同类产品下两两国家间的通胀比率,再利用该比率推导缺失值。比如A国与B国同类产品通胀长期维持1:2的比例,那么B国的缺失值可通过A国对应产品的通胀值乘以2得到。
实现步骤与代码
1. 数据结构确认
假设你的数据集结构如下:
| country | product | inflation |
|---|---|---|
| A国 | 产品X | 3.2 |
| B国 | 产品X | NaN |
| A国 | 产品Y | NaN |
| B国 | 产品Y | 7.8 |
首先导入依赖库:
import pandas as pd import numpy as np
2. 计算国家间通胀比率
先将数据转换为宽表(行=产品,列=国家),再计算两两国家间的有效平均比率(仅使用双方都有非缺失值的样本):
# 转换为宽表 pivot_df = df.pivot(index='product', columns='country', values='inflation') # 构建国家对的比率字典 country_list = pivot_df.columns.tolist() ratio_dict = {} for c1 in country_list: for c2 in country_list: if c1 == c2: continue # 筛选双方都有值的行 valid_data = pivot_df[[c1, c2]].dropna() if len(valid_data) > 0: # 计算c2相对于c1的平均比率(c2 = c1 * ratio) avg_ratio = (valid_data[c2] / valid_data[c1]).mean() ratio_dict[(c1, c2)] = avg_ratio # 存储反向比率,方便双向推导 ratio_dict[(c2, c1)] = 1 / avg_ratio
3. 缺失值填充逻辑
遍历每个缺失值,找到对应产品下有完整数据的参考国家,用预计算的比率推导缺失值:
def fill_inflation(row, ratio_map, pivot_table): # 非缺失值直接返回 if not pd.isna(row['inflation']): return row['inflation'] product = row['product'] target_country = row['country'] # 获取当前产品下有有效数据的国家 available_countries = pivot_table.loc[product].dropna().index.tolist() if not available_countries: # 该产品无任何有效数据,返回NaN return np.nan # 优先选择样本量最多的参考国家(这里简化为第一个,可扩展为按样本量排序) for ref_country in available_countries: ratio_key = (ref_country, target_country) if ratio_key in ratio_map: ref_value = pivot_table.loc[product, ref_country] return ref_value * ratio_map[ratio_key] return np.nan # 应用填充函数 df['inflation_filled'] = df.apply(fill_inflation, args=(ratio_dict, pivot_df), axis=1)
4. 性能优化(针对大数据集)
如果你的数据集包含150个国家+2000种产品,apply方法效率较低,可改用分组批量处理:
def fill_group(group, ratio_map): product = group.name pivot_group = group.pivot(columns='country', values='inflation') for idx, row in group.iterrows(): if pd.isna(row['inflation']): target = row['country'] available = pivot_group.dropna().columns.tolist() for ref in available: if (ref, target) in ratio_map: group.loc[idx, 'inflation_filled'] = pivot_group[ref].iloc[0] * ratio_map[(ref, target)] break return group # 按产品分组填充 df = df.groupby('product').apply(fill_group, ratio_map=ratio_dict)
扩展说明
- 比率稳定性:可以计算比率的标准差,选择标准差最小的参考国家,进一步提升填充准确性
- 异常值处理:计算比率前可先剔除异常值(比如用四分位距法),避免极端值影响比率计算
- 全缺失情况:如果某产品所有国家都缺失,可考虑用该产品的全球平均通胀(或其他逻辑)填充,需根据业务需求调整
内容的提问来源于stack exchange,提问作者Jonathan Hay
相关产品推荐
相关产品推荐

