2020 テディカップ データ分析スキル コンテストの問題 B-新型コロナウイルス感染症のデータ分析

 

タスク1データの基本処理

タスク 1.1添付資料 1「都市の流行状況」のデータに従って、最初の確認症例の通知から 6 月 30 日までの各都市の毎日の累積感染者数、累積治癒者数、累積死亡者数を数え、保存します。結果は "task1_1.csv" で、最初の行はフィールドの名前で、列 A ~ E に都市、日付、累計感染者数、累計治癒者数、累計人数の順に配置されます。死の。論文には実施方法の関連説明が記載されており、毎月10日と25日の武漢、深セン、保定の統計結果がリストされている。

import numpy as np
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'      # 正常显示中文
plt.rcParams['axes.unicode_minus'] = False

import pyecharts
from pyecharts import *
from pyecharts.charts import Bar,Pie,Funnel,Scatter,Gauge,Page,WordCloud,Line
from pyecharts import options as opts

# 任务1_1
data1 = pd.read_excel('附件1.xlsx',sheet_name='城市疫情')

# 填充缺失的日期
date_range = pd.date_range(start=data1.日期.min(),end=data1.日期.max())
date = pd.DataFrame()
data1 = data1.set_index('日期')
for i in data1.城市.unique():

    a = data1[data1['城市']==i].reindex(index = date_range,)
    # 填充新增数据
    a.iloc[:,1:] = a.iloc[:,1:].fillna(0)
    # 填充城市数据
    a = a.fillna(i)
    a = a.reset_index()
    date = pd.concat((date,a))
date= date.rename(columns= {'index':'日期'})

date[['累计确诊人数','累计治愈人数','累计死亡人数']] =date.groupby('城市').cumsum()
date.iloc[:,2:] = date.iloc[:,2:].astype(int)
date_ = date.loc[:,['城市','日期','累计确诊人数','累计治愈人数','累计死亡人数']].copy()
# 保存结果
date_.to_csv('task1_1.csv')

データ1:

毎月 10 日と 25 日の深セン、武漢、保定市のデータを表示します。

date_[date_['日期'].apply(lambda x: x.day==10 or x.day==25)].query("城市 == '深圳'")

date_[date_['日期'].apply(lambda x: x.day==10 or x.day==25)].query("城市 == '武汉'")

date_[date_['日期'].apply(lambda x: x.day==10 or x.day==25)].query("城市 == '保定'")

 

タスク 1.2タスク 1.1 の結果に基づいて、別紙 1 の「市と州の比較表」を組み合わせて、各省の行政単位の毎日の新規および累積データをカウントし、結果を「task1_2.csv」として保存します。最初の行は次のとおりです。 A列からH列にはフィールド名、都道府県別、日付、新規確認者数、新規治癒者数、新規追加死亡者数、累積確認者数、累積治癒者数、累積死亡者数がそれぞれ配置されます。実施方法の関連説明は論文に記載されており、毎月15日の湖北省、広東省、河北省の統計結果がリストされています。

data1_sheng = pd.read_excel('附件1.xlsx',sheet_name='城市省份对照表')

# 通过城市列进行联结
data1_2 = pd.merge(date, data1_sheng, on = '城市')
data1_2 = data1_2.reindex(columns = ['省份','日期','新增确诊','新增治愈','新增死亡','累计确诊人数','累计治愈人数','累计死亡人数'])
data1_2.columns = ['省份','日期','新增确诊人数','新增治愈人数','新增死亡人数','累计确诊人数','累计治愈人数','累计死亡人数']

# 根据省份对该省份的城市数据进行汇总,得到该省份的每日新增确诊人数等。
data1_2 = data1_2.groupby(['省份','日期'],as_index =False).sum()
# 保存结果
data1_2.to_csv('task1_2.csv')

 data1_sheng:

毎月 15 日の広東省、湖北省、河北省のデータを表示します。

data1_2[data1_2.日期.apply(lambda x:x.day == 15)].query("省份=='广东'")

data1_2[data1_2.日期.apply(lambda x:x.day == 15)].query("省份=='湖北'")

data1_2[data1_2.日期.apply(lambda x:x.day == 15)].query("省份=='河北'")

分析します:

新しい流行データ分析:

plt.figure(figsize=(13,5))

plt.subplot(131)
data1_2.groupby('日期').sum()['新增确诊人数'].plot(c = 'r')
plt.title('新增确诊')

plt.subplot(132)
data1_2.groupby('日期').sum()['新增治愈人数'].plot(c = 'g')
plt.title('新增治愈')

plt.subplot(133)
data1_2.groupby('日期').sum()['新增死亡人数'].plot(c = 'k')
plt.title('新增死亡')

