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

Python中基于跨国产品关联的通胀缺失值填充方案

基于国家-产品关联的缺失值填充实现方案(Python)

核心思路

基于“各国同类产品通胀完全相关”的假设,我们先计算同类产品下两两国家间的通胀比率,再利用该比率推导缺失值。比如A国与B国同类产品通胀长期维持1:2的比例,那么B国的缺失值可通过A国对应产品的通胀值乘以2得到。


实现步骤与代码

1. 数据结构确认

假设你的数据集结构如下:

countryproductinflation
A国产品X3.2
B国产品XNaN
A国产品YNaN
B国产品Y7.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:59:55