尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Data-Science-For-Beginners 课 07 作业实战:用 Pandas 完成 COVID-19 疫情建模与论文共现分析
Data-Science-For-Beginners 课 07 作业实战用 Pandas 完成 COVID-19 疫情建模与论文共现分析【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners本篇实战指南以本仓库 2-Working-With-Data/07-python/assignment.md 的课后作业为骨架面向已经学完 Python 与 Pandas 课程 的读者。你将基于课内两个挑战COVID-19 疫情传播建模、COVID-19 学术论文文本分析中已写好的代码继续深化完成多国R_t对比、死亡/康复与感染的相关性、病程时长推断、死亡率时序变化以及药物共现矩阵、热力图与正则提取剂量的实战任务。读完本文你将掌握用 Pandas Matplotlib 处理时间序列与半结构化文本的完整套路并学会把课内示例代码改造成可复用的分析管线。作业背景与完成标准本作业要求你在课内两个挑战的基础上接着写而不是从零开始。挑战代码分别在 notebook-covidspread.ipynb疫情建模与 notebook-papers.ipynb论文分析中。评分标准Rubric分三档等级要求优秀Exemplary所有任务完成有图形化展示与文字解释且至少完成两个加分目标之一合格Adequate完成超过 5 项任务但未尝试加分目标或结果不清晰需改进Needs Improvement完成少于 5 项但多于 3 项且可视化无法说明问题从评分标准可以看出任务数量、可视化质量、解释说明缺一不可加分目标是拉开差距的关键。作业原始数据说明与评分细则详见 translations/bg/2-Working-With-Data/07-python/assignment.md保加利亚语译本内容与英文原版一致。第一部分COVID-19 疫情传播建模准备数据与课内代码回顾疫情数据来自约翰霍普金斯大学 CSSE 的时间序列数据集本仓库在 data/COVID/ 下提供了三份快照仓库内共 266 行、150 列覆盖 188 个国家/地区日期列从 2020-01-22 起time_series_covid19_confirmed_global.csv累计确诊time_series_covid19_recovered_global.csv累计康复time_series_covid19_deaths_global.csv累计死亡notebook 中默认从网络读取离线时可改用本地快照只需替换base_url见 notebook-covidspread.ipynb 第 3 个代码单元base_url ../../data/COVID/ # 离线模式改用仓库本地快照 # base_url https://raw.githubusercontent.com/... # 在线模式默认 infected pd.read_csv(base_url time_series_covid19_confirmed_global.csv) recovered pd.read_csv(base_url time_series_covid19_recovered_global.csv) deaths pd.read_csv(base_url time_series_covid19_deaths_global.csv)课内已经完成的预处理链路包括按Country/Region用groupby().sum()合并省份行 → 用drop(columns[Lat,Long,Province/State])去掉元数据列 → 用mkframe(country)把三份累计数据拼成按日期索引的 DataFrame → 用diff()求每日新增、rolling(7).mean()平滑周波动。此外人口数据来自 data/UID_ISO_FIPS_LookUp_Table.csv用于计算每百万人感染率pinfected。R_t的核心公式8 天滑动窗口在 notebook 中实现为df[Rt] df[ninfected].rolling(8).apply(lambda x: x[4:].sum()/x[:4].sum())其数学含义是第t天的基本再生数近似等于窗口内后半段新增感染数之和除以前半段之和即R_t (I_{t-7}I_{t-6}I_{t-5}I_{t-4}) / (I_{t-3}I_{t-2}I_{t-1}I_t)其中I_t为第t天新增感染人数。R_t 1表示疫情仍在扩散R_t 1表示传播在收敛。画图前需把除零产生的inf替换为NaN再用fillna(methodpad)前向填充否则曲线会出现断口ax df[df.index 2020-05-01][Rt].replace(np.inf, np.nan).fillna(methodpad).plot(figsize(10,3)) ax.set_ylim([0,6]) # 限制纵轴以看清早期波动 ax.axhline(1, linestyle--, colorred) # R_t1 参考线 plt.show()任务一多国 R_t 对比图把课内的单国逻辑封装成函数返回某国的R_t序列再对 56 个国家统一绘图def compute_rt(country, window8, half4): df mkframe(country) df[ninfected] df[infected].diff() rt df[ninfected].rolling(window).apply( lambda x: x[half:].sum()/x[:half].sum(), rawTrue) return rt.replace(np.inf, np.nan).fillna(methodpad) countries [US, United Kingdom, Italy, Brazil, India, Japan] rt_series {c: compute_rt(c) for c in countries} # 方案 A单图叠加比较 ax pd.DataFrame(rt_series).plot(figsize(12, 4)) ax.set_ylabel(R_t); ax.axhline(1, linestyle--, colorred) # 方案 B并排多子图适合各国波峰错峰明显的场景 fig, axes plt.subplots(2, 3, figsize(12, 6), shareyTrue) for ax, c in zip(axes.flat, countries): rt_series[c].plot(axax, titlec) ax.axhline(1, linestyle--, colorred, lw0.8) plt.tight_layout()实现要点rawTrue让apply直接传入 ndarray 而非 Series可显著加速滑动窗口计算各国疫情阶段不同叠加图适合看谁先起峰、谁先收敛子图适合逐国观察R_t是否持续高于 1。任务二死亡数、康复数与感染数的相关性用mkframe拿到累计值后直接调用 Pandas 内置的相关系数并结合散点图观察滞后关系df mkframe(US) corr df[[infected, recovered, deaths]].corr() print(corr) # 平滑后更能反映趋势相关性 smooth df[[infected, recovered, deaths]].rolling(7).mean() smooth.plot.scatter(xinfected, ydeaths)可以预期感染数与死亡数高度正相关但死亡往往滞后于感染若干天存在病程时滞。一个值得探索的分析是计算每日新增死亡与每日新增感染在不同时间滞后 k 天下的相关系数找出相关系数最大时的 k这为任务三的病程推断提供定量依据new_inf df[infected].diff().rolling(7).mean() new_deaths df[deaths].diff().rolling(7).mean() lags {} for k in range(0, 40): lags[k] new_deaths.corr(new_inf.shift(k)) best_k max(lags, keylags.get)任务三推断典型病程时长思路是以视觉方式关联感染率与死亡率曲线并寻找异常。把两条曲线放到同一张图上观察死亡曲线相对感染曲线的时间偏移df[ninfected] df[infected].diff().rolling(7).mean() df[ndeaths] df[deaths].diff().rolling(7).mean() # 归一化到 [0,1] 便于叠加比较形状 ax (df[ninfected]/df[ninfected].max()).plot(labelnew infected (norm)) (df[ndeaths]/df[ndeaths].max()).shift(0).plot(axax, labelnew deaths (norm)) ax.legend()实际操作上可以遍历滞后天数 k把ndeaths.shift(k)与ninfected叠加找到两条曲线峰对峰最吻合的 k即为粗略病程时长。注意不同国家因检测策略、死亡报告口径不同推断出的滞后可能不一致这正是作业要求多看几个国家的原因——异常点如某国死亡率曲线突然偏离往往对应数据质量或政策干预如封城、检测量变化事件。任务四死亡率及其随时间的变化基本定义fatality rate deaths / infected * 100。作业的提示非常关键要考虑病程天数先平移一条时间序列再做计算。原因在于当天确诊的人不会当天死亡直接用同日累计值会低估早期真实病死率df mkframe(US) df[fatality] df[deaths] / df[infected] * 100 df[fatality].plot() # 朴素计算早期明显偏低 # 平移改进假设病程 D 天将感染序列后移 D 天再相除 D 14 # 可由任务三得到的滞后天数替换 df[fatality_shifted] df[deaths].shift(-D) / df[infected] * 100 df[[fatality, fatality_shifted]].plot()同时建议平滑rolling(7).mean()去除报告导致的周波动并观察死亡率随时间是否趋稳——这能反映医疗资源挤兑、治疗手段改进或检测范围扩大等动态因素。第二部分COVID-19 论文分析数据集说明与课内代码回顾本挑战使用 CORD-19 论文数据集仓库不随附需自行下载metadata.csv大小约 1 GB。课内 notebook notebook-papers.ipynb 已完成如下分析链路读取metadata.csv把publish_time转成datetime并画直方图手工维护药物清单medicationshydroxychloroquine、chloroquine、tocilizumab、remdesivir、azithromycin、lopinavir、ritonavir、dexamethasone、heparin、favipiravir、methylprednisolone与诊断清单diagnosiscovid、sars、pneumonia、infection、diabetes、coronavirus、death用df[m] df[abstract].apply(lambda x: str(x).lower().count( m))逐词计数注意词首加空格避免chloroquine被hydroxychloroquine内的子串污染按年-月分组groupby([index.year, index.month]).sum()得到治疗策略月度趋势用np.zeros((len(medications), len(diagnosis)))构建药物×诊断共现矩阵逐篇摘要累加用plt.imshow(..., cmaphot)画热力图并用 Plotly 的go.Sankey画桑基图notebook 中封装为sankey(cat1, cat2, m, treshold0, h1[], h2[])函数。任务一构建药物共现矩阵把课内药物×诊断的代码改造成药物×药物遍历每篇摘要只要某两种药物在同一摘要中出现就计数一次meds medications # 沿用课内 11 种药物清单 coocc np.zeros((len(meds), len(meds)), dtypeint) for a in df[abstract]: x str(a).lower() present [m for m in meds if m in x] for i in range(len(present)): for j in range(i1, len(present)): coocc[meds.index(present[i]), meds.index(present[j])] 1 coocc[meds.index(present[j]), meds.index(present[i])] 1 # 对称 cooc_df pd.DataFrame(coocc, indexmeds, columnsmeds)出于效率考虑也可以先构造布尔矩阵再与自身转置做矩阵乘法present pd.DataFrame({m: df[abstract].str.contains( m, caseFalse) for m in meds})然后coocc present.T present注意此时对角线为各药物总出现次数。观察重点哪些药物常在同一篇论文里成对出现例如 chloroquine 与 azithromycin、lopinavir 与 ritonavir 常作为联合用药方案被共同研究。任务二热力图可视化共现矩阵用 Matplotlib 画出共现矩阵热力图fig, ax plt.subplots(figsize(8, 6)) im ax.imshow(coocc, interpolationnearest, cmaphot) ax.set_xticks(range(len(meds))); ax.set_xticklabels(meds, rotation90) ax.set_yticks(range(len(meds))); ax.set_yticklabels(meds) plt.colorbar(im, axax) plt.show()热力图中亮色格高共现次数即联合用药研究热点。若矩阵数值跨度大可先取np.log1p(coocc)再画压低少数极高值对色标的压缩效应也可叠加数值标注ax.text(j, i, coocc[i,j])提升可读性。注意课内药物×诊断热力图样式covidtreat.png 为治疗策略堆叠面积图热力图绘制逻辑见 notebook 第 26 个代码单元可直接迁移复用。加分目标一chord 弦图可视化共现作业推荐的第三方库是chordPyPI 包名。用法示意from chord import Chord # 传入对称矩阵与标签列表矩阵元素为整数频次 Chord(coocc.tolist(), meds).to_html() # 生成可交互 HTML若coocc数值过大可先二值化或按阈值截断只保留共现次数高于阈值的药物对否则弦图会过于拥挤。按任务说明此目标与另一加分目标完成其一即可达到优秀档。加分目标二用正则表达式提取药物剂量从take 400mg of chloroquine daily这类句子中抽取剂量如400mg并用 DataFrame 汇总每种药物出现过的剂量及次数。关键技巧在药物名周围限定上下文窗口只统计与药物名文本距离很近的数值import re from collections import defaultdict def extract_doses(abstracts, medicine, window30): doses defaultdict(int) pat re.compile(r(\d(?:\.\d)?\s*(?:mg|g|mcg|microgram|gram|milligram)), re.I) for a in abstracts: a str(a).lower() for mm in re.finditer(re.escape(medicine), a): start max(0, mm.start() - window) end min(len(a), mm.end() window) ctx a[start:end] for dm in pat.finditer(ctx): doses[dm.group(1).lower()] 1 return doses rows [] for med in medications: for dose, cnt in extract_doses(df[abstract], med).items(): rows.append({medication: med, dose: dose, count: cnt}) dose_df pd.DataFrame(rows).sort_values([medication, count], ascending[True, False])要点re.escape(medicine)避免药物名中的特殊字符被当作正则元字符窗口大小此处 30 字符决定文本邻近的判定范围剂量模式\d(?:\.\d)?\s*(?:mg|g|...)覆盖整数/小数与常见单位。可进一步做单位归一化如把0.4 g与400 mg视为同一剂量并观察同一药物不同剂量随时间/国别的分布差异。仓库内可深入阅读的资料课程正文2-Working-With-Data/07-python/README.mdSeries/DataFrame 核心操作、apply/groupby/rolling用法疫情建模完整代码notebook-covidspread.ipynb论文分析完整代码notebook-papers.ipynb疫情本地数据data/COVID/三份累计时间序列 CSV人口数据data/UID_ISO_FIPS_LookUp_Table.csv作业英文原版2-Working-With-Data/07-python/assignment.md疫情趋势图covidspread.png治疗策略趋势图covidtreat.png课程配套 R 语言版本2-Working-With-Data/07-python/R/供对照学习完成建议按先复现、后改造、再独立的顺序推进先在两个 notebook 中逐单元运行确认基线输出再基于本文给出的函数模板完成四项建模任务与两项论文分析任务最后任选一个加分目标冲刺优秀档。可视化务必配上文字结论例如某国R_t在何时跌破 1某两种药物共现次数显著高于其他组合这既是评分标准Exemplary 要求graphically illustrated and explained的要求也是数据科学报告的基本素养。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

