| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 新冠数据爬取以及分析Python -> 正文阅读 |
|
[人工智能]新冠数据爬取以及分析Python |
在新型冠状病毒感染的肺炎疫情牵动社会人心的关键时刻,利用数据分析、数据挖掘、机器学习相关方法,围绕疫情态势展示、疫情走势预测进行分析,挖掘复杂异构多源数据之间的关联关系,以形象生动的方式呈现出来。 其中数据来源于腾讯疫情,具体网址为:实时更新:新冠肺炎疫情最新动态
1)工具选择在这次的作业中本人选择的可视化工具为python(pyCharm),选择该工具主要有以下原因: Python在数据分析和交互、探索性计算以及数据可视化等方面都显得比较活跃,这就是Python作为数据分析的原因之一,python拥有numpy、matplotlib、scikit-learn、pandas、ipython等工具在科学计算方面十分有优势,尤其是pandas,在处理中型数据方面可以说有着无与伦比的优势,已经成为数据分析中流砥柱的分析工具。 Python也具有强大的编程能力,这种编程语言不同于R或者matlab,python有些非常强大的数据分析能力,并且还可以利用Python进行爬虫,写游戏,以及自动化运维,在这些领域中有着很广泛的应用,这些优点就使得一种技术去解决所有的业务服务问题,这就充分的体现的Python有利于各个业务之间的融合。 2)可视化方案
使用python爬取网站上的全国各地、美国、全球的疫情数据,对数据进行清洗和处理后分别导成Excel表格存储。
Python网络爬虫——新冠疫情实时数据的爬取与可视化
爬取的内容为(腾讯新闻的新冠病毒疫情的实时追踪)
第一部分:爬取网站上的全国各地、美国、全球的疫情数据,对数据进行清洗和处理后分别导成Excel表格存储。 第二部分:对导出的数据进行可视化输出。(本作品的时间是实时的)
1、主题页面的结构与特征分析 2、Html页面解析 ? ? ?
Python爬取的数据如下:(数据分别为): 世界疫情数据.xlsx 中国各省疫情数据.xlsx 中国每日疫情数据.xlsx 美国每日疫情数据.xlsx ? ? ?
新冠数据可视化python(pyCharm)源代码如下: import requests import pandas as pd import json import time from IPython.display import display, HTML ???# 可以输出正确的表格样式 # 观察开发者工具network找到url int_url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist' # 找到显示国内疫情数据的url,如: # 'https://panshi.qq.com/v2/vote/23311878?source=1&callback=jQuery35105457093859854443_1624342555735&_=1624342555736' # 'jQuery35105457093859854443_1624342555735'可省略不写,其后面的数字为time.time()*1000,按照其格式构造url,即实时数据的url cn_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d' % int(time.time() * 1000) usa_url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=美国&=' china_url = 'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,nowConfirmStatis,provinceCompare' def get_int_page(page_int): ???# 请求世界各国疫情数据 ????try: ????????response = requests.get(url=page_int) ????????if response.status_code == 200: ????????????return response.json()['data'] ????except requests.exceptions.ConnectionError as e: ????????print('Error', e.args) def get_cn_page(page_cn): ?# 请求中国疫情数据 ????try: ????????resp = requests.get(url=page_cn) ????????if resp.status_code == 200: ????????????return json.loads(resp.json()['data']) ????except requests.exceptions.ConnectionError as e: ????????print('Error', e.args) def get_usa_page(page_usa): ?# 请求美国每日疫情数据 ????try: ????????response = requests.get(url=page_usa) ????????if response.status_code == 200: ????????????return response.json()['data'][453:-69] ????except requests.exceptions.ConnectionError as e: ????????print('Error', e.args) def get_china_page(page_china): ?# 请求中国每日疫情数据 ????try: ????????response = requests.get(url=page_china) ????????if response.status_code == 200: ????????????return response.json()['data'] ????except requests.exceptions.ConnectionError as e: ????????print('Error', e.args) def parse_int_page(items_int): ???# 解析世界各国疫情数据,并返回一个数据列表用于之后构造DataFrame ????data_int = [] ????for item_int in items_int: ????????int_country = item_int.get('name') ?# 国家 ????????int_confirm = item_int.get('confirm') ?# 累计确诊人数 ????????int_dead = item_int.get('dead') ?# 累计死亡人数 ????????int_heal = item_int.get('heal') ?# 累计治愈人数 ????????int_nowConfirm = item_int.get('nowConfirm') ?# 现有确诊人数 ????????int_confirm_add = item_int.get('confirmAdd') ?# 新增确诊人数 ????????int_healCompare = item_int.get('healCompare') ?# 新增治愈人数 ????????int_deadCompare = item_int.get('deadCompare') ?# 新增死亡人数 ????????year = item_int.get('y') ?# 当前年 ????????month, day = item_int.get('date').split('.') ?# 当前月,日 ????????int_date = year + '-' + month + '-' + day ????????dic = {'国家': int_country, '日期 ?': int_date, '累计确诊': int_confirm, ???????????????'累计死亡': int_dead, '累计治愈': int_heal, '现有确诊': int_nowConfirm, ???????????????'当日新增确诊': int_confirm_add, '当日新增治愈': int_healCompare, '当日新增死亡': int_deadCompare} ????????data_int.append(dic) ????return data_int def parse_cn_page(items_cn): ???# 解析中国疫情数据,将中国的数据加入到世界各国数据的DataFrame中,并且构造每个省的DataFrame ????cn_date = items_cn['lastUpdateTime'].split(' ')[0] ???# 当前日期 ????cn_confirm = items_cn['chinaTotal']['confirm'] ???# 累计确诊 ????cn_dead = items_cn['chinaTotal']['dead'] ???# 累计死亡 ????cn_heal = items_cn['chinaTotal']['heal'] ???# 累计治愈 ????cn_nowConfirm = items_cn['chinaTotal']['nowConfirm'] ???# 现有确诊(输入型+本地) ????cn_confirm_add = items_cn['chinaAdd']['confirm'] ???# 当日新增确诊 ????cn_healCompare = items_cn['chinaAdd']['heal'] ???# 当日新增治愈 ????cn_deadCompare = items_cn['chinaAdd']['dead'] ???# 当日新增死亡 ????cn_list = ['中国', cn_date, cn_confirm, ???????????????cn_dead, cn_heal, cn_nowConfirm, ???????????????cn_confirm_add, cn_healCompare, cn_deadCompare] ????return cn_list def parse_province_page(items_cn): ???# 解析中国各省疫情数据 ????province_list = [] ????province_items = items_cn['areaTree'][0]['children'] ????for province_item in province_items: ????????province_name = province_item['name'] ?# 省份 ????????province_date = items_cn['lastUpdateTime'].split(' ')[0] ?# 当前日期 ????????province_confirm = province_item['total']['confirm'] ?# 累计确诊 ????????province_dead = province_item['total']['dead'] ?# 累计死亡 ????????province_heal = province_item['total']['heal'] ?# 累计治愈 ????????province_nowConfirm = province_item['total']['nowConfirm'] ?# 现有确诊 ????????province_confirm_add = province_item['today']['confirm'] ?# 当日新增确诊 ????????healRate = province_item['total']['healRate'] ?# 治愈率 ????????deadRate = province_item['total']['deadRate'] ?# 死亡率 ????????province_dic = {'省份': province_name, '日期': province_date, ????????????????????????'累计确诊': province_confirm, '累计死亡': province_dead, ????????????????????????'累计治愈': province_heal, '现有确诊': province_nowConfirm, ????????????????????????'当日新增确诊': province_confirm_add, '治愈率': healRate, '死亡率': deadRate} ????????province_list.append(province_dic) ????return province_list def parse_usa_page(items_usa): ???# 解析美国每日疫情数据 ????usa_list = [] ????for item_usa in items_usa: ????????year = item_usa['y'] ????????month, day = item_usa['date'].split('.') ????????date = year + '-' + month + '-' + day ????????usa_confirm_add = item_usa['confirm_add'] ????????usa_confirm = item_usa['confirm'] ????????usa_heal = item_usa['heal'] ????????usa_dead = item_usa['dead'] ????????usa_dic = {'日期': date, '当日新增': usa_confirm_add, '累计确诊': usa_confirm, '累计治愈': usa_heal, '累计死亡': usa_dead} ????????usa_list.append(usa_dic) ????return usa_list def parse_china_page(items_china): ???# 解析中国每日疫情数据 ????china_list = [] ????item_dayadds = items_china['chinaDayAddList'] ????item_days = items_china['chinaDayList'] ????for item_dayadd, item_day in zip(item_dayadds, item_days): ????????year = item_dayadd['y'] ????????month, day = item_dayadd['date'].split('.') ????????date = year + '-' + month + '-' + day ????????china_confirm_add = item_dayadd['confirm'] ????????china_confirm = item_day['confirm'] ????????china_heal = item_day['heal'] ????????china_dead = item_day['dead'] ????????china_dic = {'日期': date, '当日新增': china_confirm_add, '累计确诊': china_confirm, ?????????????????????'累计治愈': china_heal, '累计死亡': china_dead} ????????china_list.append(china_dic) ????return china_list def set_up_table(data, cn, province, usa, china): ???# 创建修改DataFrame ????int_df = pd.DataFrame(data) ????int_df.index = range(1, 192) ????int_df.loc[0] = cn ????int_df = int_df.sort_index(ascending=True) ????province_df = pd.DataFrame(province) ????usa_df = pd.DataFrame(usa) ????china_df = pd.DataFrame(china) ????return int_df, province_df, usa_df, china_df def write_table(data1, data2, data3, data4): ???# 存储表 ????data1.to_excel('世界疫情数据.xlsx', encoding='utf-8') ????data2.to_excel('中国各省疫情数据.xlsx', encoding='utf-8') ????data3.to_excel('美国每日疫情数据.xlsx', encoding='utf-8') ????data4.to_excel('中国每日疫情数据.xlsx', encoding='utf-8') ????print('已存储') def main(): ????int_data = get_int_page(int_url) ????cn_data = get_cn_page(cn_url) ????usa_data = get_usa_page(usa_url) ????china_data = get_china_page(china_url) ????c_list = parse_cn_page(cn_data) ????p_list = parse_province_page(cn_data) ????list_data_int = parse_int_page(int_data) ????u_list = parse_usa_page(usa_data) ????cn_list = parse_china_page(china_data) # ????display(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3]) # 若直接print,则输出的不是表格 ????write_table(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[0], ????????????????set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[1], ????????????????set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[2], ????????????????set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3],) if __name__ == '__main__': ????main() import matplotlib.pyplot as plt import numpy as np #% matplotlib inline plt.rcParams['font.sans-serif'] = ['SimHei'] import datetime int_df = pd.read_excel('世界疫情数据.xlsx') cn_province_df = pd.read_excel('中国各省疫情数据.xlsx') usa_df = pd.read_excel('美国每日疫情数据.xlsx') china_df = pd.read_excel('中国每日疫情数据.xlsx') int_df = int_df.drop('Unnamed: 0',axis=1) cn_province_df = cn_province_df.drop('Unnamed: 0',axis=1) usa_df = usa_df.drop('Unnamed: 0',axis=1) china_df = china_df.drop('Unnamed: 0',axis=1) int_top20 = int_df.head(21) ???# 取出中国及前20个国家的数据 # 作图: plt.title('截止' + int_top20['日期 ?'][0] + '的累计确诊人数和累计死亡人数') # plt.xlabel('国家') # plt.ylabel('人数') x = int_top20['国家'] y = int_top20['累计确诊'] # plt.ylim(0, max(int_top20['累计确诊'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y,color='r',tick_label=x) plt.show() int_top5 = int_df.head(6) # 作图 x = int_top5['国家'] plt.subplot(2,2,1) plt.title('截止' + int_top5['日期 ?'][0] + '的累计确诊人数') plt.ylabel('人数') y1 = int_top5['累计确诊'] plt.ylim(0, max(int_top5['累计确诊'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y1,color='c',tick_label=x) plt.subplot(2,2,2) plt.title('截止' + int_top5['日期 ?'][0] + '的累计死亡人数') plt.ylabel('人数') y2 = int_top5['累计死亡'] plt.ylim(0, max(int_top5['累计死亡'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y2,color='violet',tick_label=x) plt.subplot(2,2,3) plt.title('截止' + int_top5['日期 ?'][0] + '的累计治愈人数') plt.ylabel('人数') y3 = int_top5['累计治愈'] plt.ylim(0, max(int_top5['累计治愈'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y3,color='cornflowerblue',tick_label=x) plt.subplot(2,2,4) plt.title(int_top5['日期 ?'][0] + '新增确诊') plt.ylabel('人数') y4 = int_top5['当日新增确诊'] plt.ylim(0, max(int_top5['当日新增确诊'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y4,color='black',tick_label=x) plt.subplots_adjust(wspace =0.5, hspace = 1) plt.show() cn_province_df = cn_province_df.sort_values('累计确诊', ascending=False) ??# 以累计确诊数降序排序 i = datetime.datetime.now() plt.title(str('%s'%i)[:16] ?+ '的累计确诊人数') label_list = cn_province_df.head(20)['省份'] x = range(len(cn_province_df.head(20)['省份'])) y = cn_province_df.head(20)['累计确诊'] plt.ylim(0, max(cn_province_df.head(20)['累计确诊'])) plt.xticks(rotation=90) plt.bar(x=x, height=y, width=0.6, alpha=0.8, color='c') plt.ylim(0, 70000) plt.ylabel('人数') plt.xticks([index + 0.2 for index in x], label_list, rotation=65) plt.show() plt.title('死亡率') plt.pie(labels=cn_province_df.head(10)['省份'] ,x=cn_province_df.head(10)['死亡率'],colors=['b','r','yellow','c','orange','lime']) plt.show() x = np.arange(1,len(china_df['日期'])+1) y1 = usa_df['当日新增'] y2 = china_df['当日新增'] plt.figure(figsize=(12,8)) plt.title('中美每日新增') plt.xlabel('天数') plt.ylabel('数量') s1 = plt.plot(x,y1,marker='o',label='美国',color='r') # 绘制图形 s2 = plt.plot(x,y2,marker='o',label='中国',color='c') plt.xticks(x) plt.legend() plt.show() usa_df.head() x = np.arange(1,len(china_df['日期'])+1) y1 = usa_df['累计确诊'] y2 = china_df['累计确诊'] plt.figure(figsize=(12,8)) plt.title('中美累计确诊') plt.xlabel('天数') plt.ylabel('数量') s1 = plt.plot(x,y1,marker='o',label='美国',color='black' ) # 绘制图形 s2 = plt.plot(x,y2,marker='o',label='中国',color='red') plt.xticks(x) plt.legend() plt.show() |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/30 1:25:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |