Python疫情数据可视化:中美CSV清洗与看板实战
简介这份资源面向具备Python基础、希望练习数据分析与可视化实战的学生和开发者围绕中美两国疫情数据展开解决从原始表格到网页图表展示的完整流程问题。压缩包共19个文件、约145KB包含6个Python脚本负责数据读取、预测与对比分析7个HTML页面用于呈现全球、国内及中美对比等可视化结果另有4个xlsx与1个csv提供中美及分省疫情数据1个txt作说明整体结构清晰、便于按模块查阅。已有296人学习下载适合作为课程设计或练手项目参考。读者可借此掌握用Python处理多源疫情数据、生成未来14天新增预测、并输出可交互网页图表的思路同时获得一套可直接运行和二次修改的代码与数据模板快速理解数据清洗、分析与展示的衔接方式。1. 中美疫情数据可视化从两份 CSV 到一套能跑起来的 Python 看板手头拿到两份疫情时间序列 CSV——一份是国内各省份每日新增一份是美国各州每日新增——字段名不统一、日期格式不一致、缺失值散落各处。直接丢进 matplotlib 画出来的图x 轴挤成一团图例盖住半张画布领导看了一眼说“这什么东西”。这不是绘图库的问题是数据没洗干净就上桌的问题。这套方案要解决的就是这件事用 Python 把中美两国的疫情数据从原始 CSV 清洗成统一结构再用 pyecharts 或 matplotlib 输出可交互或可嵌入报告的可视化图表。适合有 Python 基础、需要快速交付一份数据分析展示的从业者也适合正在做课程设计或企业级数据看板原型的开发者。核心链路只有四步读数据、清洗对齐、选图型、渲染输出。下面按这条链路拆开讲。2. 数据加载与清洗pandas 读进来之后先别急着画2.1 两份数据源的字段差异与对齐策略中美疫情数据最常见的来源是 JHU CSSE 的 time_series 格式和国内卫健委/丁香园整理的省份日增表。前者是宽表——每列一个日期每行一个地区后者通常是长表——每行一条“日期-省份-新增”记录。两种结构不统一直接合并会翻车。我一般先把两份数据都转成统一的长表结构date、region、country、new_cases、cumulative_cases五列。宽转长用pd.melt()长表直接用列重命名对齐。关键点是日期列必须统一成datetime64类型否则后面按时间聚合时排序会出玄学问题。import pandas as pd # 读取国内省份数据假设是长表格式 cn_df pd.read_csv(china_province_daily.csv) cn_df cn_df.rename(columns{ 日期: date, 省份: region, 新增确诊: new_cases, 累计确诊: cumulative_cases }) cn_df[country] China cn_df[date] pd.to_datetime(cn_df[date], format%Y-%m-%d) # 读取美国州级数据假设是 JHU 宽表格式 us_raw pd.read_csv(us_states_time_series.csv) us_df us_raw.melt( id_vars[Province_State, Country_Region], var_namedate, value_namecumulative_cases ) us_df us_df.rename(columns{ Province_State: region, Country_Region: country }) us_df[date] pd.to_datetime(us_df[date], format%m/%d/%y) us_df us_df.sort_values([region, date]) us_df[new_cases] us_df.groupby(region)[cumulative_cases].diff().fillna(0) us_df[new_cases] us_df[new_cases].clip(lower0) # 修正数据回退导致的负值 # 合并 combined pd.concat([cn_df, us_df], ignore_indexTrue) combined combined[[date, region, country, new_cases, cumulative_cases]]这段代码的核心逻辑是先把两份异构数据统一到同一套列名和数据类型再合并。pd.melt()把宽表转长表groupby().diff()从累计值反推每日新增clip(lower0)处理数据修正导致的累计值回退——这是疫情数据里最常见的脏数据形态不处理的话新增曲线会出现莫名其妙的负值尖刺。参数上需要注意pd.to_datetime的format参数必须和源数据严格匹配美国数据里%m/%d/%y和%Y-%m-%d混用是高频翻车点。如果源数据日期格式不统一先用pd.to_datetime(df[date], infer_datetime_formatTrue)兜底再检查有没有解析失败的 NaT。2.2 缺失值处理与异常值修正的三种策略疫情数据里缺失值分三类整行缺失某天某省没上报、累计值缺失但新增有值、新增缺失但累计可推算。三种情况处理方式不同。第一种直接dropna(subset[date, region])删掉因为缺日期或地区的记录没有分析价值。第二种用累计值做前向填充再差分df[cumulative_cases].ffill()然后重新算 diff。第三种用累计值差分补新增或者用前后两天的均值插值。# 策略一删除关键字段缺失的行 combined combined.dropna(subset[date, region, country]) # 策略二按地区分组后对累计值前向填充再重算新增 combined combined.sort_values([country, region, date]) combined[cumulative_cases] combined.groupby( [country, region] )[cumulative_cases].ffill() # 策略三对新增值的缺失用线性插值 combined[new_cases] combined.groupby( [country, region] )[new_cases].transform( lambda s: s.interpolate(methodlinear, limit3) ) # 异常值单日新增超过该地区历史均值的 10 倍标记但不删除 stats combined.groupby(region)[new_cases].agg([mean, std]) combined combined.merge(stats, onregion, suffixes(, _stat)) combined[is_outlier] combined[new_cases] ( combined[mean] 5 * combined[std] )这里interpolate的limit3表示最多连续插值 3 天超过 3 天的空缺说明数据源本身有问题强行插值会引入虚假趋势。异常值标记而不删除是因为疫情数据里的“暴增”往往是真实的集中排查结果删掉反而丢失信息。注意ffill()之前必须按日期排序否则填充的是错误方向的值。这个坑我在第一次做的时候踩过填充完发现 3 月的数据被 5 月的值覆盖了。3. 可视化选型什么数据配什么图别拿饼图画时间序列3.1 时间序列用折线、地区对比用柱状、占比用堆叠面积中美疫情数据能回答的问题无非几类趋势变化每日新增走势、地区对比各省/各州累计排名、构成占比某国占全球比例、地理分布地图热力。每种问题对应的图型选择有明确边界。时间序列只有折线图一个正确答案别用柱状图画 365 天的日增数据柱子会密到看不清。地区对比用横向柱状图地区名放 y 轴避免 x 轴标签旋转。占比用堆叠面积图或饼图——但饼图只在类别少于 6 个时用中美两国对比可以用三十个省份就别用了。import matplotlib.pyplot as plt import matplotlib.dates as mdates plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 按国家聚合每日新增 daily combined.groupby([date, country])[new_cases].sum().reset_index() fig, ax plt.subplots(figsize(14, 6)) for country, group in daily.groupby(country): ax.plot(group[date], group[new_cases], labelcountry, linewidth1.5) ax.xaxis.set_major_locator(mdates.MonthLocator(interval2)) ax.xaxis.set_major_formatter(mdates.DateFormatter(%Y-%m)) ax.set_xlabel(日期) ax.set_ylabel(每日新增确诊) ax.set_title(中美每日新增确诊趋势对比) ax.legend() ax.grid(axisy, alpha0.3) plt.tight_layout() plt.savefig(trend_comparison.png, dpi150)MonthLocator(interval2)控制 x 轴刻度每两个月一个避免日期标签重叠。dpi150是嵌入报告的最低清晰度要求屏幕展示用 100 就够打印用 300。tight_layout()解决图例被裁切的问题——这个函数不调用的话保存的图片经常缺一块。3.2 pyecharts 交互式看板的配置要点如果交付物是网页或需要交互鼠标悬停看具体数值、点击图例筛选matplotlib 就不够了换 pyecharts。它的核心优势是输出 HTML可以直接嵌入 Flask 或 Django 项目也符合企业级数据可视化看板的常见技术栈。from pyecharts.charts import Line, Bar, Grid from pyecharts import options as opts # 准备中美两国按月的汇总数据 monthly combined.copy() monthly[month] monthly[date].dt.to_period(M).astype(str) monthly_agg monthly.groupby([month, country])[new_cases].sum().reset_index() cn_data monthly_agg[monthly_agg[country] China] us_data monthly_agg[monthly_agg[country] United States] line ( Line() .add_xaxis(cn_data[month].tolist()) .add_yaxis( 中国, cn_data[new_cases].tolist(), is_smoothTrue, linestyle_optsopts.LineStyleOpts(width2), ) .add_yaxis( 美国, us_data[new_cases].tolist(), is_smoothTrue, linestyle_optsopts.LineStyleOpts(width2), ) .set_global_opts( title_optsopts.TitleOpts(title中美月度新增确诊对比), xaxis_optsopts.AxisOpts(name月份, axislabel_optsopts.LabelOpts(rotate45)), yaxis_optsopts.AxisOpts(name新增确诊), tooltip_optsopts.TooltipOpts(triggeraxis), legend_optsopts.LegendOpts(pos_top5%), ) ) line.render(covid_trend.html)is_smoothTrue让折线平滑但数据点少于 10 个时不建议开会扭曲趋势。triggeraxis让 tooltip 跟随 x 轴显示所有系列的值比默认的item模式更适合对比场景。rotate45处理月份标签过长的问题。pyecharts 的坑在于它生成的 HTML 依赖 CDN 加载 echarts.js内网环境或离线演示时会白屏。解决办法是在render()时指定cdn为本地路径或者用snapshot模式输出静态图片。这个在交付前一定要测。4. 避坑与排查那些让我加班到凌晨的细节4.1 日期解析翻车%y和%Y差一个世纪现象美国数据里1/22/20被解析成 1920 年图表 x 轴范围从 1920 拉到 2020。原因pd.to_datetime的%y是两位年份%Y是四位。JHU 数据用两位年份如果格式串写错pandas 默认映射到 1969-2068 区间20会被解释成 2020 还是 1920 取决于具体实现。解决统一用format%m/%d/%y解析两位年份解析后检查df[date].dt.year.min()是否合理。更稳妥的做法是解析后手动修正df.loc[df[date].dt.year 2000, date] pd.DateOffset(years100)。4.2 中文标签显示为方块现象matplotlib 图表里所有中文变成□□□。原因matplotlib 默认字体不支持中文且axes.unicode_minus未关闭导致负号也异常。解决plt.rcParams[font.sans-serif] [SimHei]加上plt.rcParams[axes.unicode_minus] False。Linux 环境下 SimHei 可能不存在换成WenQuanYi Micro Hei或Noto Sans CJK SC。用matplotlib.font_manager.findfont(SimHei)确认字体路径是否存在。4.3 累计值差分出现负新增现象new_cases列出现 -300 这样的值折线图出现向下尖刺。原因数据源修正了历史累计值导致后一天累计小于前一天。或者跨地区合并时排序错误把不同地区的累计值做了差分。解决差分前必须groupby(region)差分后clip(lower0)。如果负值频繁出现检查数据源是否有“核减”字段——部分省份会把核减数单独列出需要从新增里减去。4.4 pyecharts 输出 HTML 在浏览器打开空白现象render()生成的 HTML 文件双击打开后页面全白控制台报echarts is not defined。原因pyecharts 默认从 CDN 加载 echarts.js网络不通或 CDN 被墙时加载失败。解决安装pyecharts时确认版本在render()中指定cdn参数为本地 echarts.min.js 路径或者用pyecharts.globals.CurrentConfig.ONLINE_HOST改成内网镜像地址。离线场景建议直接用 matplotlib 出静态图。4.5 数据量过大导致渲染卡死现象把 3000 行日增数据直接丢给 pyecharts 折线图浏览器标签页卡死。原因前端渲染上万个数据点会触发性能瓶颈尤其是开启了is_smooth和tooltip的情况下。解决按周或按月聚合后再渲染数据点控制在 200 个以内。如果必须展示日粒度用dataZoom组件做区间缩放默认只显示最近 90 天。5. 从静态图到可复用脚本把清洗逻辑封装成函数前面四章的代码散落在各处每次换一份数据就要重新改列名、改格式。实际交付时我一般会把清洗和绘图封装成两个函数输入原始 CSV 路径输出图表文件和一份清洗后的中间数据。def clean_covid_data(cn_path, us_path): 读取中美疫情 CSV返回统一结构的长表 DataFrame cn pd.read_csv(cn_path).rename(columns{ 日期: date, 省份: region, 新增确诊: new_cases, 累计确诊: cumulative_cases }) cn[country] China cn[date] pd.to_datetime(cn[date]) us pd.read_csv(us_path) us us.melt( id_vars[Province_State, Country_Region], var_namedate, value_namecumulative_cases ).rename(columns{Province_State: region, Country_Region: country}) us[date] pd.to_datetime(us[date], format%m/%d/%y) us us.sort_values([region, date]) us[new_cases] us.groupby(region)[cumulative_cases].diff().fillna(0).clip(lower0) df pd.concat([cn, us], ignore_indexTrue) df df.dropna(subset[date, region]) df df.sort_values([country, region, date]) df[cumulative_cases] df.groupby([country, region])[cumulative_cases].ffill() return df[[date, region, country, new_cases, cumulative_cases]] def plot_trend(df, output_pathtrend.png): 按国家聚合每日新增并输出折线图 daily df.groupby([date, country])[new_cases].sum().reset_index() fig, ax plt.subplots(figsize(14, 6)) for country, group in daily.groupby(country): ax.plot(group[date], group[new_cases], labelcountry, linewidth1.5) ax.xaxis.set_major_locator(mdates.MonthLocator(interval2)) ax.xaxis.set_major_formatter(mdates.DateFormatter(%Y-%m)) ax.set_xlabel(日期); ax.set_ylabel(每日新增确诊) ax.set_title(中美每日新增确诊趋势对比) ax.legend(); ax.grid(axisy, alpha0.3) plt.tight_layout(); plt.savefig(output_path, dpi150); plt.close()封装之后换数据源只需要改clean_covid_data里的列名映射绘图逻辑完全复用。plt.close()不能省——批量生成几十张图时不关 figure 会吃光内存。验证清洗结果是否正确我习惯做三个检查df[date].min()和max()是否覆盖预期时间范围df.groupby(country)[new_cases].sum()的量级是否合理中国累计约 100 万级别美国约 1 亿级别df[new_cases].describe()看有没有极端异常值。这套脚本我前后改了七八版最大的教训是别在绘图阶段修数据。图不对八成是清洗没做干净回头查groupby的维度、diff的顺序、ffill的方向。把清洗和绘图彻底分开排查问题时能省一半时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Seata连接Nacos认证失败403:特殊字符URL编码问题解析