MongoDB 仓库 Bazel 构建开发工作流完全指南:从 BUILD.bazel 编写到 clang-tidy 集成

MongoDB 仓库 Bazel 构建开发工作流完全指南:从 BUILD.bazel 编写到 clang-tidy 集成

MongoDB 仓库 Bazel 构建开发工作流完全指南:从 BUILD.bazel 编写到 clang-tidy 集成 【免费下载链接】mongo The MongoDB Database 项目地址: https://gitcode.com/GitHub_Trending/mo/mongo 本文是 MongoDB 服务器源码仓库中 Bazel 构建系统的开发者实战指…

📅 2026/9/10 12:00:16
在 Homepage 中集成 UniFi Drive 存储状态 Widget:配置指南与源码级原理剖析

在 Homepage 中集成 UniFi Drive 存储状态 Widget:配置指南与源码级原理剖析

在 Homepage 中集成 UniFi Drive 存储状态 Widget:配置指南与源码级原理剖析 【免费下载链接】homepage A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations. 项目地址: https://gitcode.com/GitH…

📅 2026/9/10 12:00:16
mise config set 完全指南:用命令行精准修改 mise 配置文件的每一个 TOML 值

mise config set 完全指南:用命令行精准修改 mise 配置文件的每一个 TOML 值