plt.show()

 

 累積流行データ分析:

plt.figure(figsize=(13,5))

plt.subplot(131)
data1_2.groupby('日期').sum()['累计确诊人数'].plot(c = 'r')
plt.title('累计确诊')

plt.subplot(132)
data1_2.groupby('日期').sum()['累计治愈人数'].plot(c = 'g')
plt.title('累计治愈')

plt.subplot(133)
data1_2.groupby('日期').sum()['累计死亡人数'].plot(c = 'k')
plt.title('累计死亡')

plt.show()

 パイチャートの描画:

def plot_(data_name, color):
    d = data1_2.groupby('日期').sum()[data_name]
    d.index = d.index.map(lambda x:x.strftime('%Y/%m/%d'))
    line =Line()
    line.add_xaxis(xaxis_data=d.index.to_list())
    line.add_yaxis(series_name = f'{data_name}'[:-2],y_axis =d.to_list(),is_smooth =False,symbol_size = 10,
                   linestyle_opts=opts.LineStyleOpts(color= color, width=4, type_="solid"),)
    
    line.set_series_opts(markpoint_opts = opts.MarkPointOpts(data = [opts.MarkPointItem(type_= ['max'], symbol_size = 70),
                                                                     opts.MarkPointItem(type_= ['min'])],),
                         itemstyle_opts=opts.ItemStyleOpts(border_width=1, color=color))
    
    line.set_global_opts(title_opts=opts.TitleOpts(title = f'{data_name}随时间变化图'),
                         xaxis_opts=opts.AxisOpts(name= '日期',type_='category', name_location='center',name_gap=25,),
                         yaxis_opts=opts.AxisOpts(name= '人数',type_='value', name_location='end',name_gap=15,
                                                  splitline_opts=opts.SplitLineOpts(is_show=True,
                                                                                    linestyle_opts=opts.LineStyleOpts(opacity=1)),),
                         tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
                                                 )
    return line.render_notebook()

plot_('新增确诊人数', 'red')
# plot_('新增治愈人数', 'blue')
# plot_('新增死亡人数', 'blake')

 

 

 

タスク 1.3タスク 1.2 の結果に従って、各省行政単位の新規クラウン患者の入院患者数を毎日数え、その結果を「task1_3.csv」として保存します。列 ~ 列 C。論文には実施方法の関連説明が記載されており、毎月20日の湖北省、広東省、上海の統計結果がリストされています。

患者が診断後すぐに入院すると仮定すると、入院数は、確定症例の累積数から治癒患者の累積数と死亡者数の累積を引いたものとして定義されます。 

data1_3= pd.DataFrame()
data1_3[['省份','日期']] = data1_2.iloc[:,:2]

data1_3['住院人数'] = data1_2['累计确诊人数']-data1_2['累计治愈人数']-data1_2['累计死亡人数']
data1_3.to_csv('task1_3.csv',index=False)

毎月 20 日の湖北省、広東省、上海の統計結果を表示します。

data1_3[data1_3.日期.apply(lambda x:x.day == 20)].query("省份=='湖北'")

data1_3[data1_3.日期.apply(lambda x:x.day == 20)].query("省份=='广东'")

data1_3[data1_3.日期.apply(lambda x:x.day == 20)].query("省份=='上海'")

 タスク 1.4では、新型コロナウイルス感染症患者の拡散半径が 1 km であると仮定し、付録 1「都市 A の流行場所」に従って計画の 6 日目と 10 日目の都市の流行拡大リスク地域を描画し、論文における分析と分析 実装プロセス。

data3 = pd.read_excel('附件1.xlsx',sheet_name='A市涉疫场所分布')

# 结合题意第6天的传播区域因为第8天时的总确诊
a1 = data3[data3['通报日期']<= 8]
# 第10天的传播区域因为第12天时的总确诊
a2 = data3[data3['通报日期']<= 12]

# 常用全局参数配置封装
def global_opts(line,x_name = '',y_name = '',title = '',bottom = None,left = None,split_line = True
               ):
         line.set_global_opts(title_opts=opts.TitleOpts(title = title),
                             xaxis_opts=opts.AxisOpts(name= x_name,type_='value', name_location='end',name_gap=25,max_= 30,
                                                     splitline_opts=opts.SplitLineOpts(is_show=split_line,
                                                                                        linestyle_opts=opts.LineStyleOpts(opacity=1)),
                                                     axistick_opts=opts.AxisTickOpts()),
                             yaxis_opts=opts.AxisOpts(name= y_name,type_='value', name_location='end',name_gap=15,max_= 30,
                                                      splitline_opts=opts.SplitLineOpts(is_show=split_line,
                                                                                        linestyle_opts=opts.LineStyleOpts(opacity=1)),),
                              legend_opts =opts.LegendOpts(type_ = 'scroll',
                                                      pos_bottom=bottom, pos_left = left,
                                                      orient = 'horizontal',align ='left',
                                                      item_gap = 10,item_width = 25,item_height = 15,
                                                      inactive_color = 'break'),
                             tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
                        
                                                     )

 データ3:

from pyecharts.charts import EffectScatter

scatter =EffectScatter()
scatter.add_xaxis(a1.iloc[:,2].tolist())
scatter.add_yaxis('',a1.iloc[:,3],itemstyle_opts=opts.ItemStyleOpts(color='red'),
                  symbol_size = 25,
                  label_opts=opts.LabelOpts(is_show=False),)
global_opts(scatter,'横坐标',y_name = '纵坐标',title = '第6天A市疫情传播风险区域')
scatter.render_notebook()

scatter =EffectScatter()
scatter.add_xaxis(a2.iloc[:,2].tolist())
scatter.add_yaxis('',a2.iloc[:,3],
                  symbol_size = 25,
                  itemstyle_opts=opts.ItemStyleOpts(color='red'),label_opts=opts.LabelOpts(is_show=False))
global_opts(scatter,'横坐标',y_name = '纵坐标',title = '第10天A市疫情传播风险区域')

scatter.render_notebook()

 タスク 2デジタル大画面デザイン

タスク 2.1国内の新型コロナウイルス感染症の状況、時間的および空間的変化、主要な懸念領域などの概要情報を表示する大型デジタル画面を設計します。スクリーンショットを紙に添付し、関連するデザインのアイデアを示します。

 タスク 1_2 の結果データ data1_2 をプロットに使用します

タスク 2.2国際的な感染症の状況と発展の変化を表示および分析するための大型デジタル画面を設計します。スクリーンショットを論文に添付し、関連する分析と設計のアイデアを提供します。

 処理前のデータ:

期間内の欠落している日付を入力します(分析結果で日付が存在しないことが判明する場合は、直接スキップできます)

data = pd.read_excel('附件1.xlsx',sheet_name='国际疫情'

# 对国际疫情表参照任务一的方式进行日期填充
date = pd.DataFrame()
data = data.set_index('日期')
print(data)
for i in data.国家.unique():
    a = data[data['国家']==i]
    date_range = pd.date_range(start=a.index.min(),end=a.index.max())
    a = a.reindex(index = date_range,)

    print(a,a.isna().sum())
    a = a.fillna(method = 'ffill')
    a = a.fillna(method = 'bfill')
    print(a,a.isna().sum(),'+++++')
    a = a.reset_index()
    date = pd.concat((date,a))
date= date.rename(columns= {'index':'日期'})

処理されたデータ:

  「新しい」データを取得します。

# 初始化
data = pd.DataFrame()
for i in date.国家.unique():
    _ =date[date['国家']== i].copy()
    _[['新增确诊','新增治愈','新增死亡']] = pd.concat((_.iloc[0:1,2:],_.iloc[:,2:].diff().iloc[1:,:]))
    data = pd.concat((data,_))

# 保存数据用于可视化大屏绘制
data.to_excel(r'data_guoji.xlsx')

最終データ:

  大画面化は行っておりませんが、国内都市の大画面を参照していただけます

タスク 3国際的流行の進展の分析

課題 3.1付録 1「国際的な流行」のデータに基づいて、インド、イラン、イタリア、カナダ、ペルー、南アフリカの流行の進展段階を各時期に分け、その根拠と結果を論文に示す。 。

しませんでした

タスク 3.2付録 2 の情報に基づいて、米国、英国、ロシアが導入した流行予防・抑制措置が自国の流行状況の変化に及ぼす影響を分析する。

data['日期'] = pd.to_datetime(data['日期'])
with sns.color_palette('RdYlGn'):
    fig, axes = plt.subplots(2, 3, figsize = (14,8))
    for num, country in enumerate(['美国', '英国', '俄罗斯']):
        d_ = data.query(f"国家 == '{country}'").set_index('日期')
        d_[['累计确诊', '累计治愈', '累计死亡']].plot(ax = axes[0][num])
        axes[0][num].set_title(country)
        axes[0][num].set_xlabel(None)

        d_[['新增确诊', '新增治愈', '新增死亡']].plot(ax = axes[1][num])
        axes[1][num].set_title(country)
        axes[1][num].set_xlabel(None)

    plt.subplots_adjust(0.2,0.1)

ブログ内の 3 つのテディカップ分析コンテストの完全なプロジェクト情報は WeChat に追加できます: gjwtxp (20 元)

おすすめ

転載: blog.csdn.net/weixin_46707493/article/details/127162800