Seata连接Nacos认证失败403:特殊字符URL编码问题解析

1. 问题本质与真实场景还原Nacos 和 Seata 在微服务架构中属于高频共存组件:Nacos 作为注册中心和配置中心,Seata 作为分布式事务协调器,两者通过registry.conf配置文件建立连接。但当 Nacos 启用了账号密码认证(尤其是密码含特殊…

2026/10/1 17:50:22 阅读更多 →
AI日报制作全流程:从信息筛选到技术拆解与知识管理

AI日报制作全流程:从信息筛选到技术拆解与知识管理

1. 一份AI日报的诞生:从信息洪流到结构化简报每天早上七点,我的浏览器标签页会同时打开十几个信息源:arXiv上的最新预印本、几个头部AI实验室的官方博客、GitHub Trending、还有三四个行业社群的讨论串。这个习惯保持了快三年,起因…

2026/10/1 17:50:22 阅读更多 →
AI限速治理:从协议、芯片到模型的闭环实践

AI限速治理:从协议、芯片到模型的闭环实践

1. 这不是新闻简报,而是一份AI治理现场观察手记今天早上七点四十三分,我盯着安理会听证会直播页面上那个被反复打码的“AI限速”提案PDF封面,手指悬在键盘上方停了三秒——这标题里没一个字是虚的,但每个词都像裹着三层雾。云栖、…

2026/10/2 19:40:10 阅读更多 →

最新新闻

ACPI六大状态解析:G/S/C/P/T/D与系统电源管理

ACPI六大状态解析:G/S/C/P/T/D与系统电源管理

做过几年固件和操作系统底层的人,基本都绕不开ACPI这几个字母。ACPI(Advanced Configuration and Power Interface)里的state概念,说白了就是一套全系统电源管理的“状态机”,从整个电脑是开机还是关机,到C…

2026/10/2 22:54:11 阅读更多 →
AI应用底座QuickBlue:从模型网关到Agent编排的企业级中间层

AI应用底座QuickBlue:从模型网关到Agent编排的企业级中间层

团队里最近频繁有人问我同一个问题:QuickBlue 到底是什么,为什么这半年大家突然都在聊“AI 应用底座”?尤其是在我们自己内部做技术选型、帮客户规划 Agent 落地的时候,“底座”这个词出现的频率高到让人不得不重视。今天这篇就围…

2026/10/2 22:54:10 阅读更多 →
RF-Adaboost多源工业数据融合分类实战

RF-Adaboost多源工业数据融合分类实战

简介:本资源是一份面向机器学习从业者与进阶初学者的Python集成学习实战项目,聚焦随机森林与AdaBoost融合建模,解决多输入、高噪声场景下的复杂分类任务,尤其适用于金融风控、医疗诊断等对鲁棒性与可解释性要求较高的领域。压缩包…

2026/10/2 22:54:10 阅读更多 →
下班后9小时搞定AI漫剧:从文案到成片的完整实战记录

下班后9小时搞定AI漫剧:从文案到成片的完整实战记录

下班路上刷到一条AI漫剧的热榜,说实话我盯了很久了。这阵子“AI漫剧”“AI短剧”确实有点泛滥,从3分钟反转小剧场到连载条漫动画到处都能刷到,但绝大多数都是专业团队在秀肌肉,动不动就是几十人的AI工作流,普通人看了根…

2026/10/2 22:54:10 阅读更多 →
干货合集:2026年最值得体验的专业AI论文写作工具

干货合集:2026年最值得体验的专业AI论文写作工具

2026年AI论文写作工具已从“基础生成”升级为融合智能分析与学术合规的全流程解决方案,核心评价维度包括文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规等。本次测评覆盖6款主流工具,涵盖中英文写作、全流程与专项功能、免费与付费版本&#x…

2026/10/2 22:54:10 阅读更多 →
AssetBundle热更新安全排查:从CDN清单到本地缓存的全链路校验指南

AssetBundle热更新安全排查:从CDN清单到本地缓存的全链路校验指南

1. 项目概述:一次热更新安全隐患排查的完整复盘 做 Unity 客户端开发的朋友应该都有体会,AssetBundle 热更新方案上线容易,但真正让它长期稳定跑起来,靠的是细节。尤其是当你的游戏量级上来、CDN 节点分叉、本地缓存策略多样化之后…

2026/10/2 22:53:09 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →