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

如何基于var_avg列计算百分位数以标准化困境指数(DI)?

解决困境指数(DI)标准化步骤问题

核心逻辑

根据需求,标准化步骤需将var_avg(7项排名的等权平均)按**百分位数区间(0-10%、10-20%…90-100%)**映射为0(最繁荣)到100(最困境)的指数值:

  • var_avg最小的10%(最繁荣)→ norm=0
  • var_avg次小的10% → norm=10
  • ...
  • var_avg最大的10%(最困境)→ norm=100

示例代码与解释

以下用Python Pandas实现完整流程,包含样本数据生成、var_avg计算及标准化:

1. 导入依赖并生成样本数据

import pandas as pd
import numpy as np

# 生成100个邮政编码的样本数据(模拟已完成指标排名的结果)
np.random.seed(42)
sample_data = pd.DataFrame({
    'zipcode': ['10001', '10002', '10003', '10004', '10005', 
                '10006', '10007', '10008', '10009', '10010']*10,
    'var1_rank': np.random.randint(1, 101, 100),
    'var2_rank': np.random.randint(1, 101, 100),
    'var3_rank': np.random.randint(1, 101, 100),
    'var4_rank': np.random.randint(1, 101, 100),
    'var5_rank': np.random.randint(1, 101, 100),
    'var6_rank': np.random.randint(1, 101, 100),
    'var7_rank': np.random.randint(1, 101, 100)
})

# 计算等权平均得分var_avg
sample_data['var_avg'] = sample_data[[f'var{i}_rank' for i in range(1,8)]].mean(axis=1)

2. 执行标准化生成norm列

# 生成10个百分位数的划分点(0, 10%, 20%, ..., 100%)
quantiles = np.linspace(0, 1, 11)

# 将var_avg按百分位数分组,并映射为对应的norm值
sample_data['norm'] = pd.qcut(
    sample_data['var_avg'],
    q=quantiles,
    labels=[0, 10, 20, 30, 40, 50, 60, 70, 80, 100]  # 10个区间对应10个标签
)

# 将norm从分类类型转为整数类型
sample_data['norm'] = sample_data['norm'].astype(int)

3. 验证结果

# 查看每个norm区间对应的var_avg范围,确认映射逻辑正确
print(sample_data.groupby('norm')['var_avg'].agg(['min', 'max']))

注意事项

  • 如果你的指标排名逻辑是数值越小代表越困境(比如贫困率越低排名越小),需将标签反转:labels=[100,90,80,...,0],确保最小的var_avg对应100(最困境),最大的对应0(最繁荣)。
  • 若存在大量重复值导致pd.qcut无法均分,可添加duplicates='drop'参数自动调整分位数,或增大样本量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:33:16