详细介绍:2020年美国新冠肺炎疫情数据分析与可视化

news/2025/10/19 16:14:42/文章来源:https://www.cnblogs.com/lxjshuju/p/19150988

数据分析与可视化

做实验之前,请先安装Hadoop和Spark环境
本文以Python为编程语言,涉及Spark数据分析,HDFS存储文件,以及pyecharts数据可视化。

一:实验环境

(1)Linux:Ubuntu 16.04
(2)Hadoop3.1.3
(3)Python: 3.8
(4)Spark: 2.4.0
(5)Jupyter Notebook

此实验运行在伪分布式的Hadoop环境中,并使用Spark local模式提交作业

二:数据集下载

数据集来自数据网站Kaggle的美国新冠肺炎疫情数据集,该数据集以数据表us-counties.csv组织,其中包含了美国(2020-01-21 ~ 2020-05-19)的相关数据158981万条。
数据包含以下字段:

字段名称 字段含义 例子
date 日期 2020/1/21,2020/1/22 …
county 区县(州的下一级单位)Snohomish
state 州 Washington,California
cases 截止该日期该区县的累计确诊人数 1,2,3…
deaths 截止该日期该区县的累计确诊人数 1,2,3…
2020年美国新冠数据部分

为了使spark方便读入数据,这里先将数据转化为.txt文件在上传到Hadoop的HDFS文件系统上
转换代码如下:

import pandas as pd
#.csv->.txt
data = pd.read_csv('us-counties.csv')
with open('us-counties.txt','a+',encoding='utf-8') as f:
for line in data.values:
f.write((str(line[0])+'\t'+str(line[1])+'\t'
+str(line[2])+'\t'+str(line[3])+'\t'+str(line[4])+'\n'))

假设代码和文件在同一目录下,并使用\t作为分隔符

之后将文件上传到Hadoop上 /usr/hadoop/
操作命令如下:
./bin/hdfs dfs -put /home/hadoop/Downloads/us-counties.txt /user/hadoop
将文件上传到Hadoop

三:使用Spark对数据进行分析

根据数据的情况统计6个指标

  1. 统计美国截止每日的累计确诊人数和累计死亡人数。做法是以date作为分组字段,对cases和deaths字段进行汇总统计。
  2. 统计美国每日的新增确诊人数和新增死亡人数。因为新增数=今日数-昨日数,所以考虑使用自连接,连接条件是t1.date = t2.date + 1,然后使用t1.totalCases – t2.totalCases计算该日新增。
  3. 统计截止5.19日,美国各州的累计确诊人数和死亡人数。首先筛选出5.19日的数据,然后以state作为分组字段,对cases和deaths字段进行汇总统计。
  4. 统计截止5.19日,美国确诊人数最多的十个州。对3)的结果DataFrame注册临时表,然后按确诊人数降序排列,并取前10个州。
  5. 统计截止5.19日,美国死亡人数最多的十个州。对3)的结果DataFrame注册临时表,然后按死亡人数降序排列,并取前10个州。
  6. 统计截止5.19日,全美和各州的病死率。病死率 = 死亡数/确诊数,对3)的结果DataFrame注册临时表,然后按公式计算。

首先对数据进行加载,使用spark读取源文件生成DataFrame,并创建临时表以方便进行后续分析实现。

from pyspark import SparkConf,SparkContext
from pyspark.sql import Row
from pyspark.sql.types import *
from pyspark.sql import SparkSession
from datetime import datetime
import pyspark.sql.functions as func
def toDate(inputStr):
newStr = ""
if len(inputStr) == 8:
s1 = inputStr[0:4]
s2 = inputStr[5:6]
s3 = inputStr[7]
newStr = s1+"-"+"0"+s2+"-"+"0"+s3
else:
s1 = inputStr[0:4]
s2 = inputStr[5:6]
s3 = inputStr[7:]
newStr = s1+"-"+"0"+s2+"-"+s3
date = datetime.strptime(newStr, "%Y-%m-%d")
return date
#主程序:
spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
fields = [StructField("date", DateType(),False),StructField("county", StringType(),False),StructField("state", StringType(),False),
StructField("cases", IntegerType(),False),StructField("deaths", IntegerType(),False),]
schema = StructType(fields)
rdd0 = spark.sparkContext.textFile("/user/hadoop/us-counties.txt")
rdd1 = rdd0.map(lambda x:x.split("\t")).map(lambda p: Row(toDate(p[0]),p[1],p[2],int(p[3]),int(p[4])))
shemaUsInfo = spark.createDataFrame(rdd1,schema)
shemaUsInfo.createOrReplaceTempView("usInfo")