mise config set 完全指南:用命令行精准修改 mise 配置文件的每一个 TOML 值 【免费下载链接】mise dev tools, env vars, task runner 项目地址: https://gitcode.com/GitHub_Trending/mi/mise mise config set 是 mise 提供的一个面向脚本与日常操作的状态…

📅 2026/9/10 12:00:16
MORE NEWS

更多资讯

📰

CANN/ge图引擎API:SetOutputAttr

SetOutputAttr 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow …

📰

Ruo-Yi项目CI/CD部署实战:Jenkins+K8S全流程解析

1. Ruo-Yi项目CI/CD部署全景解析作为国内广泛使用的开源后台管理系统,Ruo-Yi的自动化部署一直是开发团队关注的焦点。最近在技术社区看到不少同行在讨论如何为Ruo-Yi搭建完整的CI/CD流水线,正好结合我去年为某金融项目部署Ruo-Yi的经验,分享一…

📰

CANN/GE图引擎属性名列表

属性名列表 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端…

📰

agents 仓库 incident-response 插件深度解析:DevOps 故障排查 Agent(devops-troubleshooter)的能力设计与落地

agents 仓库 incident-response 插件深度解析:DevOps 故障排查 Agent(devops-troubleshooter)的能力设计与落地 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilo…

📰

trace-to-training-data 转换配方指南:将评估轨迹转换为 SFT 样本与 DPO 偏好对

trace-to-training-data 转换配方指南:将评估轨迹转换为 SFT 样本与 DPO 偏好对 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址: https://gitco…

📰

Slidev 如何在构建产物中同时生成可下载的 PDF 并显示下载按钮

Slidev 如何在构建产物中同时生成可下载的 PDF 并显示下载按钮 【免费下载链接】slidev Presentation Slides for Developers 项目地址: https://gitcode.com/GitHub_Trending/sl/slidev 讲完一场 Talk 之后,你往往希望观众既能在线浏览可交互的幻灯片&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