欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

程序员文章站 2022-07-14 10:33:45
...

前言

这个比赛是月份前辈邀请参加的,可以说是竞赛初试水,我负责的baseline(SEIR模型)在初赛数据上表现不错,短暂进过前10。但是复赛时,由于队员各自都很忙,没空弄比赛,boosting的三个臭皮匠都凑不齐,于是乎裸奔的SEIR在复赛阶段光荣狗带了。虽然比赛烂尾了,但是还是写个博客记录一下吧。
竞赛链接

PS: 本人很菜,所以对我的方法不要抱太大期待。

背景 Background

传染病(Contagious Diseases)的有效防治是全人类面临的共同挑战,如何通过大数据,特别是数据的时空关联特性,来精准预测传染病的传播趋势和速度,将极大有助于人类社会控制传染病,保障社会公共卫生安全。希望借助此次竞赛,充分发挥全球选手的聪明才智,运用大数据技术助力传染病的传播预测和控制,增强人类社会合作抗风险的意识和能力。

任务描述 Task Definition

针对赛题所构造的若干虚拟城市,构造传染病群体传播预测模型,根据该地区传染病的历史每日新增感染人数、城市间迁徙指数、网格人流量指数、网格联系强度和天气等数据,预测群体未来一段时间每日新增感染人数。
赛题共涉及11个虚拟城市90天的感染情况,每个城市有若干重点区域。初赛要求针对所提供的5个城市,利用每个城市各区域前45天的样本数据进行训练,预测每个城市各区域后30天每天的新增感染人数。复赛要求针对包含初赛城市在内的11个城市,利用每个城市各区域前60天的样本数据进行训练,预测每个城市各区域后30天每天的新增感染人数。

数据集 DataSet

初赛阶段 Preliminary Stage

训练数据(train_data)
训练集共包括5个城市,每个城市目录下的数据集总体说明:
1.各区域每天新增感染人数。文件名:infection.csv。提供前45天每天数据,文件格式为城市ID,区域ID,日期,新增感染人数;“,”分割。
2.城市间迁徙指数。文件名:migration.csv。提供45天每天数据。文件格式为迁徙日期,迁徙出发城市,迁徙到达城市,迁徙指数;“,”分割。
3.网格人流量指数。文件名:density.csv。提供45天内每周两天抽样数据,文件格式为日期,小时,网格中心点经度,网格中心点纬度,人流量指数;“,”分割。
4.网格关联强度。文件名:transfer.csv。城市内网格间关联强度数据,文件格式为小时,出发网格中心点经度,出发网格中心点纬度,到达网格中心点经度,到达网格中心点纬度,迁移强度;“,”分割。
5.网格归属区域。文件名:grid_attr.csv。城市内网格对应的归属区域ID,文件格式为网格中心点经度,网格中心点纬度,归属区域ID;“,”分割。
6.天气数据。文件名:weather.csv。提供45天每天数据,文件格式为日期,小时,气温,湿度,风向,风速,风力,天气;“,”分割。

复赛阶段 Playoff Stage

新增6个城市,训练集的城市数量从5增加到11;训练集的时间窗口从45天增加到60天;其他不变。

文件数据示例详细说明:

1.infection.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
2.migration.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
3.density.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
4.transfer.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
5.grid_attr.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
6.weather.csv
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

评价指标

百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

提交格式

Data to be Submitted by the Contestants (result_data)
选手需要预测后30天每天每个城市对应区域的新增感染人数,提供的文件格式为:城市ID,区域ID,日期,每日新增感染人数;“,”分割。选手提交结果文件命名为submission.csv,内容示例如下:
A,1,21200701,0
A,1,21200702,0
etc.

实验部分

SEIR模型原理

相信经过疫情,大家对这个模型不会太陌生,不了解的可以看下毕导讲解
再不懂,还可以看一下这个

思路

我们的实验基于SEIR模型,因此首先利用到的数据就是各区域的infection.csv
为了能够淋漓尽致?地利用SEIR模型
我构建了宏观模型(每个城市CITY_SEIR)以及精确模型(每个区域REGION_SEIR)
然后为了能够将CITY_SEIR模型的结果有缘由地分配到各个区域,
我们以每个区域总感染数占其所属城市总感染数的比例作为分配的依据(初赛想法)
然后各区域最终结果以城市模型分配的产出为中心(城市模型代表了大趋势,毕竟区域个体小,模型可能有过拟合或是不合理现象),以各区域SEIR模型的产出为辅助。
RES(region_infection)=α1CITY_SEIR(I)Region_Irate+α2Region_SEIR(I) \mathbb{RES}(region\_infection)=\alpha_1*CITY\_SEIR(I)*Region\_Irate+\alpha_2*Region\_SEIR(I)
该想法只涉及到了感染数据,其他迁移,天气,密度都没用到。
但是其实我已经处理好这些数据的文件准备复赛运用:
具体想法 就是根据grid_attr中各个网格的经纬度以及所属区域id,得到某区域的经纬度范围(城市的经纬度也可得到),然后利用这些范围去density.csv中得到该区域(区域)的人流量指数(以小时为单位),然后得到区域(城市)该天平均流量指数(以天为单位),然后各区域(城市)迁移指数(以天为单位)也是同样的道理得到。
因此,在城市-SEIR模型的中可以加入迁移人数T作为辅助变量,并且在分配城市模型产出时,可以辅以各区域人流量占比为分配指标2(指标1是各区域感染人数比例)
RES(region_infection)=α1CITY_SEIR(I,T)(β1Region_Irate+β2Region_Drate)+α2Region_SEIR(I,T) \mathbb{RES}(region\_infection)=\alpha_1*CITY\_SEIR(I,T)*(\beta_1*Region\_Irate+\beta_2*Region\_Drate)+\alpha_2*Region\_SEIR(I,T)
T表示迁移,D表示密度,α,β\alpha,\beta是拟合参数
后面这个公式我只处理了数据,没有实现(因为大家都放弃复赛- -,我也没啥动力),放上来大家瞧瞧得了
不过处理数据的代码我还是会给出。

数据预处理

城市感染数以及区域感染比例的得到

这个简单,将每个城市各个区域各天的感染数据相加得到城市的每日感染数据,并且得到同时得到各个区域总感染数占城市总感染数的比例文件。
Input: infection.csv
output: city_infection.csv, region_Irate.csv

区域经纬度范围以及人流量指数的得到

首先按照grid_attr.csv中各个网格的归属区域划分grid,然后从中提取各区域grid经纬度的极值
从而得到区域的经纬度范围[minx,miny,maxx,maxy] 保存到regionxy.csv文件
然后根据区域范围到density.csv中将区域密度以及占当日人流量占比算出,保存到region_density.csv文件。
同时还可得到城市总人流量文件city_density.csv
Input: grid_attr.csv,density.csv
output: regionxy.csv, region_density.csv,city_density.csv

实验模型

前面说的很清楚了,这里就放个代码

PreData.py

我把处理过程全放在一个文件里了,需要哪个调用哪个函数,没有直接关系,显得有点冗长。

"""
Created on Sun May  4 14:23:33 2020
@author: joycez
"""
import pandas as pd
import os
from os.path import join as opj
import re
import time
import datetime
import json
import numpy as np
import matplotlib.pyplot as plt
import geatpy as ea
import math
import csv
from scipy.optimize import curve_fit
from scipy.integrate import odeint
def write_csv(data,file):
    with open(file, 'w', newline='') as csvfile:
        writer  = csv.writer(csvfile)
        for row in data:
            writer.writerow(row)
def rmsle(p,a,n): 
    sle=sum([(math.log(x+1)-math.log(y+1)) ** 2 for x, y in zip(p,a)])/n
    rmsle=math.sqrt(sle)
    return rmsle