接下来对6个指标进行数据分析

#1.计算每日的累计确诊病例数和死亡数
df = shemaUsInfo.groupBy("date").agg(func.sum("cases"),func.sum("deaths")).sort(shemaUsInfo["date"].asc())
#列重命名
df1 = df.withColumnRenamed("sum(cases)","cases").withColumnRenamed("sum(deaths)","deaths")
df1.repartition(1).write.json("result1.json")
#注册为临时表供下一步使用
df1.createOrReplaceTempView("ustotal")
#2.计算每日较昨日的新增确诊病例数和死亡病例数
df2 = spark.sql("select t1.date,t1.cases-t2.cases as caseIncrease,t1.deaths-t2.deaths as deathIncrease from ustotal t1,ustotal t2 where t1.date = date_add(t2.date,1)")
df2.sort(df2["date"].asc()).repartition(1).write.json("result2.json")
#3.统计截止5.19日 美国各州的累计确诊人数和死亡人数
df3 = spark.sql("select date,state,sum(cases) as totalCases,sum(deaths) as totalDeaths,round(sum(deaths)/sum(cases),4) as deathRate from usInfo  where date = to_date('2020-05-19','yyyy-MM-dd') group by date,state")
df3.sort(df3["totalCases"].desc()).repartition(1).write.json("result3.json")
# 接下来几个分析都需要用到df3分析的结果,所以将df3也创建视图
df3.createOrReplaceTempView("eachStateInfo")
#4.找出美国确诊最多的10个州
df4 = spark.sql("select date,state,totalCases from eachStateInfo  order by totalCases desc limit 10")
df4.repartition(1).write.json("result4.json")
#5.找出美国死亡最多的10个州
df5 = spark.sql("select date,state,totalDeaths from eachStateInfo  order by totalDeaths desc limit 10")
df5.repartition(1).write.json("result5.json")
#6.统计截止5.19全美和各州的病死率
df6 = spark.sql("select 1 as sign,date,'USA' as state,round(sum(totalDeaths)/sum(totalCases),4) as deathRate from eachStateInfo group by date union select 2 as sign,date,state,deathRate from eachStateInfo").cache()
df6.sort(df6["sign"].asc(),df6["deathRate"].desc()).repartition(1).write.json("result6.json")

着重对第六个分析代码进行解释

  1. 第一部分(计算全美整体病死率)
select
1 as sign,  -- 标记为“全国数据”(用于后续排序)
date,       -- 日期(固定为2020-05-19)
'USA' as state,  -- 州名固定为'USA',代表全国
-- 计算全国病死率:总死亡数/总确诊数,保留4位小数
round(sum(totalDeaths)/sum(totalCases),4) as deathRate
from eachStateInfo
group by date  -- 按日期分组
  1. 第二部分(引用各州已计算的病死率)
select
2 as sign,  -- 标记为“州数据”(用于后续排序)
date,       -- 日期(固定为2020-05-19)
state,      -- 州名(如California、New York等)
deathRate   -- 各州病死率(直接复用第3步计算的deathRate)
from eachStateInfo
  1. union 的作用:合并结果
    union 将 “全美整体数据” 和 “各州数据” 合并为一个 DataFrame,结构如下:
signdatestatedeathRate
12020-05-19USA0.0523(全美整体)
22020-05-19NewYork0.0612(纽约州)
22020-05-19California0.0389(加州)

sign 字段的核心作用:
sign 是自定义的 “标记字段”,用于后续排序:

  • sign=1 代表 “全国数据”,sign=2 代表 “州数据”。
  • 后续 df8.sort(df8[“sign”].asc(),df8[“deathRate”].desc()) 会先按 sign 升序(确保全国数据排在最前面),再按 deathRate降序(各州按病死率从高到低排列),最终结果更符合阅读习惯(先看整体,再看各州排序)。

