<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              全球即時:天佑武漢 天佑種花家!爬之分析之各省數據入口

              來源:CSDN 時間:2023-02-07 10:23:59

              一、前言

              最近在家隔離,每天起床第一件事就是看看各地情況,好在目前情況有了些許好轉。天佑武漢!天佑種花家! 偶然間在技術貼看到一數據入口,點開一看,如獲至寶,爬之分析之!

              數據以json的模樣展現在我們面前,各省入口是省名稱。(因為一些原因不能在博客上貼出數據,可視化上也將數據屏蔽,畢竟實現方法是最重要的,見諒?。? url = "https://lab.isaaclin.cn/nCoV/api/area?latest=0&province={0}".format(province)想要獲取全國的數據只要遍歷省份進行請求解析就好了。各省的數據我只截取到1月24號(除夕)。 現在開始請求


              (資料圖片僅供參考)

              二、爬蟲

              1. 請求

              def spider_virus(url):    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"    }    html = requests.get(url=url,headers=headers)    html.encoding = "utf-8"    html.raise_for_status()

              只要掛個UA就能請求通~ 推薦給大伙一個UA包,很好用,不用每次都去粘UA,省了很多事

              from fake_useragent import UserAgent

              只要"User-Agent": UserAgent().random,就可以了,方便得很。

              2. Json解析

              解析json這里就很簡單了

              # 省級            provinceName = results["provinceName"]            provinceShortName = results["provinceShortName"]+"全部統計"            confirmedCount = results["confirmedCount"]            suspectedCount = results["suspectedCount"]            curedCount = results["curedCount"]            deadCount = results["deadCount"]            # locationId = results["locationId"]            #  13位時間戳轉換            updateTimenum = results["updateTime"]            timeStamp = float(int(updateTimenum) / 1000)            timeArray = time.localtime(timeStamp)            # otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)            updateTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)            province_list.append((provinceName, provinceShortName, confirmedCount, suspectedCount,                                  curedCount, deadCount,updateTime))

              # 市級            try:                cities = results["cities"]                for city_data in cities:                    # print(city_data)                    cityName = city_data["cityName"]                    confirmedCount = city_data["confirmedCount"]  # 確診人數                    suspectedCount = city_data["suspectedCount"]  # 疑似感染人數                    curedCount = city_data["curedCount"]  # 治愈人數                    deadCount = city_data["deadCount"]  # 死亡人數                    # locationId = city_data["locationId"]                    province_list.append((provinceName, cityName, confirmedCount, suspectedCount,                                          curedCount, deadCount, updateTime))            except Exception as e :                cities = "未知"                cityName = "未知"                confirmedCount = 0000                suspectedCount = 0000                curedCount = 0000                deadCount = 0000                province_list.append((provinceName, cityName, confirmedCount, suspectedCount,                                      curedCount, deadCount, updateTime))    To_MySQL("Virus", province_list)

              3. 數據存儲(Mysql)

              最后的數據我存到了mysql里,建表也是在python里寫好的,就不貼了

              def Insert_Data(datas_into, table_name):    try:        # print(datas_into)        db = pymysql.connect(host="手動打碼", user="root", password="*******", db="liu*手動打碼", charset="utf8")        cursor = db.cursor()        # for data_tups in list(datas_into):        sql_insert = """insert into {0} (Province,city,confirmedCount,suspectedCount,curedCount,deadCount,updataTime) values (%s, %s, %s, %s, %s, %s, %s);""".format(table_name)        cursor.executemany(sql_insert, datas_into)        db.commit()    except Exception as e:        db.rollback()        print(e)    finally:        cursor.close()        db.close()

              因為采集下來的數據有各省總人數及其地級市、區等,所以在city這一列總體水平我用了“全部的統計”,以便區分。

              截止目前只有40000多條數據,時間設的2秒,沒寫多進程,就是單機這樣跑,畢竟自己用嘛~

              三、可視化與分析

              我使用的是Jupyter notebook

              1. 數據處理

              import time,pymysqlimport pandas as pdimport numpy as npfrom pyecharts.charts import Pie, Bar, Map, WordCloud,Line,Gridfrom pyecharts import options as optsfrom pyecharts.globals import SymbolTypefrom pyecharts.globals import ThemeType

              db = pymysql.connect(host="*****",                      user="root",                      password="*****",                      db="liu*****",                      charset="utf8")df_all = pd.read_sql("SELECT * FROM virus", con=db)df_all = pd.read_sql("SELECT * FROM virus", con=db)db.close()df_all.to_excel("原始數據.xls")

              修改了中文列名,方便識別,但是實際開發中并不推薦

              df_all.columns = ["id","省份","城市","確診人數","疑似感染人數","治愈人數","死亡人數","更新時間"]df_all.isnull().sum()df_all.info()df_all["更新時間"] = pd.to_datetime(df_all["更新時間"])df_all.head()

              修改日期格式,增加了周幾一列

              df_all["更新日期"] = pd.to_datetime(df_all["更新時間"].map(str).str[0:10], format ="%Y-%m-%d")df_all["更新日期"]=df_all["更新日期"].dt.strftime("%m-%d")df_all["周幾"]=df_all["更新時間"].dt.dayofweek+1

              提取各省總體數據

              df_ProAll = pd.DataFrame(columns=["id","省份","城市","確診人數","疑似感染人數",                                  "治愈人數","死亡人數","更新時間","更新日期","周幾"])for province in province_list:    df_pro=df_pro_all.loc[df_pro_all["省份"]==province,:]    #提取相同日期第一條    df_pro=df_pro.drop_duplicates(subset=["更新日期"],keep="first")    df_ProAll = pd.concat([df_ProAll,df_pro],ignore_index=False,axis=0)col=["id","省份","城市","確診人數","疑似感染人數","治愈人數","死亡人數","更新時間","更新日期","周幾"]df_ProAll=df_ProAll[col]#修改類型df_ProAll[["確診人數","疑似感染人數","治愈人數","死亡人數"]]=df_ProAll[["確診人數","疑似感染人數","治愈人數","死亡人數"]].astype(int)#重置索引df_ProAll.index = range(len(df_ProAll.index))

              gp_time=df_ProAll.groupby("更新日期")[["確診人數","疑似感染人數","治愈人數","死亡人數"]].sum()cols = gp_time.columns.tolist()for col in cols:    num_list = gp_time[col].tolist()    new_list = [0]    for i in range(len(num_list)-1):        b= num_list[i+1]-num_list[i]        new_list.append(b)    gp_time["{}增減".format(col)]=new_listgp_time

              2. 可視化

              2.1 全國情況

              2.1.1) 全國治愈與死亡走勢

              line = (        Line()        .add_xaxis(gp_time.index.tolist())        .add_yaxis("治愈人數", gp_time["治愈人數"].tolist())        .add_yaxis("死亡人數", gp_time["死亡人數"].tolist())        .set_global_opts(            title_opts=opts.TitleOpts(title="全國治愈與死亡走勢"),            tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),            yaxis_opts=opts.AxisOpts(name="人數"),            xaxis_opts=opts.AxisOpts(name="時間(日)")            )            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))        )line.render_notebook()

              2.1.2) 全國確診、死亡、治愈增幅

              line = (        Line()        .add_xaxis(gp_time.index.tolist())        .add_yaxis("確診", gp_time["確診人數增減"].tolist())        .add_yaxis("治愈", gp_time["治愈人數增減"].tolist())        .add_yaxis("死亡", gp_time["死亡人數增減"].tolist())        .set_global_opts(            title_opts=opts.TitleOpts(title="全國確診、死亡增幅"),            tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),            yaxis_opts=opts.AxisOpts(name="人數"),            xaxis_opts=opts.AxisOpts(name="時間(日)")            )        )line.render_notebook()

              2.1.3) 全國確診走勢

              2.1.4) 全國top10省份

              time_list = [list(z) for z in zip(df_pro_new["省份"].tolist()[:10],                                  df_pro_new["確診人數"].tolist()[:10])]pie = (    Pie()            .add("", time_list).set_global_opts(title_opts=opts.TitleOpts(title=""))        .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}")))pie.render_notebook()

              2.1.5) 全國確診/治愈/死亡對比

              gp_timeday = gp_time.index.tolist()aaa=gp_time["確診人數增減"].tolist()bbb=gp_time["治愈人數增減"].tolist()ccc=gp_time["死亡人數增減"].tolist()ddd=gp_time["疑似感染人數增減"].tolist()grid = Grid()bar = Bar()# grid.theme = ThemeType.PURPLE_PASSIONline = Line()bar.add_xaxis(day)bar.add_yaxis("治愈增減",bbb,label_opts=opts.LabelOpts(is_show=False))bar.add_yaxis("死亡增減",ccc,label_opts=opts.LabelOpts(is_show=False))bar.extend_axis(yaxis=opts.AxisOpts(type_="value",                                     name="確診人數增減",                                     min_=0,                                     max_=16000,                                     position="right",                                                         axislabel_opts=opts.LabelOpts(formatter="{value}人"),                                     ))bar.set_global_opts(yaxis_opts=opts.AxisOpts(                                            name="治愈/死亡增減",                                            type_="value",                                            axislabel_opts=opts.LabelOpts(formatter="{value}人")                                            ), #                     xaxis_opts=opts.AxisOpts(name="日期"),# 太擠不好顯示                    title_opts=opts.TitleOpts("全國每日確診/治愈/死亡對比"),                    tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),                   ) # 交叉指向工具line.add_xaxis(day)line.add_yaxis("確診增減",aaa,yaxis_index = 1,label_opts=opts.LabelOpts(is_show=False))# line.add_yaxis("疑似感染增減",ddd,yaxis_index = 1,label_opts=opts.LabelOpts(is_show=False))# 把line添加到bar上bar.overlap(line)# 這里如果不需要grid也可以,直接設置bar的格式,然后顯示bar即可#bar.render_notebook()grid.add(chart = bar,grid_opts = opts.GridOpts(),is_control_axis_index = True)grid.render_notebook()

              2.1.6) 除湖北省,各省市情況

              gp_pro_time_cop=gp_pro_time.copy().reset_index()df_no_hubei=gp_pro_time_cop.loc[gp_pro_time_cop["省份"]!="湖北省",:]# df_no_hubei["省份"].value_counts()gp_no_hubei=df_no_hubei.groupby("更新日期")[["確診人數","治愈人數","死亡人數",                                         "確診人數增減","治愈人數增減","死亡人數增減"]].sum()gp_no_hubei

              2.1.7) 全國情況結論

              2月1號后治愈水平逐步與離開水平拉大距離。在連續三天下降后,2月13號,確診病例突然增加15139例,武漢市那天將疑似未確診病例計入,這是件好事,相關報道也做了說明。top10中北方省份只有兩個,河南和山東,也是兩個勞務輸出大省,其中河南省因為緊鄰湖北省,達到914例,人們也更愿意選擇離家近的發達地區工作。自2月4號開始各省確診病例逐漸下降,死亡人數增幅較緩

              2.2 天津市情況

              數據處理

              """天津市基本情況"""df_tianjin_all=df_all.loc[(df_all["省份"]=="天津市")&(df_all["城市"]!="全部統計"),:]df_tianjin_all.index = range(len(df_tianjin_all.index))df_tianjin_all.head()city_list=[]for city in df_tianjin_all["城市"].tolist():    if city=="外地來津":        city="外地來津人員"        city_list.append(city)    elif city=="待明確":        city="待明確地區"        city_list.append(city)      else:        city_list.append(city)df_tianjin_all["城市"]=city_list"""檢索天津市現有數據每區每日最后一條數據"""df_tianjin_last=df_tianjin_all.iloc[df_tianjin_all.groupby(["城市",                                   "更新日期"]).apply(lambda x: x["確診人數"].idxmax())]df_tianjin_last.index = range(len(df_tianjin_last.index))df_tianjin_last.head()"""檢索天津市各區最新確診數據"""gp_tianjin=df_tianjin_last.groupby(["城市","更新日期"])["確診人數","疑似感染人數",                                                  "治愈人數","死亡人數"].sum()df_tj_daynew=gp_tianjin.reset_index()df_tj_daynew=df_tj_daynew.iloc[df_tj_daynew.groupby(["城市"]).apply(lambda x: x["確診人數"].idxmax())]df_tj_daynew=df_tj_daynew.sort_values(by="確診人數",ascending=False)df_tj_daynew

              首先對數據做了下處理,把外地和待明確歸納

              2.2.1) 各區縣最新確診人數

              2.2.2) 確診、治愈、死亡情況

              2.2.3) 寶坻區與天津市各區趨勢

              2.2.4) 天津市情況結論

              寶坻區有50病例,占到天津1/3,緊接著是河東區15例天津市市內6區 top占了4位,較為發達的和平、南開也在之內,河東,河北相對其他區,外來人口也相對較多。

              以上代碼就是對此次疫情的很粗略分析,其實可以分析的地方太多了,也能獲得很多別的信息,比如,按各省面積人口算一下致病率,各省確診連續下滑時長等等,方法其實都是一樣,就看分析的思路了。 可視化使用的pyecharts,畫出來的圖也比較好看。 云玩家第一次發博,見笑~·

              責任編輯:

              標簽: 死亡人數

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