def get_time(T): 
    f = open('train_data_all\\city_A\\infection.csv')
    train_csv = [i for i in csv.reader(f)]
    tdata=train_csv[0:T] 
    arr_time=[i[2] for i in tdata]
    return arr_time
def get_region(city):
    f = open('train_data_all\\city_'+city+'\\infection.csv')
    train_csv = [i for i in csv.reader(f)]
    region=[i[1] for i in train_csv]
    arr_region=sorted(set(region),key=region.index)
    return arr_region
def get_city_infect(city,t,num): 
    f = open('train_data_all\\city_'+city+'\\infection.csv')
    df = pd.read_csv(f,header=None)
    city_infection=[]
    for i in range(num):
        tnum=[]
        sortlist=df[[3]][df[2]==int(t[i])]
        sumt=sortlist.sum()
        tnum.append(city)
        tnum.append(t[i])
        tnum.append(int(sumt))
        city_infection.append(tnum)
    return city_infection
def get_region_xy(city,citynum,cityregion): 
    f = open('train_data_all\\city_'+city+'\\grid_attr.csv')
    df = pd.read_csv(f,header=None)
    city_region_xy=[]
    for i in cityregion[citynum]:
        regionxy=[]
        sortlistx=df[[0]][df[2]==int(i)]
        sortlisty=df[[1]][df[2]==int(i)]
        #print(sortlistx,sortlisty)
        maxx=sortlistx.max()
        minx=sortlistx.min()
        maxy=sortlisty.max()
        miny=sortlisty.min()
        regionxy.append(i)
        regionxy.append(float(minx))
        regionxy.append(float(miny))
        regionxy.append(float(maxx))
        regionxy.append(float(maxy))
        city_region_xy.append(regionxy)
    file1='pre_data_all\\'+city+'\\'+city+'_region_xy.csv'
    namecol=['regionid','minx','miny','maxx','maxy']
    test=pd.DataFrame(columns=namecol,data=city_region_xy)
    test.to_csv(file1,encoding='gbk',index=False)    
def merge_attr_gird_density(city,regionxy):
    file=open('train_data_all\\city_'+city+'\\density.csv')
    namecol=['date','hour','grid_x','grid_y','index','region']
    df = pd.read_csv(file,header=None,names=['date','hour','grid_x','grid_y','index'])
    df['region_id']='region'
    data = pd.DataFrame(columns=['date','hour','grid_x','grid_y','index','region_id'])
    for i in range(len(regionxy)):
        sortx1=df[df['grid_x']>=float(regionxy[i][0])]
        sortx=sortx1[sortx1['grid_x']<=float(regionxy[i][2])]
        sortxy1=sortx[sortx['grid_y']>=float(regionxy[i][1])]
        sortxy=sortxy1[sortxy1['grid_y']<=float(regionxy[i][3])]
        sortxy['region_id']=str(i)
        data=data.append(sortxy)                
    file='pre_data_all\\'+city+'\\density_region_merged.csv'
    data.to_csv(file,encoding='gbk',index=False)
def get_city_density(city,time): 
    file=open('train_data_all\\city_'+city+'\\density.csv')
    df = pd.read_csv(file,header=None,names=['date','hour','grid_x','grid_y','index'])
    city_density=[]
    for i in range(len(time)):
        datedensity=[]
        sorttime=df[['index']][df['date']==int(time[i])]
        datedensity.append(str(time[i]))
        datedensity.append(float(sorttime.sum()))
        city_density.append(datedensity)
    file1='pre_data_all\\'+city+'\\city_density.csv'
    namecol=['date','index']
    test=pd.DataFrame(columns=namecol,data=city_density)
    test.to_csv(file1,encoding='gbk',index=False)
def read_city_density(city):
     city_density=[]
     for i in range(len(city)):
          file=open('pre_data_all\\'+city[i]+'\\city_density.csv')
          df = pd.read_csv(file,low_memory=False)
          city_density.append(np.array(df).tolist())
     return city_density    