运行结果展示
代码运行过程展示

执行完成会在/user/hadoop/目录下生成六个文件夹
结果展示

四:数据可视化

采用脚本方式将Hadoop中HDFS上的数据保存到本地,然后进行数据可视化分析

#!/bin/bash
# 定义本地根目录(最终结果会保存在这里的result1-6子目录)
LOCAL_ROOT="/home/hadoop/results"
# 定义HDFS根路径(存放result1.json到result6.json的目录)
HDFS_ROOT="/user/hadoop"
# 循环处理result1到result6
for i in {1..6}; do
# 定义当前循环的HDFS源路径和本地目标路径
HDFS_PATH="${HDFS_ROOT}/result${i}.json/*.json"
LOCAL_PATH="${LOCAL_ROOT}/result${i}"
echo "开始处理result${i}..."
# 创建本地目录(-p确保父目录存在,已存在则不报错)
mkdir -p "${LOCAL_PATH}"
# 从HDFS复制文件到本地
hdfs dfs -get "${HDFS_PATH}" "${LOCAL_PATH}/"
# 检查命令是否执行成功
if [ $? -eq 0 ]; then
echo "result${i} 成功保存到 ${LOCAL_PATH}"
else
echo "警告:result${i} 复制失败,请检查HDFS路径是否存在"
fi
done
echo "所有操作执行完毕"

将数据保存到本地
可视化部分代码展示
双柱状图
可视化部分图表展示
在这里插入图片描述
象牙塔图
折线图

再次说明:由于条件有限,为了完成本实验,在基于伪分布的Hadoop环境,使用Spark Local模式运行代码,条件允许同学的可以搭建分布式Hadoop环境,使用standalone模式进行数据分析
实验参考:2020年美国新冠肺炎疫情数据分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/940412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java流程控制。

用户交互Scanner之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是Java5 的新特征,我们可以通过Scanner 类来获取用户的输入…

mysql嵌套查询如何利用索引?

SELECT foreach_id FROM zyp_作业计划 where jtPlanKey = 2000000507162 --jtPlanKey 为主键 ,int64类型,foreach_id 为varcharSELECT OnLineVidio FROM jobbill where foreach_id =‘731221717606469’ …

Misaka2298 的写题自检表

数据范围看了吗?会爆 int 吗?会爆 longlong 吗? debug 删完了吗? freopen 写了吗? 题目真的读懂了吗?数据范围有漏看吗? 有时间写对拍吗?对拍好写吗?是应该继续冲还是应该写拍子呢? 会爆内存吗?检查空间占用…

解码Linux文件IO之LCD屏原理及应用

LCD 基本概念与结构 核心定义 LCD(Liquid Crystal Display)即液晶显示器,核心是通过液晶分子的电光效应控制光线透过,结合光学组件实现图像显示。其基本构造是在两片平行玻璃基板间夹着液晶盒,关键组件分工如下:…

2025年扑灭司林厂家推荐排行榜,高效环保扑灭司林,专业生产与市场口碑深度解析!

2025年扑灭司林厂家推荐排行榜:高效环保扑灭司林,专业生产与市场口碑深度解析随着环保意识的不断增强,高效环保的扑灭司林产品越来越受到市场的青睐。扑灭司林作为一种重要的农药成分,在农业、林业以及公共卫生领域…

微信小程序入门学习教程,从入门到精通,WXML(WeiXin Markup Language)语法基础(8) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 中 NullPointerException 的 3 个常见原因及解决

