随着新冠疫情的爆发,疫情数据的统计和呈现变得异常重要。一些数字化技术如大数据、人工智能等,得到大量应用。在这些技术中,数据可视化成为疫情防控中非常重要的一环。Python作为一门热门的编程语言,被广泛应用于数据爬取和可视化。下面,我们将主要介绍如何使用Python爬虫和地图包实现一个疫情的可视化地图。
1. 爬取疫情数据
我们可以使用Python中的request库获取网页上的数据。除此之外,还可以用beautifulsoup库对网页结构化的解析,方便获取数据。下面是一个简单的例子:
```
import requests
from bs4 import BeautifulSoup
url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia_peopleapp?from=timeline&isappinstalled=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
}
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text, 'html.parser')
items = soup.find_all('script', attrs={'id': 'getAreaStat'})
```
上面的代码通过请求一个网站并解析出相应的HTML页面,得到了疫情第一手的信息数据。这样,我们就成功地将网页上的信息爬取下来了。
2. 数据清洗和提取
成功获取页面数据之后,需要把数据进行清洗并提取出我们需要的数据,下面通过Pandas库来完成我们的数据清洗和整理工作。安装完Pandas库之后,我们就可以用它来处理我们的数据。
```
import pandas as pd
contents = items[0].contents[0]
import json
data = json.loads(contents.replace('try { window.getAreaStat = ', '').replace('}catch(e){}', ''))
pd_data = pd.DataFrame(data)
```
首先,我们把获取到的HTML文件解析成一个字符串;
然后,通过使用json库的loads方法,将字符串转换成了原始的列表对象;
接下来,将列表对象封装到DataFrame对象中。
3. 我们将数据写入文件
```
pd_data.to_csv('./data.csv', index=False)
```
4. 我们可以对数据进行分析和可视化
```
import echarts_countries_pypkg
echarts_countries_pypkg.add()
from echarts import Echart, Legend, Pie, Tooltip, Map
d = pd.read_csv('./data.csv')
confirmed = d.sum()['confirmedCount']
suspected = d.sum()['suspectedCount']
cures = d.sum()['curedCount']
deaths = d.sum()['deadCount']
data = [('确诊病例', confirmed), ('疑似病例', suspected),
('治愈病例', cures), ('死亡病例', deaths)]
chart = Pie('COVID-19 各类占比', '数据来源:丁香园')
# 设置图表背景颜色和尺寸
chart.use_theme('shine').width = 1200
# 添加数据
chart.add('', data)
chart
```
- 运行之后,就可以看到一个圆形饼状图,这张图形直观反映了确诊、疑似、治愈及死亡病例数量的占比。
5. Python实现全国地理信息数据可视化的实例代码:
```
# -*- coding:utf-8 -*-
'''
file: map.py
usage: Show nCov data on China's map
author: lvah ding
datetime: 2020/2/3 10:33
'''
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
import pandas as pd
import json
def get_city_code(name) -> str:
'''
Get city code by its full name, return None if not found
'''
for item in city_code:
if name in item['name']:
return item['code']
return None
def parse_data(filename: str):
with open(filename, 'r', -1, encoding='utf8') as f:
data = json.load(f)
rows = []
for province in data:
if '其他' in province['provinceShortName']:
continue
rows.append({'name': province['provinceShortName'], 'value': province['confirmedCount']})
for city in province['cities']:
code = get_city_code(city['cityName'])
if not code:
continue
rows.append({'name': code, 'value': city['confirmedCount']})
return rows
geo_file = './geography.json' # 地图数据文件
code_file = './city_code.json' # 城市代码文件
data_file = './data.csv' # 源数据文件
with open(geo_file, 'r', encoding='utf8') as f:
geo_data = json.load(f)
with open(code_file, 'r', encoding='utf8') as f:
city_code = json.load(f)
data = parse_data(data_file)
map = Map(init_opts = opts.InitOpts(width = '1200px', height = '800px'))
map.set_global_opts(title_opts = opts.TitleOpts(title = 'nCov Confirmed Cases Map'),
visualmap_opts = opts.VisualMapOpts(min_ = 0, max_ = 2000, is_piecewise = True),
legend_opts = opts.LegendOpts(is_show = False))
map.add('确诊数', data_pair = data, maptype = 'china', zoom = 1.2, is_roam = False, is_map_symbol_show = False, label_opts = opts.LabelOpts(is_show = True))
# map.render_notebook()
map.render('nCov_Confirmed_Cases_China.html') # html file will be stored in the same path of your script
```
在上面的代码中,我们引入了pyecharts这个包来渲染地图。我们采用了一个json格式的地理信息数据文件,这个文件可以在pyecharts的项目中找到。同样,我们还需要一个包含各个城市代码及名称的文件,我们在China-City-List项目中找到了这个文件,以便我们统计每个城市的确诊人数。还有一个包含疫情数据的CSV表格,我们通过刚刚提到的Pandas工具来提取其中的重要信息。
6. 总结
通过以上对Python爬虫和数据可视化的介绍,我们可以清楚地了解如何使用Python技术来实现疫情数据的爬取、处理以及可视化。这不仅为疫情防控提供了方便,同时也为我们深化理解Python语言和程序设计提供了很好的练习机会。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复