def get_region_density(city,citynum,time,cityregion,citydensity): 
    f = open('pre_data_all\\'+city+'\\density_region_merged.csv')
    df = pd.read_csv(f)
    region_density=[]
    for i in range(len(time)):
        sorttime=df[df['date']==int(time[i])]
        cityallden=citydensity[i][1]
        regionallden=sorttime['index'].sum()
        for j in range(len(cityregion[citynum])):
            datedensity=[]
            sortregion=sorttime[['index']][sorttime['region_id']==j]
            sumreg=float(sortregion.sum())
            datedensity.append(str(time[i]))
            datedensity.append(str(j))
            datedensity.append(sumreg)
            cityrate=0.0
            regrate=0.0
            if cityallden!=0 and sumreg!=0:
                cityrate=float(sumreg/cityallden)
                regrate=float(sumreg/regionallden)
            datedensity.append(cityrate)
            datedensity.append(regrate)
            region_density.append(datedensity)
    file1='pre_data_all\\'+city+'\\region_density.csv'
    namecol=['date','region_id','index','cityrate','regionrate']
    test=pd.DataFrame(columns=namecol,data=region_density)
    test.to_csv(file1,encoding='gbk',index=False)     
def get_regionI_rate(city,city_region):
    f = open('pre_data_all\\'+city+'\\infection.csv')
    df = pd.read_csv(f,header=None,names=['city','date','num'])
    cityallI=0.0
    cityallI=df['num'].sum()
    f2 = open('train_data_all\\city_'+city+'\\infection.csv')
    df2 = pd.read_csv(f2,header=None,names=['city','region','date','num'])
    res=[]
    for i in range(len(city_region)):
        resreg=[]
        dfreg=df2['num'][df2['region']==int(city_region[i])]
        regallI=dfreg.sum()
        regIrate=0.0
        if cityallI!=0 and regallI!=0:
            regIrate=float(regallI/cityallI)
        resreg.append(city_region[i])
        resreg.append(cityallI)
        resreg.append(regallI)
        resreg.append(regIrate)
        res.append(resreg)
    file1='pre_data_all\\'+city+'\\regionI_rate.csv'
    namecol=['region_id','cityallI','regallI','regIrate']
    test=pd.DataFrame(columns=namecol,data=res)
    test.to_csv(file1,encoding='gbk',index=False)
 if __name__ == '__main__':
    
    city=['A','B','C','D','E','F','G','H','I','J','K']
    T=60
    #时间#
    gettime=get_time(T)
    #print(gettime)
    #城市-区域
    city_region=[]
    #得到网格density对应区域数据
    for i in range(len(city)):
        city_region.append(get_region(city[i]))
    #城市每日人流量总数
    #city_density=read_city_density(city)
    #print(city_density)
    
    #得到每个城市的整体确诊数
    '''
    for i in range(len(city)):
        cityI=get_city_infect(city[i],gettime,T)
        file='pre_data_all\\'+city[i]+'\\infection.csv'
        write_csv(cityI,file)       
    print("--------city_infection complete------------")   
    '''
    #区域确诊数占比
    for i in range(len(city)):
        cityregion=city_region[i]
        get_regionI_rate(city[i],cityregion)
    print("--------------------regionI rate complete---------------")
    '''
    #每个区域的xy范围
    for i in range(len(city)):
         get_region_xy(city[i],i,city_region)
    print("--------------------regionIxy complete---------------")
    
    #每个xy归属区域计算
    for i in range(len(city)):
        regionxy=get_region_xy(city[i],i,city_region)
        merge_attr_gird_density(city[i],regionxy)
    print("--------grid density regionid merged complete------------")
    
    #区域每日流量总数
    for i in range(len(city)):
        citydensity=city_density[i]
        get_region_density(city[i],i,gettime,city_region,citydensity)
    print("--------------------region density complete---------------")
    
    #城市每日总人流量
    for i in range(len(city)): 
        city_density.append(get_city_density(city[i],gettime)

    print("--------------------city density complete---------------")
    '''   

