前言
本次作业在Jupyter Notebook上操作
内容
1.目的2.背景3.数据源来源4.爬取数据5.数据处理6.可视化7.总结
一,目的
通过python爬取数据并用爬取的实时数据进行了数据清洗和分析,并将河北、北京及全国的疫情确诊和疫情曲线的变化结果数据实现了可视化,通过可视化更能直观的展示疫情的变化。
二,背景
2020年新型冠状病毒肺炎迅速爆发,是近百年来人类遭遇的影响范围最广的全球性大流行病也是对全世界人民一次严重危机和严峻考验。选取北京和河北省为主要分析目标,选择新闻平台的疫情传播数据,对两地疫情发展数据进行爬取及分析,基于python的数据可视化处理。
三,数据源来源
网址:
https://news.qq.com/zt2020/page/feiyan.htm
导入包,获取数据
import time
import json
import requests
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
data=json.loads(requests.get(url=url).json()['data'])
查看数据的所有键
print(data.keys())
dict_keys(['lastUpdateTime', 'chinaTotal', ' chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree'])
比如查看最后一次更新时间,显示2021年5月26日
data['lastUpdateTime']
2021-05-2609:24:26'
四,爬取数据
import requests
import json
import pandas as pd
def getData():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
headers = {
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari
}
r = requests.get(url,headers)
if r.status_code == 200:
return json.loads(r.text)
getData()
五,数据处理
import requests
import json
import pandas as pd
def getData():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
headers = {
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari
}
r = requests.get(url,headers)
if r.status_code == 200:
return json.loads(json.loads(r.text)['data'])
data_dict = getData()
读取字典的键
data_dict.keys()
dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree'])
将数据变成列表再变成dataframe (数据框)
province_list = list()
for province in data_dict.get('areaTree')[0]['children']:
province_info = province['total']
province_info['name'] = province['name']
province_list.append(province_info)
province_df = pd.DataFrame(province_list)
按照数据类型删除列
province_df = province_df.select_dtypes(exclude=['bool'])
查看dataframe(数据框)数据
province_df
安装下面两个包
pip install pyecharts -i https://pypi.douban.com/simple
pip install echarts-china-provinces-pypkg -i https://pypi.douban.com/simple
删除没有用的两列
按照数据类型来删除数据框的列
先查看类型
province_list = list()
for province in data_dict.get('areaTree')[0]['children']:
province_info = province['total']
province_info['name'] = province['name']
province_list.append(province_info)
province_df = pd.DataFrame(province_list)
province_df = province_df.select_dtypes(exclude=['bool'])
province_df.info()
删掉两组布尔值
province_df = province_df.select_dtypes(exclude=['bool'])
province_df
对原数据进行覆盖
province_df = province_df.select_dtypes(exclude=['bool'])
查看现在数据
province_df
六,可视化(确诊人数):先统计全国各省确诊人数,再取任意城市进行分析
我们定义num用来存储爬取的各个省份的总数据
分析每个省份确诊的总人数,定义一个新的字典total_data用来存储各个省份对应的确诊人数
num = data['areaTree'][0]['children']
total_data = {}
for item in num:
if item['name'] not in total_data:
total_data.update({item['name']:0})
for city_data in item['children']:
total_data[item['name']] += int(city_data['total']['confirm'])
print(total_data)
将上面得到的国内各省确诊人数可视化
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['simhei']
names = total_data.keys()
numbers = total_data.values()
plt.figure(figsize=[10,4])
plt.bar(names,numbers)
plt.xlabel("地区", size=12)
plt.ylabel("人数", fontproperties='SimHei', rotation=90, size=12)
plt.title("中国不同省份疫情确诊数对比图", size=16)
plt.xticks(list(names), rotation=90, size=12)
plt.show()
任意选取城市对疫情确诊人数进行分析,以北京市和河北省为例,分析确诊 人数
1-统计北京市各地区疫情各项数据
根据上面的各省份统计图找到北京市在图中所在的位置是第19个,可以通过下面操作获取北京市的疫情数据。
定义并用keys()函数查看beijing中所有的键,可得到名字,今日数据,总数据,省内城市名
beijing=num[18]
beijing.keys(
查看市内城市
beijing['children']
统计北京市各地区确诊人总数
beijing_children_total_data = {}
for item in beijing['children']:
if item['name'] not in beijing_children_total_data:
beijing_children_total_data.update({item['name']:0})
beijing_children_total_data[item['name']] += int(item['total']['confirm'])
print(beijing_children_total_data)
确诊人数可视化:通过上面得到的确诊人数,绘制柱状图,设置x,y轴和标题
bj_names = beijing_children_total_data.keys()
bj_numbers = beijing_children_total_data.values()
plt.figure(figsize=[10,4])
plt.bar(bj_names,bj_numbers)
plt.xlabel("地区", size=12)
plt.ylabel("人数", fontproperties='SimHei', rotation=90, size=12)
plt.title("北京市不同地区疫情确诊数对比图", size=16)
plt.xticks(list(bj_names), rotation=90, size=12)
plt.show()
2.统计河北省各地区疫情各项数据
根据前面的各省份统计图找到河北省在图中所在的位置是第32个,可以通过下面操作获取河北省的疫情数据
定义并用keys()函数查看hebei中所有的键,可得到名字,今日数据,总数据,省内城市名,查看省内城市
hebei=num[31]
hebei.keys()
hebei['children']
统计河北省各市确诊人总数
hebei_children_total_data = {}
for item in hebei['children']:
if item['name'] not in hebei_children_total_data:
hebei_children_total_data.update({item['name']:0})
hebei_children_total_data[item['name']] += int(item['total']['confirm'])
print(hebei_children_total_data)
确诊人数可视化:通过上面得到的确诊人数,绘制柱状图,设置x,y轴和标题
hb_names = hebei_children_total_data.keys()
hb_numbers = hebei_children_total_data.values()
plt.figure(figsize=[10,4])
plt.bar(hb_names,hb_numbers)
plt.xlabel("地区", size=12)
plt.ylabel("人数", fontproperties='SimHei', rotation=90, size=12)
plt.title("河北省内地级市疫情确诊数对比图", size=16)
plt.xticks(list(hb_names), rotation=90, size=12)
plt.show()
七,总结
通过此次设计更加深入了解了python在大数据分析方面的作用。其中一个好处便是,Python提供了大量用于处理大数据的库。就绘制图像而言,可以比其他 任何编程语言更快地使用Python处理大数据并进行绘图。