空指针是 Java 最常见异常,主要因 “调用了 null 对象的方法 / 属性”,常见场景:​ 对象没初始化就用(如User u = null; u.getName()),解决:先u = new User();​ 方法返回 null 没判断(如String s = getStrin…

Java 方法参数传递:到底是值传递还是引用传递?

结论:只有值传递!很多人误解引用类型是 “引用传递”,其实是传递了 “引用的副本(地址值)”。​ 比如传 int 时,复制值给方法参数,修改参数不影响原变量;传对象时,复制地址给参数,若修改参数指向的对象内容(…

ES6 箭头函数

引言ES6 箭头函数(=>)彻底改变了 JavaScript 的编码风格,提供简洁语法和词法作用域绑定。但不当使用可能引发意外行为,本文将揭示其核心特性和避坑指南。1. 词法绑定 this:告别 bind 箭头函数继承外层 this,解决…

centos 7.9快速部署ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统用于信息收集

github项目地址:https://github.com/honmashironeko/ARL-docker #感谢项目作者做出的贡献如果git下载不了,下载zip包 通过网盘分享的文件:ARL-docker-main.zip 链接: https://pan.baidu.com/s/1lF3EBWCkJHjW0P9Irf…

3 分钟搞懂 Java 中 this 关键字的用法

Java 里 this 常被初学者忽略,其实就两个核心作用:一是区分成员变量和局部变量,比如构造方法中this.name = name,避免变量名冲突;二是调用本类其他构造方法,用this(参数)在构造方法首行调用,减少重复代码。​ 示…

折腾笔记[32]-windows部署vscode-server及使用命令行编译c#.net工程

工控机windows双击exe一键运行vscode-server及使用命令行编译c#.net工程.摘要 工控机windows双击exe一键运行vscode-server及使用命令行编译c#.net工程. 1. 一键运行code-server 下载地址:[https://gitee.com/David-Co…

Java 中 ArrayList 和 LinkedList 的选择技巧

日常开发选集合常纠结,记住两个关键场景:​ 若频繁做 “查询”(比如get(index)),选 ArrayList,底层数组支持随机访问,速度快;若频繁做 “增删”(尤其是中间位置),选 LinkedList,底层链表只需改指针,不用像…

Java 静态方法为什么不能访问非静态成员?

很多人疑惑静态方法里调非静态变量会报错,核心原因是 “加载时机不同”:静态成员(方法 / 变量)在类加载时就初始化,属于 “类级别的资源”;非静态成员要等创建对象后才存在,属于 “对象级别的资源”。​ 就像没…

ES6 箭头函数:告别 `this` 的困扰

ES6 箭头函数:告别 this 的困扰 引言ES6 箭头函数(=>)不仅是语法糖,更解决了 JavaScript 中 this 绑定的核心痛点。本文将揭示其四大实战价值,助你写出更简洁可靠的代码。1. 极简语法:告别 function 冗余 单参…

2025润滑油厂家推荐:三特石化全合成长效发动机油,品质卓越!

2025润滑油厂家推荐:三特石化全合成长效发动机油,品质卓越!随着工业和汽车行业的快速发展,对润滑油的需求不断增加。润滑油作为机械设备运行的重要保障,其质量和性能直接影响到设备的使用寿命和工作效率。本文将深…

Java 类与对象实践:从代码验证到四则运算开发

Java类与对象实践:从代码验证到四则运算开发 在学习Java类与对象后,通过代码验证课件知识点、完成四则运算开发,能更深入理解面向对象编程思想。以下是我在实践过程中的详细记录,包含知识点验证、问题解决及项目开…

2025手持光谱仪厂家推荐:一诺机电精准分析,便携高效检测首选!

2025手持光谱仪厂家推荐:一诺机电精准分析,便携高效检测首选!随着科技的不断进步,手持光谱仪/光谱分析仪/便携式光谱仪在矿石/元素分析、合金/金属/不锈钢/铝合金、贵金属、三元催化等领域的应用越来越广泛。然而,…

HTML5中常用的布局语义标签

块元素(block element)在页面中,块元素独占一行; 在网页中一般通过块元素来对页面进行布局。 块元素中可以放块元素和行内元素。 行内元素(inline element)在页面中,行内元素不能独占一行;行内元素主要用来包裹…

Jupyter直接转pdf

需要安装Jupyter nbconvert 中文 PDF 模板(github地址 https://github.com/AllanChain/nb-tmpl-ctex,点个免费的星星吧) Chinese LaTeX/PDF template for Jupyter notebook nbconvert using CTeX. 安装 pip install…