数据处理结果

以其中一个城市A的pre_data文件夹为例
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
regionI_rate.csv:储存区域感染人数占比
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

A_region_xy.csv:储存城市区域的经纬度范围
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录
density_region_merged.csv:将网格人流量数据划分到各区域
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

city_density.csv:储存城市人流量信息
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

region_density.csv :储存区域人流量信息及其占比
百度-2020国际大数据竞赛:高致病性传染病的传播趋势预测-记录

CITY_SEIR

"""
Created on Sat May  9 14:13:16 2020
@author: joycez
"""
import pandas as pd
import os
from os.path import join as opj
import re
import time
from datetime import datetime
import json
import numpy as np
import matplotlib.pyplot as plt
import geatpy as ea
import math
import csv
from scipy.optimize import curve_fit
from scipy.integrate import odeint
def fit_sir_model(x,b,y,N):
    I = []  # 传染者
    I.append(1)
    S = []  # 易感者
    S.append(N - I[0])
    R = []  # 康复者
    R.append(0)   
    deti = []  # 康复者
    deti.append(0)  
    hisI = []  #累计确诊者
    hisI.append(I[0]+R[0]) 
    for i in range(T-1):   
        S.append(S[i] -  b * S[i] * I[i] / N)
        I.append(I[i] +  b * S[i] * I[i] / N  - y * I[i])
        R.append(R[i] +  y * I[i])
        #今日累计确诊数=今日确诊数+累计治愈数
        hisI.append(I[i+1]+sum(R))
        deti.append(I[i+1]-I[i])
    #return np.array(hisI)[x] 
    #return np.array(deti)[x]
    return np.array(I)[x]
def sir_model(T,x,b,y,N):
    I = []  # 传染者
    I.append(1)
    S = []  # 易感者
    S.append(N - I[0])
    R = []  # 康复者
    R.append(0)
    deti = []  # 康复者
    deti.append(0)
    hisI = []  #累计确诊者
    hisI.append(I[0]+R[0])
    for i in range(T-1):
        S.append(S[i] -  b * S[i] * I[i] / N)
        I.append(I[i] +  b * S[i] * I[i] / N  - y * I[i])
        R.append(R[i] +  y * I[i])
        #今日累计确诊数=今日确诊数+累计治愈数
        hisI.append(I[i+1]+sum(R))
        deti.append(I[i+1]-I[i])
    return np.array(I)[x] 
    #return np.array(deti)[x]    
def getlistindex(lista):
    flag=0
    for i in range(len(lista)):
        if lista[i]!=0:
            flag=i
            break
    return flagdef read_city_infect(city):
    city_date=[]
    city_infection=[]
    file=open('pre_data_all\\'+city+'\\infection.csv')
    df = pd.read_csv(file,low_memory=False,names=['date','num'])
    df1=df['date']
    df2=df['num']
    city_date=np.array(df1).tolist()
    city_infection=np.array(df2).tolist()
    flag=getlistindex(city_infection)
    date=city_date[flag:]
    city_infection=city_infection[flag:]
    return city_date,city_infection  
def read_regIrate(city):
    f=open('pre_data_all\\'+city+'\\regionI_rate.csv')
    df = pd.read_csv(f)
    df=df['regIrate']
    res=[]
    res=np.array(df).tolist()
    return res
def read_region_rate(city,time): 
    file=open('pre_data_all\\'+city+'\\region_density.csv')
    df = pd.read_csv(file,low_memory=False)
    region_rate=[]
    for i in range(len(time)):
         date_rate=[]
         dftime = df[['rate']][df['date']==int(time[i])]
         date_rate.append(np.array(dftime).tolist())
         region_rate.append(date_rate)
    return region_rate
