十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Data-Science-For-Beginners 第 7 课课后作业全解:COVID-19 疫情传播建模与论文药物共现分析实战指南

Data-Science-For-Beginners 第 7 课课后作业全解:COVID-19 疫情传播建模与论文药物共现分析实战指南 Data-Science-For-Beginners 第 7 课课后作业全解COVID-19 疫情传播建模与论文药物共现分析实战指南【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners导读本指南围绕 Data-Science-For-Beginners 课程「2-Working-With-Data / 07-pythonPython 与 Pandas 数据处理」一课的配套课后作业translations/en/2-Working-With-Data/07-python/assignment.md展开目标是在课堂两个挑战 Notebook 的基础上完成一次更深入的疫情数据研究。作业分为两大部分一是基于约翰斯·霍普金斯大学 CSSE 的全球疫情时序数据用 Pandas 完成多国再生数对比、感染/死亡/康复相关性分析、典型病程推断与致死率计算二是基于 CORD-19 论文摘要构建药物共现矩阵、热力图并可选地完成弦图可视化与正则提取药物剂量两项挑战任务。读完本文你将掌握groupby、rolling、diff、apply、fillna等核心 Pandas 技巧在真实时间序列与文本数据上的完整应用链路并得到一份可直接对照执行的任务清单、代码示例与评分标准自检表。作业背景课堂挑战的进阶延伸本作业要求你对课堂两个挑战Challenge的已有代码进行扩充共两部分Part 1 COVID-19 疫情传播建模基于 notebook-covidspread.ipynb 中已完成的加载、预处理、R_t估计等代码完成 4 项进阶分析任务Part 2 COVID-19 论文分析基于 notebook-papers.ipynb 中已完成的药物/诊断关键词计数、共现矩阵与 Sankey 图代码完成 2 项必做任务与 2 项可选挑战任务。作业所需数据在仓库中有离线副本可供直接使用疫情时序数据位于 data/COVID/ 目录time_series_covid19_confirmed_global.csv累计确诊、time_series_covid19_deaths_global.csv累计死亡、time_series_covid19_recovered_global.csv累计康复国家人口对照表 data/UID_ISO_FIPS_LookUp_Table.csv含Population字段用于计算感染人口占比CORD-19 论文的metadata.csv不随仓库提供需按课堂 Notebook 说明自行下载后文详述。Part 1COVID-19 疫情传播建模本部分承接课堂挑战 1。建议先完整执行一遍 notebook-covidspread.ipynb复用其生成的infected、recovered、deaths、countries、pop等中间变量再逐项完成下列 4 个任务。任务 1.1绘制多国 R 图对比任务要求为 56 个不同国家绘制再生数R曲线可在同一张图上叠加对比也可并排绘制多张子图。课堂前置知识再生数衡量疾病传染性。课堂 Notebook 用 8 天窗口估计随时间变化的R_t核心代码为df[Rt] df[ninfected].rolling(8).apply(lambda x: x[4:].sum()/x[:4].sum()) df[Rt].plot() plt.show()其含义是以第t天起往前共 8 天为窗口用前 4 天新增感染数之和去除后 4 天新增感染数之和$$R_t\frac{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时疫情趋于收敛。课堂还演示了缺口处理——滚动窗口起始段不足 8 天会产生NaN除数为 0 会产生inf需用replace与fillna修补ax df[df.index2020-05-01][Rt].replace(np.inf,np.nan).fillna(methodpad).plot(figsize(10,3)) ax.set_ylim([0,6]) ax.axhline(1,linestyle--,colorred) plt.show()完成任务的建议步骤数据准备复用课堂的mkframe(country)函数为每个国家生成按日期索引的 DataFrame含infected/recovered/deaths三列def mkframe(country): df pd.DataFrame({ infected : infected.loc[country], recovered : recovered.loc[country], deaths : deaths.loc[country]}) df.index pd.to_datetime(df.index) return df批量计算 R_t对每个国家依次计算新增感染diff、7 天滚动均值平滑消除课堂中观察到的周报波动、8 天窗口R_t并统一清洗inf/NaNrts pd.DataFrame() for c in [US,India,Brazil,Germany,Japan,China]: d mkframe(c) d[ninfected] d[infected].diff() d[ninfav] d[ninfected].rolling(window7).mean() # 平滑曲线 d[Rt] d[ninfected].rolling(8).apply(lambda x: x[4:].sum()/x[:4].sum()) d[Rt] d[Rt].replace(np.inf, np.nan).fillna(methodpad) rts[c] d[Rt]绘制对比图单图叠加用rts.plot()并排子图用plt.subplots并可用ax.axhline(1, ...)标出临界线、统一 y 轴范围fig, ax plt.subplots(1, 2, figsize(14, 4)) rts.plot(axax[0], titleRt by country (overlay)) rts[rts.index 2020-05-01].plot(axax[1], titleEarly stage, Rt6, subplotsTrue, figsize(14, 8), ylim(0, 6)) plt.show()解读与写作说明哪些国家R_t长期高于 1扩散快、哪些较早回落至 1 以下、是否出现二次暴发R_t再度抬头。任务 1.2分析死亡、康复与感染的相关性任务要求分析死亡数、康复数与感染数的相关关系。课堂的mkframe已把三者组装进同一 DataFrame可直接利用 Pandas 的corr()计算皮尔逊相关系数df mkframe(US) df[[infected,recovered,deaths]].corr()进阶建议——考虑滞后死亡与康复相对感染存在时间滞后直接算相关系数会低估真实关联。可对死亡序列做 k 天平移后再与感染序列求相关找到使相关系数最大的平移天数best_k, best_corr 0, -1 for k in range(0, 31): corr df[infected].corr(df[deaths].shift(k)) if corr best_corr: best_k, best_corr k, corr print(f最大相关系数 {best_corr:.3f} 出现在死亡滞后 {best_k} 天)这一步的结果可直接服务于任务 1.3 的病程估计与 1.4 的致死率修正。可视化方面可并排绘制三条曲线df.plot()或用散点图观察infected与deaths是否近似线性。写作时应解释相关系数含义并说明死亡/康复曲线整体跟随感染曲线但存在时间滞后的原因。任务 1.3通过感染率与死亡率的对应推断典型病程任务要求通过目视比对感染率与死亡率曲线的时间对应关系判断典型病程持续多久并识别异常。可能需要结合多个国家的数据。方法建议绘制对比曲线对同一国家在同一坐标下绘制建议平滑后的新增感染ninfav与新增死亡曲线观察死亡峰值相对感染峰值的延迟天数。平移对齐用df[deaths].shift(k)将死亡序列平移 k 天后再叠加找到视觉上对齐最好的 k即为典型病程的估计值感染后大约多少天死亡。多国交叉验证不同国家报告口径不同题目明确要求「examine data from different countries」——对多个国家重复上述步骤检验病程估计的一致性。识别异常例如新增感染骤降周末/假期不更新导致的周波动、死亡数负值或异常尖峰数据修订、批量补报等。课堂 Notebook 中 7 天滚动均值ninfav正是为消除周波动而引入的比对前务必先平滑。写作要点给出病程天数估计范围及其依据哪两个特征点对齐并说明各国出现了怎样的异常、如何用rolling/fillna/replace排查处理。任务 1.4计算致死率并观察其随时间变化任务要求计算致死率fatality rate并观察其随时间的变化。提示计算时应考虑病程天数将某条时间序列平移后再计算。朴素致死率直接用当日累计死亡除以累计确诊df[fatality] df[deaths] / df[infected] df[fatality].plot()注意偏差朴素致死率在疫情早期被系统性低估——当日确诊者尚未走完病程分母被高估后期又会相对「虚高」。这正是题目提示需要平移的原因。考虑病程的修正致死率将死亡序列按任务 1.3 估计的病程天数 k 平移后再除k best_k # 取 1.3 中估计的病程天数 df[fatality_lag] df[deaths].shift(-k) / df[infected] # 或等价地df[fatality_lag] df[deaths] / df[infected].shift(k) df[fatality_lag].plot()平移方向需在文中说明shift(-k)使用未来数据会造成数据泄漏练习场景下两者都可尝试并对比结果差异。写作要点说明朴素致死率与修正致死率的差异及原因给出采用的 k 值与依据并结合多国数据说明致死率随时间及地域变化的特征。Part 2COVID-19 论文分析本部分承接课堂挑战 2。课堂 Notebooknotebook-papers.ipynb已完成关键词计数、药物出现频次、按月趋势、药物-诊断共现矩阵、热力图与 Sankey 图。作业在此基础上要求完成 2 项必做任务与 2 项挑战任务。数据说明CORD-19 论文metadata.csv不随仓库提供需按课堂 Notebook 说明自行下载Kaggle 下载可能需要注册。课堂代码用pd.read_csv加载后df[abstract]为论文摘要列df[publish_time]为发表日期列。任务 2.1构建药物-药物共现矩阵并识别高频共现组合任务要求构建「药物 × 药物」共现矩阵找出常在同一篇摘要中同时出现的药物组合可改编课堂中「药物-诊断共现矩阵」的代码。课堂可复用代码药物-诊断共现矩阵m np.zeros((len(medications),len(diagnosis))) for a in df[abstract]: x str(a).lower() for i,d in enumerate(diagnosis): if d in x: for j,me in enumerate(medications): if me in x: m[j,i] 1关键技巧必须沿用匹配时在词前加空格 m避免chloroquine被hydroxychloroquine子串误命中同时用str()强制转换避免NaN摘要报错。改编为药物-药物共现矩阵把内层循环从「遍历诊断」改为「遍历药物」n len(medications) cooc np.zeros((n, n)) for a in df[abstract]: x str(a).lower() present [i for i, me in enumerate(medications) if me in x] for i in present: for j in present: if i ! j: cooc[i, j] 1从源码结构看课堂 Notebook 定义的medications列表包含 11 种药物hydroxychloroquine、chloroquine、tocilizumab、remdesivir、azithromycin、lopinavir、ritonavir、dexamethasone、heparin、favipiravir、methylprednisolone因此共现矩阵为 11×11。识别高频共现组合转为 DataFrame 后取上三角排除对角线与重复对再stacksort_valuescm pd.DataFrame(cooc, indexmedications, columnsmedications) pairs cm.where(np.triu(np.ones(cm.shape), k1).astype(bool)).stack() pairs.sort_values(ascendingFalse).head(10)写作要点说明哪些药物对常被联合研究如抗病毒药与免疫调节剂的组合并解释共现信息的价值提示潜在联合用药方案、研究热点。任务 2.2用热力图可视化共现矩阵任务要求用热力图可视化任务 2.1 的共现矩阵。课堂可复用代码药物-诊断热力图plt.imshow(m,interpolationnearest,cmaphot) ax plt.gca() ax.set_yticks(range(len(medications))) ax.set_yticklabels(medications) ax.set_xticks(range(len(diagnosis))) ax.set_xticklabels(diagnosis,rotation90) plt.show()改编为药物-药物热力图将m换成coocx、y 轴标签都使用medicationsplt.imshow(cooc, interpolationnearest, cmaphot) ax plt.gca() ax.set_yticks(range(len(medications))) ax.set_yticklabels(medications) ax.set_xticks(range(len(medications))) ax.set_xticklabels(medications, rotation90) plt.show()说明matplotlib的imshow不内置数值标签与颜色条。若需在格子上标注共现次数可考虑 seaborn 的heatmapsns.heatmap(cm, annotTrue, cmapYlOrRd)课堂 Notebook 的imshow方案零额外依赖同样可行。写作要点结合热力图指出最亮的「块」对应哪些药物组合与任务 2.1 的排序结果互相印证。挑战任务 2.3stretch goal用弦图可视化药物共现任务要求可选加分项用弦图chord diagram可视化药物共现关系可使用chord库辅助绘制。实现思路安装依赖pip install chord底层依赖plotly可复用课堂已有的 Plotly 环境。将共现矩阵转为 chord 库要求的数据格式并绘制from chord import Chord # 可先过滤共现次数过低的边避免图形过密 Chord(cooc, medications, width600, height600).to_html()写作要点说明弦图与热力图的互补性——热力图适合看精确数值弦图适合一眼看清「哪些节点之间连接最粗」共现最强说明阈值过滤的依据。挑战任务 2.4stretch goal用正则表达式提取药物剂量任务要求可选加分项用正则表达式从摘要中提取不同药物的剂量如take 400mg of chloroquine daily中的400mg构建展示各药物不同剂量的 DataFrame。注意应寻找文本中紧邻药物名附近的数值。实现思路剂量模式典型剂量形如「数字 单位」单位常见mg、g、mcg/µg、IU等r(\d(?:\.\d)?)\s*(mg|g|mcg|µg|iu)配合ignorecase兼容MG/Mg等写法。邻近性约束题目的提示强调「numeric values that are located near the medication name」。因此应先在摘要中定位药物名出现位置只在其前后一定字符窗口如前后 60 字符内搜索剂量避免把摘要中其他无关剂量误关联到本药物import re def extract_dose(abstract, medication, window60): x str(abstract).lower() doses set() for mt in re.finditer(medication.lower(), x): start, end max(0, mt.start()-window), min(len(x), mt.end()window) snippet x[start:end] for dm in re.finditer(r(\d(?:\.\d)?)\s*(mg|g|mcg|µg|iu), snippet): doses.add(f{dm.group(1)}{dm.group(2)}) return sorted(doses)构建 DataFrame遍历药物与摘要可先抽样控制运行时间汇总每种药物的剂量集合records [] for me in medications: for a in df[abstract].head(200): # 抽样以控制运行时间 for dose in extract_dose(a, me): records.append({medication: me, dosage: dose}) dose_df pd.DataFrame(records) dose_df.groupby(medication)[dosage].apply(list) # 每种药物的剂量集合写作要点说明正则的匹配逻辑、为什么需要「邻近窗口」约束避免张冠李戴以及如何处理大小写、小数点、空格等边界情况。评分标准Rubric与自检清单作业附带的评分标准如下Exemplary优秀Adequate达标Needs Improvement需改进全部任务完成有图形化展示与说明并至少完成两个 stretch goal 中的一个完成任务超过 5 项但未尝试 stretch goal或结果不清晰完成任务少于 5 项但多于 3 项且可视化不能有效说明要点对照评分标准提交前建议自检Part 1 的 4 项任务是否全部完成每项是否都配图并附文字解读曲线含义、异常现象Part 2 的两项共现任务是否完成热力图是否清晰可读、标签是否完整是否至少完成了 2.3弦图或 2.4剂量提取中的一个 stretch goal可视化是否确实「有效地说明了要点」而非只贴图不解释结果是否可复现运行环境、数据来源、关键参数如窗口大小、平移天数、阈值等是否在文中交代。环境与数据准备运行环境推荐使用 Jupyter Notebook。仓库中两个课堂 Notebook 均以「自顶向下」方式组织可顺序执行若还不熟悉 Jupyter 的运行方式可参考课程 README2-Working-With-Data/07-python/README.md中的指引。依赖库numpy、pandas、matplotlib两个挑战均需要Part 2 的 Sankey 图需要plotly课堂代码已使用stretch goal 2.3 需要chord库。数据获取疫情时序数据可直接读取仓库内 data/COVID/ 下的三个 CSV 快照课堂 Notebook 也提供在线加载 URL网络不可用时可改用本地副本国家人口数据使用 data/UID_ISO_FIPS_LookUp_Table.csv注意该表同时含国家与省/州级记录取国家人口时应过滤Province_State为空的记录课堂代码有完整示例CORD-19 论文metadata.csv不随仓库提供需按课堂 Notebook 说明自行下载Kaggle 下载可能需要注册。小结本作业将课堂学到的 Pandas 数据处理能力落到两个真实研究场景疫情传播建模考验时间序列的预处理、平滑、滚动窗口与滞后分析论文分析考验从非结构化文本提取结构化信息、构建共现矩阵并多角度可视化。两部分共用同一套方法论——先清洗数据再构造指标最后用可视化验证假设并讲出故事。完成全部必做任务并至少攻克一个 stretch goal即可完整走通「数据获取 → 处理 → 建模 → 可视化 → 解读」的全流程。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表