本次实验我们用到的主要模块有以下模块:
import pandas as pd import numpy as np from matplotlib import pyplot as plt import seaborn as sns import random from plotly import tools import plotly.express as px from plotly.offline import init_notebook_mode, iplot, plot import plotly.graph_objs as go import ast
当然有些可能用不上,但是先插入以便于后面的操作
我们先来看看我们本次实验的两组数据分别是有一组训练组和一组实验组分别为:
df_train
df_test
第一步:数据清洗df_train.info() df_train.isna().sum()
1.对数组进行数据缺失值的检查,并在下面步骤对于缺失值进行处理:我们可以发现province缺失了很多,为了避免删除她的数据对整个coutry_region造成影响,我们决定,用填补的方式去弥补空缺。
df_train.Province_State = df_train.Province_State.fillna("")
df_test.Province_State = df_train.Province_State.fillna("")
2.其次的话将date进行一个to_datetime的一个转化,为后续分析进行铺垫:
df_train.Date = pd.to_datetime(df_train.Date) df_test.Date= pd.to_datetime(df_test.Date)
数据基本处理完成,结果如上。
第二步:数据分析及可视化呈现:1.随着时间的变化影响的死亡人数及确诊人数,以时间的维度去分析确诊和死亡病例具体代码如下:
#时间和确诊与死亡人数的关系
sns.set()
df_time = df_train[["Date","/confirm/iedCases","Fatalities"]]
df_time = df_time.groupby("Date").sum()#时间维度
plt.xticks(rotation = 45)
plt.rcParams["font.sans-serif"] = "SimHei"
sns.lineplot(data = df_time,x = df_time.index,y="/confirm/iedCases",label = "确诊人数")
sns.lineplot(data = df_time,x = df_time.index,y="Fatalities",label = "死亡人数")
plt.legend()
可视化效果如下:
2.随着时间的变化美国的确诊病例的变化
df_time_US = df_train[df_train["Country_Region"] =="US"][["Date","/confirm/iedCases","Fatalities"]]
df_time_US = df_time_US.groupby("Date").sum().reset_index()
fig = px.bar(df_time_US,"Date","/confirm/iedCases",color = "/confirm/iedCases",color_continuous_scale=px.colors.sequential.Magenta)
fig.show()
可视化效果如下:(同样的我们也可以以相同的方法去观察不同国家的确诊数变化情况)
3.我们来观察一下最高确诊数的国家对比关系,以此来确定哪个国家疫情影响最为夸张,代码如下
df_countries = df_train.groupby(["Country_Region","Province_State"]).max()#国家和地区的最大值
df_countries = df_countries.groupby("Country_Region").sum()#以国家为中心统计全部地区的确诊
df_countries = df_countries.drop(columns="Id")
df_countries_country = df_countries.groupby("Country_Region").max().sort_values(by = "/confirm/iedCases",ascending = False)[:20] #挑选出确诊排名前20的国家
fig = px.bar(df_countries_country, df_countries_country.index,"/confirm/iedCases",color="/confirm/iedCases",color_continuous_scale=px.colors.sequential.Bluered)
fig.update_layout(title = "国家最高确诊数对比图")
fig.show()
可视化效果如下:
目前我们已知的地区,时间这两个已知变量会大大影响我们确诊病例和死亡病例的多少,所以便可以做开始特征工程
第三步:特征工程1.将日期按年月日分割开,以便于等一下的实验训练,代码如下:
df_train["Day"] = df_train.Date.dt.day df_train["Month"] = df_train.Date.dt.month df_train["Year"] = df_train.Date.dt.year df_test["Day"] = df_test.Date.dt.day df_test["Month"] = df_test.Date.dt.month df_test["Year"] = df_test.Date.dt.year df_train = df_train.drop(columns=["Id","Date"])
2.将国家和省份串联起来,以便于等下做相应的标记,代码如下:
from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() df_train["location"] = df_train["Country_Region"] + df_train["Province_State"] df_test["location"] = df_test["Country_Region"] + df_test["Province_State"] df_train["location"] = encoder.fit_transform(df_train.location) #转变为模型可以运用的数据类型 df_test["location"] = encoder.fit_transform(df_test.location) df_train_final = df_train.drop(columns=["Country_Region","Province_State"])
以时间和地区作为自变量,确诊数作为因变量来构建模型,模型构建结果如下所示:
y = df_train_final.ConfirmedCases x = df_train_final.drop(columns=["Fatalities","/confirm/iedCases"])由于不是典型的线性关系,也不是随机森林的关系,我们这里运用xgboost进行模型的构建
from xgboost import XGBRegressor xgb = XGBRegressor(n_estimators= 2500,max_denth = 27,random_size = 0) fig = xgb.fit(x,y) fig.score(x,y)
拟合关系0.99999挺完美的了那么接下来预测一下看结果如何?
predict = pd.Series(fig.predict(x_test))
预测结果如上所示!!本次分析结束拉