def get_time(T): 
    f = open('train_data_all\\city_A\\infection.csv')
    train_csv = [i for i in csv.reader(f)]
    tdata=train_csv[0:T] 
    arr_time=[i[2] for i in tdata]
    return arr_time
def transtoint(list1):
    listint = []
    for i in list1:
        i=round(i)
        listint.append(int(i))
    return listint        
if __name__ == '__main__':    
 submission=[]
    city=['A','B','C','D','E','F','G','H','I','J','K']
    city_region=[]
    #需要预测的日期
    date=pd.date_range(start='21200501',end='21200629',freq='1D')
    for i in range(len(city)):
        city_region.append(get_region(city[i]))
   ubmission=[]
    for i in range(len(city)):
        city_date,city_infection=read_city_infect(city[i])
        print(city_infection)
        T=len(city_infection)
        #print(city_date)
        traindate=pd.date_range(start=str(city_date[0]),end=str(city_date[T-1]),freq='1D')
        #print(traindate)
        x=np.arange(0,T,1)
        trainx=x
        trainy=city_infection
        city_min=max(trainy)
        param_bounds=([0,0,city_min],[1,1,np.inf])
        popt, pcov=curve_fit(fit_sir_model,trainx,trainy,bounds=param_bounds)
        fit_cityI=fit_sir_model(x, *popt)
        fit_cityI=transtoint(fit_cityI)
        #显示结果
        plt.figure(figsize=(12, 6.5))
        plt.plot(traindate, city_infection, 'o')
        plt.plot(traindate, fit_cityI)
        plt.title("Fit of SIR model for Spain infected cases")
        plt.ylabel("Population infected")
        plt.xlabel("Days")
        plt.gcf().autofmt_xdate()#旋转标签,以显示完全
        plt.show()
        #输出到文件submission2
        print("Optimal parameters: beta =", popt[0], " and gamma = ", popt[1]," and N = ", popt[2])
        prex=np.arange(T,T+30,1)
        pre_cityI=sir_model(100,prex, *popt)
        preI=transtoint(pre_cityI)
        csubmission=[]
        subdate=[datetime.strftime(x,'%Y%m%d') for x in list(pd.date_range(start='21200630', end='21200729'))]
        regIrate=read_regIrate(city[i])
        for j in range(len(city_region[i])):
            pre_regI=transtoint(pre_cityI*regIrate[j])
            for k in range(30):
                subres=[]
                subres.append(city[i])
                subres.append(j)
                subres.append(subdate[k])
                subres.append(pre_regI[k])
                submission.append(subres)
    fres='pre_data_all\\submission2.csv'
    namecol=['city','region_id','date','num']
    test=pd.DataFrame(columns=namecol,data=submission)
    test.to_csv(fres,encoding='gbk',index=False)

REGION_SEIR

def fit_sir_model(x,b,y,N):
def sir_model(T,x,b,y,N):
def getlistindex(lista):
def transtoint(list1):
def read_region_infect(citynum,regionnum): 
    region_date=[]
    region_infection=[]
    f = open('train_data_all\\city_'+citynum+'\\infection.csv')
    df = pd.readcsv(f,low_memory=False,names=['city','region','date','num'])
    df=df[df['region']==int(regionnum)]
    df1=df['date']
    df2=df['num']
    region_date=np.array(df1).tolist()
    region_infection=np.array(df2).tolist()
    flag=getlistindex(region_infection)
    region_date=region_date[flag-1:]
    region_infection=region_infection[flag-1:]
    return region_date,region_infection
def get_hisI(y): 
    trainy=[]
    sumI=0
    for i in range(len(y)):
        sumI=sumI+y[i]
        trainy.append(sumI)
    return trainy
def get_detI(y): 
    deti=[]
    deti.append(y[0])
    flag=0
    for i in range(len(y)-1):
        flag=y[i+1]-y[i]
        deti.append(flag)
    return deti
def get_region(city):
    f = open('train_data_all\\city_'+city+'\\infection.csv')
    train_csv = [i for i in csv.reader(f)]
    region=[i[1] for i in train_csv]
    arr_region=sorted(set(region),key=region.index)
    return arr_region
