运用到Python爬虫request库,Excel 的库之一的xlwings,pandas以及Python的地图库pyecharts
首先我们先使用request爬虫:
import time
import requests
import json
import xlwings as xw
# 使用request爬虫进行https://news.qq.com/zt2020/page/feiyan.htm#/获取
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
}
# URL的Json数据
url='https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail,diseaseh5Shelf'
# 获取参数
response = requests.get(url, headers=headers)
# 返回结果的JSON对象,并将数据存储下来
json_data = response.json()['data']['diseaseh5Shelf']['areaTree'][0]['children']
其次我们将获取的数据写入Excel表格并保存下来:
这里精确到各省份、直辖市、自治区、特别行政区。注意保存路径需要修改!
# 打开excel
wb = xw.Book()
# 在excel中建立一个表
sht = wb.sheets('sheet1')
# A1,B1......F1 相当于excel的列名
sht.range('A1').value = '地区'
sht.range('B1').value = '新增确诊人数'
sht.range('C1').value = '治愈人数'
sht.range('D1').value = '死亡人数'
sht.range('E1').value = '现存确诊人数'
sht.range('F1').value = '累计确诊人数'
# 34个省市自治区
for i in range(34):
earth_data = json_data[i]
# 地名
province = earth_data['name']
sht.range(f'A{i + 2}').value = province
# 新增确诊人数
today_confirm = json.dumps(earth_data['today']['confirm'])
sht.range(f'B{i + 2}').value = today_confirm
# 死亡人数
total_dead = json.dumps(earth_data['total']['dead'])
sht.range(f'D{i + 2}').value = total_dead
# 治愈人数
total_heal = json.dumps(earth_data['total']['heal'])
sht.range(f'C{i + 2}').value = total_heal
# 现存确诊人数
total_nowconfirm=json.dumps(earth_data['total']['nowConfirm'])
sht.range(f'E{i + 2}').value = total_nowconfirm
# 累计确诊人数
total_confirm = json.dumps(earth_data['total']['confirm'])
sht.range(f'F{i + 2}').value = total_confirm
# 输出excel表信息
print("地区:" + province, "新增确诊:" + today_confirm,'治愈人数:'+total_heal, "死亡人数:" + total_dead,"现存确诊人数:"+total_nowconfirm, "累计确诊人数:" + total_confirm)
# 保存表格
wb.save('C:/Users/Administrator/Desktop/12121/data1.xlsx')
# 关闭表格
wb.close()
全球上共有236个国家和地区,这里就先分析200个国家,因为数据是中文在世界地图上无法显示。可能有更好的方法解决显示问题目前我还不会,所以用字典来替换了。注意保存路径需要修改!
# 打开excel
wb = xw.Book()
# 在excel中建立一个表
sht = wb.sheets('sheet1')
# A1,B1......F1 相当于excel的列名
sht.range('A1').value = '地区'
sht.range('B1').value = '新增确诊人数'
sht.range('C1').value = '治愈人数'
sht.range('D1').value = '死亡人数'
sht.range('E1').value = '现存确诊人数'
sht.range('F1').value = '累计确诊人数'
# 由于数据较多,采取前200个国家
for i in range(200):
earth_data = json_data[i]
# 因为数据是中文在世界地图上无法显示
dict = {'阿富汗': 'Afghanistan','阿联酋':'United Arab Emirates', '奥兰群岛': 'Aland Islands', '阿尔巴尼亚': 'Albania',
'阿尔及利亚': 'Algeria', '美属萨摩亚': 'American Samoa', '安道尔': 'Andorra', '安哥拉': 'Angola', '安圭拉': 'Anguilla',
'安提瓜和巴布达': 'Antigua and Barbuda', '阿根廷': 'Argentina', '亚美尼亚': 'Armenia', '阿鲁巴': 'Aruba', '澳大利亚': 'Australia',
'奥地利': 'Austria', '阿塞拜疆': 'Azerbaijan','波黑':'Bosnia-Herzegovina', '孟加拉': 'Bangladesh', '巴林': 'Bahrain', '巴哈马': 'Bahamas', '巴巴多斯': 'Barbados',
'白俄罗斯': 'Belarus', '比利时': 'Belgium', '伯利兹': 'Belize', '贝宁': 'Benin', '百慕大': 'Bermuda',
'不丹': 'Bhutan', '玻利维亚': 'Bolivia', '波斯尼亚和黑塞哥维那': 'Bosnia and Herzegovina', '博茨瓦纳': 'Botswana',
'布维岛': 'Bouvet Island', '巴西': 'Brazil', '文莱': 'Brunei', '保加利亚': 'Bulgaria', '布基纳法索': 'Burkina Faso',
'布隆迪': 'Burundi', '柬埔寨': 'Cambodia', '喀麦隆': 'Cameroon', '加拿大': 'Canada', '佛得角': 'Cape Verde',
'中非': 'Central African Republic', '乍得': 'Chad', '智利': 'Chile', '圣诞岛': 'Christmas Islands', '库拉索':'Curacao',
'科科斯(基林)群岛': 'Cocos (keeling) Islands', '哥伦比亚': 'Colombia', '科摩罗': 'Comoros', '刚果(金)': 'Congo (Congo-Kinshasa)',
'刚果': 'Congo', '库克群岛': 'Cook Islands', '哥斯达黎加': 'Costa Rica', '科特迪瓦': 'Cote D’Ivoire', '中国': 'China',
'克罗地亚': 'Croatia', '古巴': 'Cuba', '捷克': 'Czech', '塞浦路斯': 'Cyprus', '丹麦': 'Denmark', '吉布提': 'Djibouti',
'多米尼加': 'Dominica', '东帝汶': 'Timor-Leste', '厄瓜多尔': 'Ecuador', '埃及': 'Egypt', '赤道几内亚': 'Equatorial Guinea',
'厄立特里亚': 'Eritrea', '爱沙尼亚': 'Estonia', '埃塞俄比亚': 'Ethiopia', 'Faeroe Islands':'Faroe Islands', '斐济': 'Fiji',
'芬兰': 'Finland', '法国': 'France', '法国大都会': 'Franch Metropolitan', '法属圭亚那': 'Franch Guiana','法属瓜德罗普岛':'Faguadeloupe Island',
'法属波利尼西亚': 'French Polynesia', '加蓬': 'Gabon', '冈比亚': 'Gambia', '格鲁吉亚': 'Georgia', '德国': 'Germany',
'加纳': 'Ghana', '直布罗陀': 'Gibraltar', '希腊': 'Greece', '格林纳达': 'Grenada', '瓜德罗普岛': 'Guadeloupe',
'关岛': 'Guam', '危地马拉': 'Guatemala', '根西岛': 'Guernsey', '几内亚比绍': 'Guinea-Bissau', '几内亚': 'Guinea',
'圭亚那': 'Guyana', '香港 (中国)': 'Hong Kong', '海地': 'Haiti', '洪都拉斯': 'Honduras', '匈牙利': 'Hungary',
'冰岛': 'Iceland', '印度': 'India', '印度尼西亚': 'Indonesia', '伊朗': 'Iran', '伊拉克': 'Iraq', '爱尔兰': 'Ireland',
'马恩岛': 'Isle of Man', '以色列': 'Israel', '意大利': 'Italy', '牙买加': 'Jamaica', '日本': 'Japan', '泽西岛': 'Jersey',
'约旦': 'Jordan', '哈萨克斯坦': 'Kazakhstan', '肯尼亚': 'Kenya', '基里巴斯': 'Kiribati', '韩国': 'Korea (South)',
'朝鲜': 'Korea (North)', '科威特': 'Kuwait', '吉尔吉斯斯坦': 'Kyrgyzstan', '老挝': 'Laos', '拉脱维亚': 'Latvia', '黎巴嫩': 'Lebanon',
'莱索托': 'Lesotho', '利比里亚': 'Liberia', '利比亚': 'Libya', '列支敦士登': 'Liechtenstein', '立陶宛': 'Lithuania',
'卢森堡': 'Luxembourg', '澳门(中国)': 'Macau', '马其顿': 'Macedonia', '马拉维': 'Malawi', '马来西亚': 'Malaysia','马约特岛':'Mayotte i',
'马达加斯加': 'Madagascar', '马尔代夫': 'Maldives', '马里': 'Mali', '马耳他': 'Malta', '马绍尔群岛': 'Marshall Islands',
'马提尼克岛': 'Martinique', '毛里塔尼亚': 'Mauritania', '毛里求斯': 'Mauritius', '马约特': 'Mayotte', '墨西哥': 'Mexico',
'密克罗尼西亚': 'Micronesia', '摩尔多瓦': 'Moldova', '摩纳哥': 'Monaco', '蒙古': 'Mongolia', '黑山': 'Montenegro',
'蒙特塞拉特': 'Montserrat', '摩洛哥': 'Morocco', '莫桑比克': 'Mozambique', '缅甸': 'Myanmar', '纳米比亚': 'Namibia',
'瑙鲁': 'Nauru', '尼泊尔': 'Nepal', '荷兰': 'Netherlands', '新喀里多尼亚': 'New Caledonia', '新西兰': 'New Zealand', '北马其顿':'Northern Macedonia',
'尼加拉瓜': 'Nicaragua', '尼日尔': 'Niger', '尼日利亚': 'Nigeria', '纽埃': 'Niue', '诺福克岛': 'Norfolk Island', '挪威': 'Norway',
'阿曼': 'Oman', '巴基斯坦': 'Pakistan', '帕劳': 'Palau', '巴勒斯坦': 'Palestine', '巴拿马': 'Panama',
'巴布亚新几内亚': 'Papua New Guinea', '巴拉圭': 'Paraguay', '秘鲁': 'Peru', '菲律宾': 'Philippines',
'皮特凯恩群岛': 'Pitcairn Islands', '波兰': 'Poland', '葡萄牙': 'Portugal', '波多黎各': 'Puerto Rico', '卡塔尔': 'Qatar',
'留尼汪': 'Reunion', '罗马尼亚': 'Romania', '卢旺达': 'Rwanda', '俄罗斯联邦': 'Russian Federation',
'俄罗斯':'Russia','俄罗斯':'Russia','圣赫勒拿': 'Saint Helena','圣大巴巴拉群岛':'Santa barbara islands',
'圣基茨和尼维斯': 'Saint Kitts-Nevis', '圣卢西亚': 'Saint Lucia', '圣文森特和格林纳丁斯': 'Saint Vincent and the Grenadines',
'萨尔瓦多': 'El Salvador', '萨摩亚': 'Samoa', '圣马力诺': 'San Marino', '圣多美和普林西比': 'Sao Tome and Principe',
'沙特阿拉伯': 'Saudi Arabia', '塞内加尔': 'Senegal', '塞舌尔': 'Seychelles', '塞拉利昂': 'Sierra Leone', '新加坡': 'Singapore',
'塞尔维亚': 'Serbia', '斯洛伐克': 'Slovakia', '斯洛文尼亚': 'Slovenia', '所罗门群岛': 'Solomon Islands', '索马里': 'Somalia',
'南非': 'South Africa', '西班牙': 'Spain', '斯里兰卡': 'Sri Lanka', '苏丹': 'Sudan', '苏里南': 'Suriname', '斯威士兰': 'Swaziland',
'瑞典': 'Sweden', '瑞士': 'Switzerland', '叙利亚': 'Syria', '塔吉克斯坦': 'Tajikistan', '坦桑尼亚': 'Tanzania',
'台湾 (中国)': 'Taiwan', '泰国': 'Thailand', '特立尼达和多巴哥': 'Trinidad and Tobago', '多哥': 'Togo',
'托克劳': 'Tokelau', '汤加': 'Tonga', '突尼斯': 'Tunisia', '土耳其': 'Turkey', '土库曼斯坦': 'Turkmenistan',
'图瓦卢': 'Tuvalu', '乌干达': 'Uganda', '乌克兰': 'Ukraine', '阿拉伯联合酋长国': 'United Arab Emirates', '英国': 'United Kingdom',
'美国': 'United States', '乌拉圭': 'Uruguay', '乌兹别克斯坦': 'Uzbekistan', '瓦努阿图': 'Vanuatu', '梵蒂冈': 'Vatican City',
'委内瑞拉': 'Venezuela', '越南': 'Vietnam', '瓦利斯群岛和富图纳群岛': 'Wallis and Futuna', '西撒哈拉': 'Western Sahara',
'也门': 'Yemen', '南斯拉夫': 'Yugoslavia', '赞比亚': 'Zambia', '津巴布韦': 'Zimbabwe','Isle of Man':'Isle of Man',
'刚果(布)':'Congo-Brazzaville','开曼群岛(英属)':'Cayman Islands (British)','南苏丹':'South Sudan','列支敦士登公国':'Principality of Liechtenstein',
'中非共和国':'Central African Republic','多米尼克':'Dominica','格陵兰':'Greenland','圣马丁岛(法属)':'Saint Martin (French)','圣马丁岛':'Saint Martin',
'库拉索岛':'Curacao i','Tonga':'Tonga'}
# 地名
province = earth_data['name']
province = dict[province]
sht.range(f'A{i + 2}').value = province
# 新增确诊人数
today_confirm = json.dumps(earth_data['confirmAdd'])
sht.range(f'B{i + 2}').value = today_confirm
# 治愈人数
total_dead = json.dumps(earth_data['dead'])
sht.range(f'D{i + 2}').value = total_dead
# 死亡人数
total_heal = json.dumps(earth_data['heal'])
sht.range(f'C{i + 2}').value = total_heal
# 现存确诊人数
total_nowconfirm=json.dumps(earth_data['nowConfirm'])
sht.range(f'E{i + 2}').value = total_nowconfirm
# 累计确诊人数
total_confirm = json.dumps(earth_data['confirm'])
sht.range(f'F{i + 2}').value = total_confirm
# 输出excel表信息
print("地区:" + province, "新增确诊人数:" + today_confirm,'治愈人数'+total_heal, "死亡人数:" + total_dead,"现存确诊人数:"+total_nowconfirm, "累计确诊人数:" + total_confirm)
# 保存表格
wb.save('C:/Users/Administrator/Desktop/12121/data2.xlsx')
# 关闭表格
wb.close()
数据集准备完毕了,接下来可以开始数据分析了。
首先导入数据,再将数据转为列表,其次画图,图有现存确诊人数、新增确诊人数、累计确诊人数、治愈人数、死亡人数都是可以互动的不想看哪条可以在图表的顶端点击隐藏,最后通过render_notebook()方法打印出来。
import pandas
from pyecharts.charts import Map, Geo
from pyecharts import options as opts
# 导入数据
data = pandas.read_excel(r'data1.xlsx', sheet_name='Sheet1')
# 将数据转换为二元的列表
list1 = list(zip(data['地区'],data['现存确诊人数']))
list2 = list(zip(data['地区'],data['新增确诊人数']))
list3 = list(zip(data['地区'],data['累计确诊人数']))
list4 = list(zip(data['地区'],data['治愈人数']))
list5 = list(zip(data['地区'],data['死亡人数']))
# 创建一个地图对象
map_1 = Map() # 对全局进行设置
map_1.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(title="全国疫情地图"), visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
pieces=[
{"min": 1000, "label": '>10000人', # 不指定 max,表示 max 为无限大(Infinity)因为人数是不断扩大的(不定数)
"color": "#6F171F"},
{"min": 5000, "max": 10000,
"label": '5000-10000人',
"color": "#C92C34"},
{"min": 1000, "max": 4999,
"label": '1000-4999人',
"color": "#E35B52"},
{"min": 100, "max": 999,
"label": '100-999人',
"color": "#F39E86"},
{"min": 10, "max": 99,
"label": '10-99人',
"color": "pink"},
{"min": 1, "max": 9,
"label": '1-9人',
"color": "#FDEBD0"}]))
map_1.add("现存确诊人数",list1, maptype="china",is_map_symbol_show = True)
map_1.add("新增确诊人数",list2, maptype="china",is_map_symbol_show = True)
map_1.add("累计确诊人数",list3, maptype="china",is_map_symbol_show = True)
map_1.add("治愈人数",list4, maptype="china",is_map_symbol_show = True)
map_1.add("死亡人数",list5, maptype="china",is_map_symbol_show = True)
# 地图创建完成后,通过render_notebook()方法打印出来
map_1.render_notebook()
这里设置在当前目录下生成,也可以把路径改成想要生成的路径
# 地图创建完成后,通过render()方法可以将地图渲染为html
map_1.render('全国各省疫情地图.html')
和国内分析同理
首先导入数据,再将数据转为列表,其次画图,图有现存确诊人数、新增确诊人数、累计确诊人数、治愈人数、死亡人数都是可以互动的不想看哪条可以在图表的顶端点击隐藏,最后通过render_notebook()方法打印出来。
import pandas
from pyecharts.charts import Map, Geo
from pyecharts import options as opts
# 导入数据
data = pandas.read_excel(r'data2.xlsx', sheet_name='Sheet1')
# 将数据转换为二元的列表
list1 = list(zip(data['地区'],data['现存确诊人数']))
list2 = list(zip(data['地区'],data['新增确诊人数']))
list3 = list(zip(data['地区'],data['累计确诊人数']))
list4 = list(zip(data['地区'],data['治愈人数']))
list5 = list(zip(data['地区'],data['死亡人数']))
# 创建一个地图对象
map_1 = Map() # 对全局进行设置
map_1.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(title="全球疫情地图"), visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
pieces=[
{"min": 10000000, "label": '>10000000人', # 不指定 max,表示 max 为无限大(Infinity)因为人数是不断扩大的(不定数)
"color": "#6F171F"},
{"min": 5000000, "max": 10000000,
"label": '5000000-10000000人',
"color": "#C92C34"},
{"min": 1000000, "max": 4999999,
"label": '1000000-4999999人',
"color": "#E35B52"},
{"min": 100000, "max": 999999,
"label": '100000-999999人',
"color": "#F39E86"},
{"min": 1000, "max": 99999,
"label": '1000-99999人',
"color": "pink"},
{"min": 1, "max": 999,
"label": '1-999人',
"color": "#FDEBD0"}]))
map_1.add("现存确诊人数",list1, maptype="world",is_map_symbol_show = True)
map_1.add("新增确诊人数",list2, maptype="world",is_map_symbol_show = True)
map_1.add("累计确诊人数",list3, maptype="world",is_map_symbol_show = True)
map_1.add("治愈人数",list4, maptype="world",is_map_symbol_show = True)
map_1.add("死亡人数",list5, maptype="world",is_map_symbol_show = True)
# 地图创建完成后,通过render_notebook()方法打印出来
map_1.render_notebook()
这里设置在当前目录下生成,也可以把路径改成想要生成的路径
# 地图创建完成后,通过render()方法可以将地图渲染为html
map_1.render('全球疫情地图.html')
这么酷的数据分析不推推吗?
若有问题或者建议下方留言,创作不易只求给个三连吧!