武汉加油、湖北加油、中国加油!!!
2020年开年爆发的新型冠状病毒,新的一年相信对于大家来说都是地狱模式开局,对于我本人也是如此,打乱了很多计划,有些不知所措,但是灾难面前,唯有同舟共济,对此我个人是乐观的,中华民族是不服输的民族,上下5000年历史,比这大的灾难比比皆是,但是我们依然屹立于此,依然活跃于世界舞台,这充分证明了中华民族的韧性,中国万岁;
之前看到丁香园上有实时的动态数据,就想着拉下来进行分析挖掘预测,第一版之前跑了两天后停止了,因为当时数据格式变化比较大,从2月5号开始第二版数据采集脚本,脚本很简单,目前采集间隔是10分钟,不是每10分钟都会采集,这取决于数据是否有变动,这里主要展示数据采集脚本以及一个简单的基于prophet的确诊、疑似、死亡、治愈的预测;
数据基于丁香园的实时动态数据,感谢数据展示分享,对于大家了解疫情的实时情况真的帮助很大,各种数据可视化展示,大家也可以点进去看看,做的还是比较精细的,颗粒度最低可以到某个市的某个区,这也证明中国目前在全国统筹方面的能力在日益完善,当然还有很长的路要走,毕竟咱们的目标是星辰大海;
采集方式:主要数据分两部分,一部分是全国的整体情况,一部分是各省市情况,这两部分都处于script元素内,因此其实只需要找到对应的script元素,对于内容文本做截取后,转为json对象即可直接读取内部内容,而整体结构也是简洁明了,相信大家都能搞定的,下面是我的采集脚本,可以直接copy运行的,大家需要注意的主要以下几个点:1. 首先同级目录创建data_new文件夹,2. 一些注释要打开,主要是两部分注释是给csv文件写头行的,所以我写过一次就注释了,第一次运行需要打开,后续注释掉就行,我主要获取五类数据:城市名、确诊数、疑似数(这个只在全国部分有,各省市是没有的)、死亡数、治愈数;
#!/usr/bin/env python
# coding=utf-8
import requests
from bs4 import BeautifulSoup as BS
import json
import time
import sys,os
reload(sys)
sys.setdefaultencoding('utf-8')
while(True):
try:
r = requests.get('https://3g.dxy.cn/newh5/view/pneumonia\_peopleapp?from=timeline&isappinstalled=0')
soup = BS(r.content, 'html.parser')
\_cn\_data = soup.find('script',id='getStatisticsService').get\_text()
\_s = \_cn\_data.index('{', \_cn\_data.index('{')+1)
\_e = \_cn\_data.index('catch')-1
\_china = json.loads(\_cn\_data[\_s:\_e])
\_timestamp = \_china['modifyTime']
\_cc,\_sc,\_dc,\_cuc = \_china['confirmedCount'],\_china['suspectedCount'],\_china['deadCount'],\_china['curedCount']
print \_timestamp,\_cc,\_sc,\_dc,\_cuc
if open('data\_new/湖北省.csv').readlines()[-1].split(',')[0]==str(\_timestamp):
#if False:
print('data not flush')
else:
#row = 'timestamp,confirmedCount,suspectedCount,curedCount,deadCount'
#os.system('echo '+row+' >> data\_new/中国.csv')
row = ','.join([str(\_timestamp),str(\_cc),str(\_sc),str(\_cuc),str(\_dc)])
os.system('echo '+row+' >> data\_new/中国.csv')
\_data = soup.find('script',id='getAreaStat').get\_text()
\_data = \_data[\_data.find('['):\_data.rfind(']')+1]
\_provinces = json.loads(\_data)
for \_province in \_provinces:
print \_timestamp,\_province['provinceName'],\_province['provinceShortName'],\_province['confirmedCount'],\_province['suspectedCount'],\_province['curedCount'],\_province['deadCount'],len(\_province['cities'])
\_fn = \_province['provinceName']+'.csv'
#row = 'timestamp,provinceName,cityName,confirmedCount,suspectedCount,curedCount,deadCount,locationId'
#os.system('echo '+row+' >> data\_new/'+\_fn)
for \_city in \_province['cities']:
row = ','.join([str(\_timestamp),\_province['provinceName'],\_city['cityName'],str(\_city['confirmedCount']),str(\_city['suspectedCount']),str(\_city['curedCount']),str(\_city['deadCount']),str(\_city['locationId'])])
os.system('echo '+row+' >> data\_new/'+\_fn)
except Exception as e:
print(e)
pass
time.sleep(60\*10) # 10分钟flush一次
再次感谢丁香园的同学们,对于数据没有做太多保护处理,当然希望大家能够妥善使用;
这部分的代码在这里,大家可以随便取之食用,用的数据是WHO发布的全球数据,颗粒度是天,单位是省,分析主要是两部分第一部分是中国各省情况,第二部分是中国整体情况;
可以看到,死亡率最高的依然是湖北,整个湖北、武汉人民来说却承受了太多太多,我想大家都欠他们一声“你们辛苦了”;
可以看到,确诊、死亡、治愈人数曲线图依然没有缓和的趋势,但是好消息是治愈率在上升,而死亡率在下降,这一点从死亡/治愈的先升后降中也能看到;
这里我只用到了全国的总数据做预测,实际上因为脚本获取的也有各城市的情况,大家一样可以对数据源做一点点修改,就可以做大家感兴趣(比如家乡、工作地、女朋友所在地)等做预测了,还有一个问题需要大家注意,浏览数据时会看到数据有一个跳变的过程,这是因为丁香园的数据来源于国家相关部分,而这些数据的发布应该是有固定时间点的,所以会出现两个相邻数据之间,突然增长了一大段的情况,正常,不需要太惊讶;
横坐标是时间,纵坐标是人数,右侧没有点的部分的线就是往后24小时的预测人数,可以看到明显的阶梯状,这个我看了数据后大概是这么理解的,只有治愈人数是一天内多次有效更新的,其他确诊、疑似、死亡基本一天内的数据变动不大,所以看起来会有阶梯状;
把治愈的情况放到了最后,是想强调一下,大家对这次疫情要有足够的信心,看目前的数据上升趋势,情况正在逐步得到控制,当然也不可以掉以轻心,隔离依然是最最重要且有效的手段,每个人都做好自己的工作,我相信疫情结束的那一天很快就会到来;
#!/usr/bin/env python
# -\*- coding: UTF-8 -\*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet
df\_train = pd.read\_csv('./中国.csv', parse\_dates=['timestamp'])
df\_train['timestamp'] = df\_train['timestamp'].apply(lambda ts:pd.Timestamp(int(ts), unit='ms'))
#df\_train.sort\_values(['timestamp'],inplace=True)
# confirmedCount
df\_train\_confirmed = df\_train[['timestamp','confirmedCount']].copy()
df\_train\_confirmed = df\_train\_confirmed.rename(index=str, columns={"timestamp": "ds", "confirmedCount": "y"})
# suspectedCount
df\_train\_suspected = df\_train[['timestamp','suspectedCount']].copy()
df\_train\_suspected = df\_train\_suspected.rename(index=str, columns={"timestamp": "ds", "suspectedCount": "y"})
# deadCount
df\_train\_dead = df\_train[['timestamp','deadCount']].copy()
df\_train\_dead = df\_train\_dead.rename(index=str, columns={"timestamp": "ds", "deadCount": "y"})
# curedCount
df\_train\_cured = df\_train[['timestamp','curedCount']].copy()
df\_train\_cured = df\_train\_cured.rename(index=str, columns={"timestamp": "ds", "curedCount": "y"})
# test
df\_test = pd.DataFrame({})
df\_test['ds'] = pd.date\_range(start=df\_train\_confirmed.ds.max(), freq="H", periods=24)
m = Prophet()
#m.fit(df\_train\_confirmed)
#m.fit(df\_train\_suspected)
#m.fit(df\_train\_dead)
m.fit(df\_train\_cured)
forecast = m.predict(pd.concat([df\_train\_confirmed[['ds']],df\_test[['ds']]]))
#print forecast[['ds', 'yhat', 'yhat\_lower', 'yhat\_upper']].tail()
m.plot(forecast)
plt.xlabel('Date')
plt.ylabel('Cured Count')
plt.show()
引用一句WHO的话:
We must remember that these are people, not numbers.
翻译过来意思是:我们必须记住这不是数字,而是人。
希望疫情结束后,每个人都能见到自己的亲人、朋友、同事、每一个自己关心的人,能够给他们一个拥抱,谢谢他们还能陪伴自己,谢谢他们没有抛下自己。
大家可以到我的Github上看看有没有其他需要的东西,目前主要是自己做的机器学习项目、Python各种脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。