健康与生活方式数据库编程手册(Python方向教学2025年4月)
健康与生活方式(吸烟/饮酒/体力活动/BMI/饮食/睡眠/心理健康)万字编程手册(Python)
适用对象:数据分析师、公共卫生研究者、健康管理从业者、数智化团队
范式目标:可编程获取→标准化清洗→权重与复杂抽样→指标构建→可视化→可复现交付
技术栈:Python(pandas/pyreadstat/requests/matplotlib/polars可选)
目录
1.手册使用方式与项目结构
2.数据源选型(聚焦中国)
3.程序化获取与读取模板
4.指标口径与变量工程(七大主题)
5.权重与复杂抽样设计(概念到落地)
6.质量控制(QC)与验证清单
7.端到端示例A:跨期国别指标(中国)趋势与对比
8.端到端示例B:微观个体数据(示意)吸烟×体力活动×肥胖
9.可视化与沟通模板
10.可复现工程与自动化
11.合规、伦理与发布守则
12.附录:变量字典模板、映射示例、FAQ
手册使用方式与项目结构
推荐项目结构(可直接复制):
china-health-lifestyle/
├─conf/#变量字典、映射表、国家/年份清单
│├─indicators.yml
│└─value_maps.yml
├─data/
│├─raw/#原始下载(只读)
│├─interim/#中间层(列统一、宽窄互转)
│└─final/#分析就绪(parquet/csv)
├─notebooks/#探索性分析
├─src/
│├─etl/#抓取、清洗、标准化
│├─analysis/#指标计算、统计模型
│└─viz/#图表与导出
├─outputs/#导出的图表/表格/报告
├─environment.yml#conda环境锁定
└─README.md
环境建议:
-Python≥3.10;pandas、pyreadstat、requests、matplotlib、pyyaml、polars(可选);
-Windows中文路径注意编码;长期运行建议Linux容器。
数据源选型
组合拳:宏观指标(WHOGHO)+微观个体调查(例如CHNS/CFPS/CHARLS等)。
说明:微观数据多为受控访问,需机构/研究者资质与合规协议;本手册提供脚手架与口径建议。
1)WHOGlobalHealthObservatory(GHO)
-范围:吸烟、酒精、体力活动、肥胖/超重、饮食相关、心理健康(汇总级指标)等;
-形式:ODataAPI(JSON),按国家/年份/性别等维度提供;
-适用:做中国趋势与对外对标(与亚太或全球比较);适合作为背景事实与宏观KPI。
2)中国相关微观数据(需申请)—常见来源与定位
-CHNS(ChinaHealthandNutritionSurvey):饮食摄入、体测、行为与健康结局(多省队列);
-CFPS(ChinaFamilyPanelStudies):家庭/个体社会经济、健康自报、心理量表条目;
-CHARLS(老年健康与养老追踪):老年群体健康状态、功能、心理与生活方式;
-CLDS/CGSS等:含广义健康与心理条目,可用于补充。
这些数据多为问卷/随访,包含权重/分层/整群信息(或提供构造指引),与BRFSS/NHANES方法可类比。
温馨提示:在任何使用前,请阅读各数据集的使用条款、引用规范、隐私合规要求。
程序化获取与读取模板
3.1WHOGHO(OData,聚焦中国)
目标:以WHOGHO提供的ODataAPI,按**中国(CHN)**筛取七大主题相关指标的时间序列。
常用字段:
SpatialDim
(国家代码,如CHN)、TimeDim
(年份)、IndicatorCode
、NumericValue
、Dim1/Dim2
(性别/年龄组等)。
#src/etl/gho_pull_cn.py
importos,json,time,pathlib
importpandasaspd
importrequestsBASE="https://ghoapi.azureedge.net/api"#例:你可以将感兴趣的指标代码放在一个列表里(示意,具体以WHO目录为准)
INDICATORS=[
#吸烟(示意代码,需在指标目录中查找对应code)
"NCD_RISKFACTOR_SMOKING",
#酒精
"SA_0000001643",
#体力活动不足
"NCD_RISKFACTOR_INSUFFPA",
#肥胖/超重
"NCD_BMI_30A","NCD_BMI_25A",
#饮食:蔬果摄入不足/食盐摄入等(示意)
"DIET_LOW_FRUIT","DIET_SALT_INTAKE",
#心理健康(抑郁患病率等汇总指标,示意)
"MH_DEPRESSION_PREV",
#睡眠(若无直接指标,可后续以其他来源补充)
]defget_table(endpoint:str,params=None,top=50000):
url=f"{BASE}/{endpoint}?$top={top}"
ifparams:
#这里简单拼接,严格可用OData过滤($filter=)
pass
r=requests.get(url,timeout=60)
r.raise_for_status()
returnpd.DataFrame(r.json()["value"])#拉取指标目录,帮助人工确认code
ind_df=get_table("Indicator?$count=true")
ind_df.to_csv("data/interim/gho_indicator_catalog.csv",index=False)#拉取各指标的数据,并筛选中国
frames=[]
forcodeinINDICATORS:
url=f"{BASE}/{code}?$top=50000"
res=requests.get(url,timeout=60).json