if __name__ == '__main__':
    submission=[]
    city=['A','B','C','D','E','F','G','H','I','J','K']
    city_region=[]
    #需要预测的日期
    date=pd.date_range(start='21200501',end='21200629',freq='1D')
    for i in range(len(city)):
        city_region.append(get_region(city[i]))
    for i in range(len(city)):
        city_date,city_infection=read_city_infect(city[i])
        T=len(city_infection)
        #print(city_date)
        traindate=pd.date_range(start=str(city_date[0]),end=str(city_date[T-1]),freq='1D')
        #print(traindate)
        x=np.arange(0,T,1)
        trainx=x
        trainy=city_infection
        city_min=max(trainy)
        param_bounds=([0,0,city_min],[1,1,np.inf])
        popt, pcov=curve_fit(fit_sir_model,trainx,trainy,bounds=param_bounds)
        fit_cityI=fit_sir_model(x, *popt)
        fit_cityI=transtoint(fit_cityI)
        plt.figure(figsize=(12, 6.5))
        plt.plot(traindate, city_infection, 'o')
        plt.plot(traindate, fit_cityI)
        plt.title("Fit of SIR model for Spain infected cases")
        plt.ylabel("Population infected")
        plt.xlabel("Days")
        plt.gcf().autofmt_xdate()#旋转标签,以显示完全
        plt.show()
        print("Optimal parameters: beta =", popt[0], " and gamma = ", popt[1]," and N = ", popt[2])
        prex=np.arange(T,T+30,1)
        pre_cityI=sir_model(100,prex, *popt)
        preI=transtoint(pre_cityI)
        csubmission=[]
        subdate=[datetime.strftime(x,'%Y%m%d') for x in list(pd.date_range(start='21200630', end='21200729'))]
        regIrate=read_regIrate(city[i])
        for j in range(len(city_region[i])):
            pre_regI=transtoint(pre_cityI*regIrate[j])
            for k in range(30):
                subres=[]
                subres.append(city[i])
                subres.append(j)
                subres.append(subdate[k])
                subres.append(pre_regI[k])
                submission.append(subres)
    fres='pre_data_all\\submission2.csv'
    namecol=['city','region_id','date','num']
    test=pd.DataFrame(columns=namecol,data=submission)
    test.to_csv(fres,encoding='gbk',index=False)
           

Mix_Res

#区的
def read_sub1():
    f=open('=pre_data_all\\submission1.csv')
    df = pd.read_csv(f)
    res=np.array(df).tolist()
    return res
#市的 
def read_sub2():
    f=open('=pre_data_all\\submission2.csv')
    df = pd.read_csv(f)
    res=[]
    res=np.array(df).tolist()
    return res

if __name__ == '__main__':
    
    sub1=read_sub1()
    sub2=read_sub2()
    for i in range(len(sub1)):
        if(sub1[i][3]<=50*sub2[i][3] and sub2[i][3]!=0):
            sub1[i][3]= sub1[i][3]*0.8+sub2[i][3]*0.2
        elif sub2[i][3]==0:
            sub1[i][3]= sub1[i][3]*0.2
            #sub1[i][3]=(sub1[i-1][3]/sub2[i][3])*0.4+sub2[i][3]*0.6
        sub1[i][3]=math.ceil(sub1[i][3])
            
    fres='=pre_data_all\\submission3.csv'
    namecol=['city','region_id','date','num']
    test=pd.DataFrame(columns=namecol,data=sub1)
    test.to_csv(fres,encoding='gbk',index=False)

总结

差不多就这么多内容,模型很简单,实现和调整只花了两下午,只用感染数据在时间窗口少的时候,误差大概在1.3左右,时间窗口变长,只用感染数据误差就上2了。想要精度上去除了完善模型就是boosting几个baseline,可惜我两个都没干????,大家就当看个乐子。