├── README.md ├── SEIR_Logistic ├── Logistic.ipynb ├── SEIR.ipynb ├── details-20200216.csv └── general-20200216.csv └── 元胞自动机 ├── 1_A_simple_model - 副本.py ├── 1_A_simple_model.py ├── 2_SIR.py ├── 2_SIS.py ├── 2_SISa.py ├── 3_Immunity.py └── README.md /README.md: -------------------------------------------------------------------------------- 1 | 在家无聊试了几种方法来认识一下 **2019-nCoV** 2 | 3 | 仅供自娱自乐 4 | -------------------------------------------------------------------------------- /SEIR_Logistic/Logistic.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 2019-nCoV Data Analysis Logistic" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## Logistic预测确诊人数" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "$P(t) = \\frac{Ke^{r(t-t_0)}}{K+(e^{r(t-t_0)}-1)P_0}$\n", 22 | "- $K$为环境最大容量\n", 23 | "- $P_0$为初始容量\n", 24 | "- $r$为增长率, $r=0$的时候, $P$不变" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 2, 30 | "metadata": {}, 31 | "outputs": [], 32 | "source": [ 33 | "import pandas as pd\n", 34 | "\n", 35 | "csv_file = \"general-20200216.csv\"\n", 36 | "df = pd.read_csv(csv_file, encoding=\"utf-8\")" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 4, 42 | "metadata": {}, 43 | "outputs": [ 44 | { 45 | "name": "stdout", 46 | "output_type": "stream", 47 | "text": [ 48 | "[1.31284676e+03 2.09230335e+01 2.99134321e-01]\n" 49 | ] 50 | }, 51 | { 52 | "data": { 53 | "image/png": "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\n", 54 | "text/plain": [ 55 | "
" 56 | ] 57 | }, 58 | "metadata": { 59 | "needs_background": "light" 60 | }, 61 | "output_type": "display_data" 62 | } 63 | ], 64 | "source": [ 65 | "from scipy.optimize import curve_fit\n", 66 | "import urllib\n", 67 | "import json\n", 68 | "import numpy as np\n", 69 | "import matplotlib.pyplot as plt\n", 70 | "import pandas as pd\n", 71 | "import time\n", 72 | "\n", 73 | "csv_file = \"general-20200216.csv\"\n", 74 | " \n", 75 | "def logistic_function(t, K, P0, r):\n", 76 | " t0 = 0\n", 77 | " exp = np.exp(r * (t - t0))\n", 78 | " return (K * exp * P0) / (K + (exp - 1) * P0)\n", 79 | " \n", 80 | "def predict(province_code):\n", 81 | " predict_days = 10 # 预测未来天数\n", 82 | " \n", 83 | " df = pd.read_csv(csv_file, encoding=\"utf-8\")\n", 84 | " df = df[df.province_code == province_code]\n", 85 | " confirm = df['confirmed'].values\n", 86 | " x = np.arange(len(confirm))\n", 87 | " \n", 88 | " # 用最小二乘法估计拟合\n", 89 | " popt, pcov = curve_fit(logistic_function, x, confirm)\n", 90 | " print(popt)\n", 91 | " \n", 92 | " #近期情况预测\n", 93 | " predict_x = list(x) + [x[-1] + i for i in range(1, 1 + predict_days)]\n", 94 | " predict_x = np.array(predict_x)\n", 95 | " predict_y = logistic_function(predict_x, popt[0], popt[1], popt[2])\n", 96 | " \n", 97 | " #绘图\n", 98 | " plt.figure(figsize=(15, 8))\n", 99 | " plt.plot(x, confirm, 's',label=\"confimed infected number\")\n", 100 | " plt.plot(predict_x, predict_y, 's',label=\"predicted infected number\")\n", 101 | "# plt.xticks(predict_x, date_labels[:len(predict_x) + 1], rotation=90)\n", 102 | " plt.yticks(rotation=90)\n", 103 | " \n", 104 | " plt.suptitle(\"Logistic Fitting Curve for 2019-nCov infected numbers(Max = {}, r={:.3})\".format(int(popt[0]), popt[2]), fontsize=16, fontweight=\"bold\")\n", 105 | " plt.title(\"Predict time:{}\".format(time.strftime(\"%Y-%m-%d\", time.localtime())), fontsize=16)\n", 106 | " plt.xlabel('date', fontsize=14)\n", 107 | " plt.ylabel('infected number', fontsize=14)\n", 108 | " plt.plot()\n", 109 | " plt.show()\n", 110 | " \n", 111 | "province_codes = [440000] \n", 112 | "for province_code in province_codes:\n", 113 | " predict(province_code)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "### reference list\n", 121 | "- https://zhuanlan.zhihu.com/p/106648847\n", 122 | "- https://zhuanlan.zhihu.com/p/104268573\n", 123 | "- https://blog.csdn.net/qq_26822029/article/details/104213781" 124 | ] 125 | } 126 | ], 127 | "metadata": { 128 | "kernelspec": { 129 | "display_name": "Python 3", 130 | "language": "python", 131 | "name": "python3" 132 | }, 133 | "language_info": { 134 | "codemirror_mode": { 135 | "name": "ipython", 136 | "version": 3 137 | }, 138 | "file_extension": ".py", 139 | "mimetype": "text/x-python", 140 | "name": "python", 141 | "nbconvert_exporter": "python", 142 | "pygments_lexer": "ipython3", 143 | "version": "3.7.3" 144 | } 145 | }, 146 | "nbformat": 4, 147 | "nbformat_minor": 2 148 | } 149 | -------------------------------------------------------------------------------- /SEIR_Logistic/SEIR.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 2019-nCoV Data Analysis SEIR" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## SEIR\n", 15 | "### 符号说明\n", 16 | "- $S$ usceptible 易感者: 感染后变为 $E$ 或 $I$\n", 17 | "- $E$ xposed 潜伏者\n", 18 | "- $I$ nfected 感染者\n", 19 | "- $R$ ecovered 康复者: 康复后不会再复发\n", 20 | "- $r$ 感染者 $I$ 每天接触的易感者数目\n", 21 | "- $r_2$ 潜伏者 $E$ 每天接触的易感者数目\n", 22 | "- $\\beta$ 传染系数\n", 23 | "- $\\beta_2$ 潜伏者将易感者转化为潜伏者的概率\n", 24 | "- $\\gamma$ 恢复系数, $\\frac{1}{\\gamma}$ 表示恢复需要的天数, 如果需要5天恢复, $\\gamma$就是0.1\n", 25 | "- $\\alpha$ 潜伏者的发病概率, $\\frac{1}{\\alpha}$ 表示潜伏的天数, 如果潜伏5天, $\\alpha$就是0.1\n", 26 | "### 假设\n", 27 | "- 不考虑自然出生率, 自然死亡率\n", 28 | "- 康复之后不会再被感染" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "### 微分方程式\n", 36 | "- $\\frac{dS}{dt} = -\\frac{r\\beta SI}{N} -\\frac{r_2\\beta_2 SE}{N}$, $\\frac{I}{N}$表示普通人中是已感染者的概率\n", 37 | "- $\\frac{dE}{dt} = \\frac{r\\beta SI}{N} + \\frac{r_2\\beta_2 SE}{N} - \\alpha E$, $\\alpha E$表示感染后直接就发病的人数\n", 38 | "- $\\frac{dI}{dt} = \\alpha E - \\gamma I$\n", 39 | "- $\\frac{dR}{dt} = \\gamma I$\n", 40 | "### 迭代方程\n", 41 | "- $S_n = S_{n-1} - r\\beta ...$\n", 42 | "- $I_n = I_{n-1} + \\alpha $" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 1, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "import math\n", 52 | "import numpy as np\n", 53 | "import matplotlib\n", 54 | "import matplotlib.pyplot as plt\n", 55 | "import pandas as pd\n", 56 | "import pylab" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 2, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "# 计算SEIR的值\n", 66 | "def calc(T):\n", 67 | " for i in range(0, len(T) - 1):\n", 68 | " S.append(S[i] - r * beta * S[i] * I[i] / N - r2 * beta2 * S[i] * E[i] / N)\n", 69 | " E.append(E[i] + r * beta * S[i] * I[i] / N + r2 * beta2 * S[i] * E[i] / N - alpha * E[i] )\n", 70 | " I.append(I[i] + alpha * E[i] - gamma * I[i]) # 计算累计确诊人数\n", 71 | " R.append(R[i] + gamma * I[i])\n", 72 | "\n", 73 | "# 画图\n", 74 | "def plot(T, S, E, I, R):\n", 75 | " plt.figure()\n", 76 | " plt.title(\"SEIR-Time Curve of Virus Transmission\")\n", 77 | " plt.plot(T, S,color='r',label='Susceptible')\n", 78 | " plt.plot(T, E, color='k', label='Exposed')\n", 79 | " plt.plot(T, I, color='b', label='Infected')\n", 80 | " plt.plot(T, R, color='g', label='Recovered')\n", 81 | " \n", 82 | " plt.grid(False)\n", 83 | " plt.legend()\n", 84 | " plt.xlabel(\"Time(day)\")\n", 85 | " plt.ylabel(\"Population\")\n", 86 | " plt.show()" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 3, 92 | "metadata": {}, 93 | "outputs": [ 94 | { 95 | "data": { 96 | "image/png": "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\n", 97 | "text/plain": [ 98 | "
" 99 | ] 100 | }, 101 | "metadata": { 102 | "needs_background": "light" 103 | }, 104 | "output_type": "display_data" 105 | } 106 | ], 107 | "source": [ 108 | "S, E, I, R = [], [], [], []\n", 109 | "N = 10000 # 人口总数\n", 110 | "I.append(1)\n", 111 | "S.append(N - I[0])\n", 112 | "E.append(0)\n", 113 | "R.append(0)\n", 114 | "r = 20 # 传染者接触人数\n", 115 | "r2 = 30\n", 116 | "beta = 0.03 # 传染者传染概率\n", 117 | "beta2 = 0.03 # 易感染者被潜伏者感染的概率\n", 118 | "alpha = 0.14 # 潜伏者患病概率 1/7\n", 119 | "gamma = 0.1 # 康复概率\n", 120 | "\n", 121 | "pylab.rcParams['figure.figsize'] = (12.0, 7.0)\n", 122 | "T = [i for i in range(0, 100)]\n", 123 | "calc(T)\n", 124 | "plot(T,S,E,I,R)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "这个模型是比较理想化的\n", 132 | "很多人为的因素并没有考虑进来, 比如政策导致人们外出减少, $r$, $r2$应该随时间会变小, \n", 133 | "\n", 134 | "本来想用SEIR模型来进行预测, 但这个是个迭代方程, numpy中用的都是矩阵运算, 所以改用logistic方程" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": {}, 140 | "source": [ 141 | "## Reference List\n", 142 | "- 毕导的视频\n", 143 | "- 妈咪说的视频" 144 | ] 145 | } 146 | ], 147 | "metadata": { 148 | "kernelspec": { 149 | "display_name": "Python 3", 150 | "language": "python", 151 | "name": "python3" 152 | }, 153 | "language_info": { 154 | "codemirror_mode": { 155 | "name": "ipython", 156 | "version": 3 157 | }, 158 | "file_extension": ".py", 159 | "mimetype": "text/x-python", 160 | "name": "python", 161 | "nbconvert_exporter": "python", 162 | "pygments_lexer": "ipython3", 163 | "version": "3.7.3" 164 | } 165 | }, 166 | "nbformat": 4, 167 | "nbformat_minor": 2 168 | } 169 | -------------------------------------------------------------------------------- /SEIR_Logistic/general-20200216.csv: -------------------------------------------------------------------------------- 1 | date,province_code,province,confirmed,suspected,cured,dead 2 | 20191201,420000,湖北省,1,0,0,0 3 | 20191202,420000,湖北省,1,0,0,0 4 | 20191203,420000,湖北省,1,0,0,0 5 | 20191204,420000,湖北省,1,0,0,0 6 | 20191205,420000,湖北省,1,0,0,0 7 | 20191206,420000,湖北省,1,0,0,0 8 | 20191207,420000,湖北省,1,0,0,0 9 | 20191208,420000,湖北省,1,0,0,0 10 | 20191209,420000,湖北省,1,0,0,0 11 | 20191210,420000,湖北省,1,0,0,0 12 | 20191211,420000,湖北省,4,0,0,0 13 | 20191212,420000,湖北省,4,0,0,0 14 | 20191213,420000,湖北省,4,0,0,0 15 | 20191214,420000,湖北省,4,0,0,0 16 | 20191215,420000,湖北省,6,0,0,0 17 | 20191216,420000,湖北省,6,0,0,0 18 | 20191217,420000,湖北省,7,0,0,0 19 | 20191218,420000,湖北省,8,0,0,0 20 | 20191219,420000,湖北省,9,0,0,0 21 | 20191220,420000,湖北省,14,0,0,0 22 | 20191221,420000,湖北省,18,0,0,0 23 | 20191222,420000,湖北省,21,0,0,0 24 | 20191223,420000,湖北省,29,0,0,0 25 | 20191224,420000,湖北省,30,0,0,0 26 | 20191225,420000,湖北省,33,0,0,0 27 | 20191226,420000,湖北省,35,0,0,0 28 | 20191227,420000,湖北省,37,0,0,0 29 | 20191228,420000,湖北省,37,0,0,0 30 | 20191229,420000,湖北省,37,0,0,0 31 | 20191230,420000,湖北省,37,0,0,0 32 | 20191231,420000,湖北省,40,0,0,0 33 | 20200101,420000,湖北省,43,0,0,0 34 | 20200102,420000,湖北省,44,0,0,0 35 | 20200103,420000,湖北省,41,0,0,0 36 | 20200104,420000,湖北省,41,0,0,0 37 | 20200105,420000,湖北省,41,0,0,0 38 | 20200106,420000,湖北省,41,0,0,0 39 | 20200107,420000,湖北省,41,0,0,0 40 | 20200108,420000,湖北省,41,0,0,0 41 | 20200109,420000,湖北省,41,0,0,0 42 | 20200110,420000,湖北省,41,0,2,1 43 | 20200111,420000,湖北省,41,0,6,1 44 | 20200112,420000,湖北省,41,0,7,1 45 | 20200113,420000,湖北省,41,0,7,1 46 | 20200114,420000,湖北省,41,0,7,1 47 | 20200115,420000,湖北省,41,0,12,2 48 | 20200116,420000,湖北省,45,0,15,2 49 | 20200117,420000,湖北省,62,0,19,2 50 | 20200118,420000,湖北省,121,0,24,3 51 | 20200119,420000,湖北省,198,0,25,3 52 | 20200119,440000,广东省,1,0,0,0 53 | 20200120,110000,北京市,5,0,0,0 54 | 20200120,220000,吉林省,0,1,0,0 55 | 20200120,310000,上海市,1,0,0,0 56 | 20200120,330000,浙江省,0,16,0,0 57 | 20200120,340000,安徽省,0,1,0,0 58 | 20200120,360000,江西省,0,2,0,0 59 | 20200120,370000,山东省,0,1,0,0 60 | 20200120,420000,湖北省,270,0,25,6 61 | 20200120,440000,广东省,14,7,0,0 62 | 20200120,450000,广西壮族自治区,0,1,0,0 63 | 20200120,460000,海南省,0,1,0,0 64 | 20200120,510000,四川省,0,3,0,0 65 | 20200120,520000,贵州省,0,1,0,0 66 | 20200120,530000,云南省,0,1,0,0 67 | 20200120,640000,宁夏回族自治区,0,1,0,0 68 | 20200121,110000,北京市,10,0,0,0 69 | 20200121,120000,天津市,2,0,0,0 70 | 20200121,140000,山西省,0,1,0,0 71 | 20200121,220000,吉林省,0,1,0,0 72 | 20200121,230000,黑龙江省,0,1,0,0 73 | 20200121,310000,上海市,6,3,0,0 74 | 20200121,330000,浙江省,5,0,0,0 75 | 20200121,340000,安徽省,0,1,0,0 76 | 20200121,360000,江西省,2,0,0,0 77 | 20200121,370000,山东省,1,0,0,0 78 | 20200121,410000,河南省,1,0,0,0 79 | 20200121,420000,湖北省,375,0,28,9 80 | 20200121,430000,湖南省,1,0,0,0 81 | 20200121,440000,广东省,26,0,0,0 82 | 20200121,450000,广西壮族自治区,0,2,0,0 83 | 20200121,460000,海南省,0,1,0,0 84 | 20200121,500000,重庆市,5,0,0,0 85 | 20200121,510000,四川省,2,5,0,0 86 | 20200121,520000,贵州省,0,1,0,0 87 | 20200121,530000,云南省,1,0,0,0 88 | 20200121,640000,宁夏回族自治区,0,1,0,0 89 | 20200122,110000,北京市,14,0,0,0 90 | 20200122,120000,天津市,4,0,0,0 91 | 20200122,130000,河北省,1,0,0,0 92 | 20200122,140000,山西省,1,0,0,0 93 | 20200122,210000,辽宁省,2,0,0,0 94 | 20200122,220000,吉林省,1,0,0,0 95 | 20200122,230000,黑龙江省,1,0,0,0 96 | 20200122,310000,上海市,16,22,0,0 97 | 20200122,320000,江苏省,1,0,0,0 98 | 20200122,330000,浙江省,10,0,0,0 99 | 20200122,340000,安徽省,1,4,0,0 100 | 20200122,350000,福建省,1,0,0,0 101 | 20200122,360000,江西省,3,0,0,0 102 | 20200122,370000,山东省,6,0,0,0 103 | 20200122,410000,河南省,5,0,0,0 104 | 20200122,420000,湖北省,444,0,28,17 105 | 20200122,430000,湖南省,4,0,0,0 106 | 20200122,440000,广东省,32,0,0,0 107 | 20200122,450000,广西壮族自治区,2,1,0,0 108 | 20200122,460000,海南省,5,32,0,0 109 | 20200122,500000,重庆市,9,0,0,0 110 | 20200122,510000,四川省,5,2,0,0 111 | 20200122,520000,贵州省,3,0,0,0 112 | 20200122,610000,陕西省,4,0,0,0 113 | 20200122,640000,宁夏回族自治区,1,0,0,0 114 | 20200123,110000,北京市,22,0,0,0 115 | 20200123,120000,天津市,5,0,0,0 116 | 20200123,130000,河北省,2,0,0,1 117 | 20200123,140000,山西省,1,0,0,0 118 | 20200123,150000,内蒙古自治区,1,2,0,0 119 | 20200123,210000,辽宁省,4,0,0,0 120 | 20200123,220000,吉林省,3,0,0,0 121 | 20200123,230000,黑龙江省,4,0,0,1 122 | 20200123,310000,上海市,20,34,0,0 123 | 20200123,320000,江苏省,9,0,0,0 124 | 20200123,330000,浙江省,43,0,1,0 125 | 20200123,340000,安徽省,15,0,0,0 126 | 20200123,350000,福建省,4,0,0,0 127 | 20200123,360000,江西省,7,0,0,0 128 | 20200123,370000,山东省,9,0,0,0 129 | 20200123,410000,河南省,9,0,0,0 130 | 20200123,420000,湖北省,549,0,31,24 131 | 20200123,430000,湖南省,24,0,0,0 132 | 20200123,440000,广东省,53,0,2,0 133 | 20200123,450000,广西壮族自治区,13,0,0,0 134 | 20200123,460000,海南省,8,0,0,0 135 | 20200123,500000,重庆市,27,0,0,0 136 | 20200123,510000,四川省,15,0,0,0 137 | 20200123,520000,贵州省,3,0,0,0 138 | 20200123,530000,云南省,2,0,0,0 139 | 20200123,610000,陕西省,5,0,0,0 140 | 20200123,620000,甘肃省,2,1,0,0 141 | 20200123,640000,宁夏回族自治区,2,1,0,0 142 | 20200123,650000,新疆维吾尔自治区,2,0,0,0 143 | 20200124,110000,北京市,36,0,0,0 144 | 20200124,120000,天津市,8,0,0,0 145 | 20200124,130000,河北省,8,0,0,1 146 | 20200124,140000,山西省,6,0,0,0 147 | 20200124,150000,内蒙古自治区,2,5,0,0 148 | 20200124,210000,辽宁省,12,0,0,0 149 | 20200124,220000,吉林省,4,0,0,0 150 | 20200124,230000,黑龙江省,9,0,0,1 151 | 20200124,310000,上海市,33,72,1,0 152 | 20200124,320000,江苏省,18,0,1,0 153 | 20200124,330000,浙江省,62,0,1,0 154 | 20200124,340000,安徽省,39,0,0,0 155 | 20200124,350000,福建省,10,4,0,0 156 | 20200124,360000,江西省,18,0,0,0 157 | 20200124,370000,山东省,21,11,0,0 158 | 20200124,410000,河南省,32,1,0,0 159 | 20200124,420000,湖北省,729,0,32,39 160 | 20200124,430000,湖南省,43,0,0,0 161 | 20200124,440000,广东省,78,0,2,0 162 | 20200124,450000,广西壮族自治区,23,0,0,0 163 | 20200124,460000,海南省,17,0,0,0 164 | 20200124,500000,重庆市,57,0,0,0 165 | 20200124,510000,四川省,28,0,0,0 166 | 20200124,520000,贵州省,4,0,0,0 167 | 20200124,530000,云南省,5,0,0,0 168 | 20200124,610000,陕西省,15,0,0,0 169 | 20200124,620000,甘肃省,4,0,0,0 170 | 20200124,630000,青海省,0,1,0,0 171 | 20200124,640000,宁夏回族自治区,3,1,0,0 172 | 20200124,650000,新疆维吾尔自治区,3,0,0,0 173 | 20200125,110000,北京市,41,0,0,0 174 | 20200125,120000,天津市,10,0,0,0 175 | 20200125,130000,河北省,13,0,0,1 176 | 20200125,140000,山西省,9,0,0,0 177 | 20200125,150000,内蒙古自治区,7,0,0,0 178 | 20200125,210000,辽宁省,16,0,0,0 179 | 20200125,220000,吉林省,4,0,0,0 180 | 20200125,230000,黑龙江省,15,17,0,1 181 | 20200125,310000,上海市,40,95,1,1 182 | 20200125,320000,江苏省,31,0,1,0 183 | 20200125,330000,浙江省,104,0,1,0 184 | 20200125,340000,安徽省,60,0,0,0 185 | 20200125,350000,福建省,18,20,0,0 186 | 20200125,360000,江西省,36,0,0,0 187 | 20200125,370000,山东省,39,11,0,0 188 | 20200125,410000,河南省,83,3,0,1 189 | 20200125,420000,湖北省,1052,0,42,52 190 | 20200125,430000,湖南省,69,0,0,0 191 | 20200125,440000,广东省,98,0,2,0 192 | 20200125,450000,广西壮族自治区,33,0,0,0 193 | 20200125,460000,海南省,22,0,0,0 194 | 20200125,500000,重庆市,75,0,0,0 195 | 20200125,510000,四川省,44,0,0,0 196 | 20200125,520000,贵州省,5,0,0,0 197 | 20200125,530000,云南省,11,0,0,0 198 | 20200125,610000,陕西省,22,0,0,0 199 | 20200125,620000,甘肃省,7,0,0,0 200 | 20200125,630000,青海省,1,0,0,0 201 | 20200125,640000,宁夏回族自治区,4,1,0,0 202 | 20200125,650000,新疆维吾尔自治区,4,0,0,0 203 | 20200126,110000,北京市,68,0,0,0 204 | 20200126,120000,天津市,14,0,0,0 205 | 20200126,130000,河北省,18,16,0,1 206 | 20200126,140000,山西省,13,0,0,0 207 | 20200126,150000,内蒙古自治区,11,1,0,0 208 | 20200126,210000,辽宁省,22,0,0,0 209 | 20200126,220000,吉林省,6,0,0,0 210 | 20200126,230000,黑龙江省,21,48,0,1 211 | 20200126,310000,上海市,53,90,1,1 212 | 20200126,320000,江苏省,47,0,1,0 213 | 20200126,330000,浙江省,128,0,1,0 214 | 20200126,340000,安徽省,70,0,0,0 215 | 20200126,350000,福建省,35,39,0,0 216 | 20200126,360000,江西省,48,0,0,0 217 | 20200126,370000,山东省,63,33,0,0 218 | 20200126,410000,河南省,128,18,0,1 219 | 20200126,420000,湖北省,1423,0,44,76 220 | 20200126,430000,湖南省,100,0,0,0 221 | 20200126,440000,广东省,146,0,2,0 222 | 20200126,450000,广西壮族自治区,46,0,0,0 223 | 20200126,460000,海南省,31,0,0,1 224 | 20200126,500000,重庆市,110,0,0,0 225 | 20200126,510000,四川省,69,0,0,0 226 | 20200126,520000,贵州省,7,3,0,0 227 | 20200126,530000,云南省,19,36,0,0 228 | 20200126,610000,陕西省,35,0,0,0 229 | 20200126,620000,甘肃省,14,0,0,0 230 | 20200126,630000,青海省,4,0,0,0 231 | 20200126,640000,宁夏回族自治区,7,0,0,0 232 | 20200126,650000,新疆维吾尔自治区,5,0,0,0 233 | 20200127,110000,北京市,80,0,2,1 234 | 20200127,120000,天津市,23,0,0,0 235 | 20200127,130000,河北省,33,54,0,1 236 | 20200127,140000,山西省,20,0,0,0 237 | 20200127,150000,内蒙古自治区,13,2,0,0 238 | 20200127,210000,辽宁省,27,0,0,0 239 | 20200127,220000,吉林省,8,0,0,0 240 | 20200127,230000,黑龙江省,30,67,0,1 241 | 20200127,310000,上海市,66,129,3,1 242 | 20200127,320000,江苏省,70,0,1,0 243 | 20200127,330000,浙江省,173,0,1,0 244 | 20200127,340000,安徽省,106,38,0,0 245 | 20200127,350000,福建省,59,46,0,0 246 | 20200127,360000,江西省,72,0,0,0 247 | 20200127,370000,山东省,63,42,0,0 248 | 20200127,410000,河南省,168,100,0,1 249 | 20200127,420000,湖北省,2714,0,47,100 250 | 20200127,430000,湖南省,143,0,0,0 251 | 20200127,440000,广东省,188,0,4,0 252 | 20200127,450000,广西壮族自治区,51,0,0,0 253 | 20200127,460000,海南省,40,0,0,1 254 | 20200127,500000,重庆市,132,0,0,0 255 | 20200127,510000,四川省,90,0,0,0 256 | 20200127,520000,贵州省,9,1,0,0 257 | 20200127,530000,云南省,44,125,0,0 258 | 20200127,610000,陕西省,46,0,0,0 259 | 20200127,620000,甘肃省,19,0,0,0 260 | 20200127,630000,青海省,6,0,0,0 261 | 20200127,640000,宁夏回族自治区,11,0,0,0 262 | 20200127,650000,新疆维吾尔自治区,10,0,0,0 263 | 20200128,110000,北京市,91,0,4,1 264 | 20200128,120000,天津市,24,0,0,0 265 | 20200128,130000,河北省,48,56,0,1 266 | 20200128,140000,山西省,27,0,0,0 267 | 20200128,150000,内蒙古自治区,16,2,0,0 268 | 20200128,210000,辽宁省,34,0,0,0 269 | 20200128,220000,吉林省,9,0,0,0 270 | 20200128,230000,黑龙江省,37,87,0,1 271 | 20200128,310000,上海市,80,167,4,1 272 | 20200128,320000,江苏省,99,0,1,0 273 | 20200128,330000,浙江省,296,0,3,0 274 | 20200128,340000,安徽省,152,42,0,0 275 | 20200128,350000,福建省,80,67,0,0 276 | 20200128,360000,江西省,109,0,3,0 277 | 20200128,370000,山东省,121,55,0,0 278 | 20200128,410000,河南省,206,78,1,2 279 | 20200128,420000,湖北省,3554,0,80,125 280 | 20200128,430000,湖南省,221,0,0,0 281 | 20200128,440000,广东省,241,0,5,0 282 | 20200128,450000,广西壮族自治区,58,0,2,0 283 | 20200128,460000,海南省,43,0,0,1 284 | 20200128,500000,重庆市,147,0,0,0 285 | 20200128,510000,四川省,108,0,0,0 286 | 20200128,520000,贵州省,9,3,1,0 287 | 20200128,530000,云南省,51,163,0,0 288 | 20200128,540000,西藏自治区,0,1,0,0 289 | 20200128,610000,陕西省,56,0,0,0 290 | 20200128,620000,甘肃省,24,0,0,0 291 | 20200128,630000,青海省,6,0,0,0 292 | 20200128,640000,宁夏回族自治区,12,2,0,0 293 | 20200128,650000,新疆维吾尔自治区,13,0,0,0 294 | 20200129,110000,北京市,114,0,4,1 295 | 20200129,120000,天津市,27,0,0,0 296 | 20200129,130000,河北省,65,68,0,1 297 | 20200129,140000,山西省,35,0,1,0 298 | 20200129,150000,内蒙古自治区,18,1,0,0 299 | 20200129,210000,辽宁省,41,0,1,0 300 | 20200129,220000,吉林省,14,10,0,0 301 | 20200129,230000,黑龙江省,43,105,0,1 302 | 20200129,310000,上海市,101,180,5,1 303 | 20200129,320000,江苏省,129,0,1,0 304 | 20200129,330000,浙江省,428,0,4,0 305 | 20200129,340000,安徽省,200,45,2,0 306 | 20200129,350000,福建省,101,111,0,0 307 | 20200129,360000,江西省,162,0,3,0 308 | 20200129,370000,山东省,145,79,1,0 309 | 20200129,410000,河南省,206,29,2,2 310 | 20200129,420000,湖北省,4586,0,90,162 311 | 20200129,430000,湖南省,277,0,0,0 312 | 20200129,440000,广东省,311,0,6,0 313 | 20200129,450000,广西壮族自治区,78,0,2,0 314 | 20200129,460000,海南省,46,0,1,1 315 | 20200129,500000,重庆市,165,0,1,0 316 | 20200129,510000,四川省,142,0,1,1 317 | 20200129,520000,贵州省,12,6,1,0 318 | 20200129,530000,云南省,70,191,0,0 319 | 20200129,540000,西藏自治区,1,0,0,0 320 | 20200129,610000,陕西省,63,116,0,0 321 | 20200129,620000,甘肃省,26,0,0,0 322 | 20200129,630000,青海省,6,1,0,0 323 | 20200129,640000,宁夏回族自治区,17,1,0,0 324 | 20200129,650000,新疆维吾尔自治区,14,0,0,0 325 | 20200130,110000,北京市,132,0,5,1 326 | 20200130,120000,天津市,31,0,0,0 327 | 20200130,130000,河北省,82,78,0,1 328 | 20200130,140000,山西省,39,0,1,0 329 | 20200130,150000,内蒙古自治区,20,1,0,0 330 | 20200130,210000,辽宁省,45,0,1,0 331 | 20200130,220000,吉林省,14,10,1,0 332 | 20200130,230000,黑龙江省,59,128,0,2 333 | 20200130,310000,上海市,128,164,5,1 334 | 20200130,320000,江苏省,168,0,2,0 335 | 20200130,330000,浙江省,537,0,9,0 336 | 20200130,340000,安徽省,237,70,3,0 337 | 20200130,350000,福建省,120,116,0,0 338 | 20200130,360000,江西省,240,0,7,0 339 | 20200130,370000,山东省,178,90,2,0 340 | 20200130,410000,河南省,352,4,3,2 341 | 20200130,420000,湖北省,5806,0,116,204 342 | 20200130,430000,湖南省,332,0,2,0 343 | 20200130,440000,广东省,393,0,9,0 344 | 20200130,450000,广西壮族自治区,87,0,2,0 345 | 20200130,460000,海南省,49,0,1,1 346 | 20200130,500000,重庆市,206,0,1,0 347 | 20200130,510000,四川省,177,0,1,1 348 | 20200130,520000,贵州省,15,61,1,0 349 | 20200130,530000,云南省,80,236,0,0 350 | 20200130,540000,西藏自治区,1,0,0,0 351 | 20200130,610000,陕西省,87,132,0,0 352 | 20200130,620000,甘肃省,29,0,0,0 353 | 20200130,630000,青海省,8,0,0,0 354 | 20200130,640000,宁夏回族自治区,21,1,0,0 355 | 20200130,650000,新疆维吾尔自治区,17,0,0,0 356 | 20200131,110000,北京市,156,0,5,1 357 | 20200131,120000,天津市,32,0,0,0 358 | 20200131,130000,河北省,96,88,0,1 359 | 20200131,140000,山西省,47,75,1,0 360 | 20200131,150000,内蒙古自治区,23,5,1,0 361 | 20200131,210000,辽宁省,60,0,1,0 362 | 20200131,220000,吉林省,17,10,1,0 363 | 20200131,230000,黑龙江省,80,149,0,2 364 | 20200131,310000,上海市,153,167,9,1 365 | 20200131,320000,江苏省,202,0,5,0 366 | 20200131,330000,浙江省,599,0,15,0 367 | 20200131,340000,安徽省,297,0,3,0 368 | 20200131,350000,福建省,144,111,0,0 369 | 20200131,360000,江西省,286,0,9,0 370 | 20200131,370000,山东省,202,83,2,0 371 | 20200131,410000,河南省,422,751,3,2 372 | 20200131,420000,湖北省,7153,0,166,249 373 | 20200131,430000,湖南省,389,0,3,0 374 | 20200131,440000,广东省,520,0,0,0 375 | 20200131,450000,广西壮族自治区,100,0,2,0 376 | 20200131,460000,海南省,57,0,1,1 377 | 20200131,500000,重庆市,238,0,1,1 378 | 20200131,510000,四川省,207,0,3,1 379 | 20200131,520000,贵州省,29,67,2,0 380 | 20200131,530000,云南省,91,228,1,0 381 | 20200131,540000,西藏自治区,1,0,0,0 382 | 20200131,610000,陕西省,101,158,0,0 383 | 20200131,620000,甘肃省,35,0,0,0 384 | 20200131,630000,青海省,9,0,0,0 385 | 20200131,640000,宁夏回族自治区,26,1,0,0 386 | 20200131,650000,新疆维吾尔自治区,18,0,0,0 387 | 20200201,110000,北京市,183,0,9,1 388 | 20200201,120000,天津市,41,0,0,0 389 | 20200201,130000,河北省,104,104,3,1 390 | 20200201,140000,山西省,56,64,1,0 391 | 20200201,150000,内蒙古自治区,27,7,1,0 392 | 20200201,210000,辽宁省,64,0,1,0 393 | 20200201,220000,吉林省,23,14,1,0 394 | 20200201,230000,黑龙江省,95,172,0,2 395 | 20200201,310000,上海市,177,168,10,1 396 | 20200201,320000,江苏省,236,0,6,0 397 | 20200201,330000,浙江省,661,0,23,0 398 | 20200201,340000,安徽省,340,0,5,0 399 | 20200201,350000,福建省,159,99,0,0 400 | 20200201,360000,江西省,333,0,10,0 401 | 20200201,370000,山东省,225,81,5,0 402 | 20200201,410000,河南省,493,754,4,2 403 | 20200201,420000,湖北省,9074,0,215,294 404 | 20200201,430000,湖南省,463,0,8,0 405 | 20200201,440000,广东省,604,0,12,0 406 | 20200201,450000,广西壮族自治区,111,0,2,0 407 | 20200201,460000,海南省,63,0,1,1 408 | 20200201,500000,重庆市,262,0,3,1 409 | 20200201,510000,四川省,231,0,3,1 410 | 20200201,520000,贵州省,38,65,2,0 411 | 20200201,530000,云南省,99,261,2,0 412 | 20200201,540000,西藏自治区,1,0,0,0 413 | 20200201,610000,陕西省,116,201,0,0 414 | 20200201,620000,甘肃省,40,0,0,0 415 | 20200201,630000,青海省,9,0,0,0 416 | 20200201,640000,宁夏回族自治区,28,8,0,0 417 | 20200201,650000,新疆维吾尔自治区,21,0,0,0 418 | 20200202,110000,北京市,212,0,12,1 419 | 20200202,120000,天津市,48,0,1,0 420 | 20200202,130000,河北省,113,108,3,1 421 | 20200202,140000,山西省,66,64,2,0 422 | 20200202,150000,内蒙古自治区,34,3,1,0 423 | 20200202,210000,辽宁省,70,0,1,0 424 | 20200202,220000,吉林省,31,17,1,0 425 | 20200202,230000,黑龙江省,118,163,2,2 426 | 20200202,310000,上海市,193,173,10,1 427 | 20200202,320000,江苏省,271,0,7,0 428 | 20200202,330000,浙江省,724,0,36,0 429 | 20200202,340000,安徽省,408,0,7,0 430 | 20200202,350000,福建省,179,96,0,0 431 | 20200202,360000,江西省,391,0,18,0 432 | 20200202,370000,山东省,246,62,6,0 433 | 20200202,410000,河南省,566,26,14,2 434 | 20200202,420000,湖北省,11177,0,295,350 435 | 20200202,430000,湖南省,521,0,16,0 436 | 20200202,440000,广东省,683,0,14,0 437 | 20200202,450000,广西壮族自治区,127,0,2,0 438 | 20200202,460000,海南省,70,0,4,1 439 | 20200202,500000,重庆市,300,0,7,2 440 | 20200202,510000,四川省,254,0,12,1 441 | 20200202,520000,贵州省,46,46,2,0 442 | 20200202,530000,云南省,109,252,3,0 443 | 20200202,540000,西藏自治区,1,0,0,0 444 | 20200202,610000,陕西省,128,205,0,0 445 | 20200202,620000,甘肃省,51,0,3,0 446 | 20200202,630000,青海省,13,0,0,0 447 | 20200202,640000,宁夏回族自治区,31,12,0,0 448 | 20200202,650000,新疆维吾尔自治区,24,0,0,0 449 | 20200203,110000,北京市,228,0,23,1 450 | 20200203,120000,天津市,60,0,1,0 451 | 20200203,130000,河北省,126,93,3,1 452 | 20200203,140000,山西省,74,62,2,0 453 | 20200203,150000,内蒙古自治区,35,3,1,0 454 | 20200203,210000,辽宁省,74,0,1,0 455 | 20200203,220000,吉林省,42,24,1,0 456 | 20200203,230000,黑龙江省,155,178,2,2 457 | 20200203,310000,上海市,208,168,10,1 458 | 20200203,320000,江苏省,308,0,8,0 459 | 20200203,330000,浙江省,829,0,48,0 460 | 20200203,340000,安徽省,480,0,14,0 461 | 20200203,350000,福建省,194,87,1,0 462 | 20200203,360000,江西省,476,0,19,0 463 | 20200203,370000,山东省,270,70,7,0 464 | 20200203,410000,河南省,675,44,20,2 465 | 20200203,420000,湖北省,13522,0,396,414 466 | 20200203,430000,湖南省,593,0,22,0 467 | 20200203,440000,广东省,797,180,20,0 468 | 20200203,450000,广西壮族自治区,139,0,7,0 469 | 20200203,460000,海南省,79,0,4,1 470 | 20200203,500000,重庆市,337,0,9,2 471 | 20200203,510000,四川省,282,0,14,1 472 | 20200203,520000,贵州省,56,26,2,0 473 | 20200203,530000,云南省,117,225,5,0 474 | 20200203,540000,西藏自治区,1,0,0,0 475 | 20200203,610000,陕西省,142,221,1,0 476 | 20200203,620000,甘肃省,55,9,3,0 477 | 20200203,630000,青海省,15,0,0,0 478 | 20200203,640000,宁夏回族自治区,34,18,0,0 479 | 20200203,650000,新疆维吾尔自治区,29,0,0,0 480 | 20200204,110000,北京市,253,0,24,1 481 | 20200204,120000,天津市,67,0,2,0 482 | 20200204,130000,河北省,135,117,4,1 483 | 20200204,140000,山西省,81,42,4,0 484 | 20200204,150000,内蒙古自治区,42,3,1,0 485 | 20200204,210000,辽宁省,81,0,2,0 486 | 20200204,220000,吉林省,54,58,1,0 487 | 20200204,230000,黑龙江省,190,184,4,2 488 | 20200204,310000,上海市,233,194,12,1 489 | 20200204,320000,江苏省,341,0,13,0 490 | 20200204,330000,浙江省,895,0,63,0 491 | 20200204,340000,安徽省,530,0,20,0 492 | 20200204,350000,福建省,205,91,7,0 493 | 20200204,360000,江西省,548,0,27,0 494 | 20200204,370000,山东省,298,94,13,0 495 | 20200204,410000,河南省,764,52,41,2 496 | 20200204,420000,湖北省,16678,0,520,479 497 | 20200204,430000,湖南省,661,0,35,0 498 | 20200204,440000,广东省,870,136,32,0 499 | 20200204,450000,广西壮族自治区,150,0,10,0 500 | 20200204,460000,海南省,89,0,4,1 501 | 20200204,500000,重庆市,366,0,14,2 502 | 20200204,510000,四川省,301,0,23,1 503 | 20200204,520000,贵州省,64,33,5,0 504 | 20200204,530000,云南省,122,172,5,0 505 | 20200204,540000,西藏自治区,1,0,0,0 506 | 20200204,610000,陕西省,165,215,2,0 507 | 20200204,620000,甘肃省,57,17,4,0 508 | 20200204,630000,青海省,17,0,0,0 509 | 20200204,640000,宁夏回族自治区,34,24,0,0 510 | 20200204,650000,新疆维吾尔自治区,32,0,0,0 511 | 20200205,110000,北京市,274,0,31,1 512 | 20200205,120000,天津市,69,0,2,1 513 | 20200205,130000,河北省,157,133,7,1 514 | 20200205,140000,山西省,90,42,6,0 515 | 20200205,150000,内蒙古自治区,46,7,4,0 516 | 20200205,210000,辽宁省,89,0,4,0 517 | 20200205,220000,吉林省,59,69,2,0 518 | 20200205,230000,黑龙江省,227,222,7,3 519 | 20200205,310000,上海市,254,196,15,1 520 | 20200205,320000,江苏省,373,0,26,0 521 | 20200205,330000,浙江省,954,0,81,0 522 | 20200205,340000,安徽省,591,0,23,0 523 | 20200205,350000,福建省,215,78,11,0 524 | 20200205,360000,江西省,600,0,37,0 525 | 20200205,370000,山东省,343,85,18,0 526 | 20200205,410000,河南省,851,45,54,2 527 | 20200205,420000,湖北省,19665,0,633,549 528 | 20200205,430000,湖南省,711,0,56,0 529 | 20200205,440000,广东省,944,148,49,0 530 | 20200205,450000,广西壮族自治区,168,391,14,0 531 | 20200205,460000,海南省,100,0,5,1 532 | 20200205,500000,重庆市,389,0,15,2 533 | 20200205,510000,四川省,321,0,27,1 534 | 20200205,520000,贵州省,69,37,6,0 535 | 20200205,530000,云南省,128,149,5,0 536 | 20200205,540000,西藏自治区,1,0,0,0 537 | 20200205,610000,陕西省,173,238,6,0 538 | 20200205,620000,甘肃省,62,14,6,0 539 | 20200205,630000,青海省,18,0,3,0 540 | 20200205,640000,宁夏回族自治区,40,39,1,0 541 | 20200205,650000,新疆维吾尔自治区,36,0,0,0 542 | 20200206,110000,北京市,297,157,33,1 543 | 20200206,120000,天津市,79,0,2,0 544 | 20200206,130000,河北省,171,117,16,1 545 | 20200206,140000,山西省,96,54,12,0 546 | 20200206,150000,内蒙古自治区,50,9,0,0 547 | 20200206,210000,辽宁省,95,0,6,0 548 | 20200206,220000,吉林省,65,71,4,1 549 | 20200206,230000,黑龙江省,277,210,8,3 550 | 20200206,310000,上海市,269,166,25,1 551 | 20200206,320000,江苏省,408,0,38,0 552 | 20200206,330000,浙江省,1006,0,98,0 553 | 20200206,340000,安徽省,665,0,34,0 554 | 20200206,350000,福建省,224,94,15,0 555 | 20200206,360000,江西省,661,0,45,0 556 | 20200206,370000,山东省,379,96,31,0 557 | 20200206,410000,河南省,914,66,68,3 558 | 20200206,420000,湖北省,22112,0,817,618 559 | 20200206,430000,湖南省,772,0,91,0 560 | 20200206,440000,广东省,1018,170,68,0 561 | 20200206,450000,广西壮族自治区,172,0,17,0 562 | 20200206,460000,海南省,111,0,8,2 563 | 20200206,500000,重庆市,411,0,24,2 564 | 20200206,510000,四川省,344,0,37,1 565 | 20200206,520000,贵州省,77,54,6,0 566 | 20200206,530000,云南省,135,123,7,0 567 | 20200206,540000,西藏自治区,1,0,0,0 568 | 20200206,610000,陕西省,184,260,11,0 569 | 20200206,620000,甘肃省,67,21,9,0 570 | 20200206,630000,青海省,18,0,3,0 571 | 20200206,640000,宁夏回族自治区,43,39,1,0 572 | 20200206,650000,新疆维吾尔自治区,39,0,0,0 573 | 20200207,110000,北京市,315,0,34,2 574 | 20200207,120000,天津市,81,0,2,1 575 | 20200207,130000,河北省,195,0,25,1 576 | 20200207,140000,山西省,104,0,15,0 577 | 20200207,150000,内蒙古自治区,52,0,5,0 578 | 20200207,210000,辽宁省,99,0,7,0 579 | 20200207,220000,吉林省,69,0,4,1 580 | 20200207,230000,黑龙江省,281,0,12,5 581 | 20200207,310000,上海市,281,0,30,1 582 | 20200207,320000,江苏省,439,0,43,0 583 | 20200207,330000,浙江省,1048,0,127,0 584 | 20200207,340000,安徽省,733,0,47,0 585 | 20200207,350000,福建省,239,0,20,0 586 | 20200207,360000,江西省,698,0,55,0 587 | 20200207,370000,山东省,407,0,38,0 588 | 20200207,410000,河南省,980,0,97,4 589 | 20200207,420000,湖北省,24953,0,1115,699 590 | 20200207,430000,湖南省,803,0,119,0 591 | 20200207,440000,广东省,1075,0,97,1 592 | 20200207,450000,广西壮族自治区,183,0,17,0 593 | 20200207,460000,海南省,122,0,11,2 594 | 20200207,500000,重庆市,426,0,31,2 595 | 20200207,510000,四川省,363,0,50,1 596 | 20200207,520000,贵州省,89,0,6,1 597 | 20200207,530000,云南省,138,0,12,0 598 | 20200207,540000,西藏自治区,1,0,0,0 599 | 20200207,610000,陕西省,184,0,9,0 600 | 20200207,620000,甘肃省,71,0,9,1 601 | 20200207,630000,青海省,18,0,3,0 602 | 20200207,640000,宁夏回族自治区,44,0,5,0 603 | 20200207,650000,新疆维吾尔自治区,42,0,0,0 604 | 20200208,110000,北京市,326,0,37,2 605 | 20200208,120000,天津市,88,0,4,1 606 | 20200208,130000,河北省,206,0,30,2 607 | 20200208,140000,山西省,115,0,21,0 608 | 20200208,150000,内蒙古自治区,54,0,5,0 609 | 20200208,210000,辽宁省,106,0,12,0 610 | 20200208,220000,吉林省,78,0,5,1 611 | 20200208,230000,黑龙江省,307,0,13,6 612 | 20200208,310000,上海市,292,0,41,1 613 | 20200208,320000,江苏省,468,0,51,0 614 | 20200208,330000,浙江省,1063,0,173,0 615 | 20200208,340000,安徽省,779,0,59,1 616 | 20200208,350000,福建省,250,0,24,0 617 | 20200208,360000,江西省,739,0,72,0 618 | 20200208,370000,山东省,435,0,50,1 619 | 20200208,410000,河南省,1033,0,131,6 620 | 20200208,420000,湖北省,27013,0,1439,780 621 | 20200208,430000,湖南省,838,0,159,1 622 | 20200208,440000,广东省,1120,0,125,1 623 | 20200208,450000,广西壮族自治区,195,0,18,1 624 | 20200208,460000,海南省,128,0,15,2 625 | 20200208,500000,重庆市,446,0,39,2 626 | 20200208,510000,四川省,386,0,60,1 627 | 20200208,520000,贵州省,96,0,7,1 628 | 20200208,530000,云南省,140,0,17,0 629 | 20200208,540000,西藏自治区,1,0,0,0 630 | 20200208,610000,陕西省,195,0,17,0 631 | 20200208,620000,甘肃省,79,0,12,1 632 | 20200208,630000,青海省,18,0,3,0 633 | 20200208,640000,宁夏回族自治区,45,0,13,0 634 | 20200208,650000,新疆维吾尔自治区,45,0,0,0 635 | 20200209,110000,北京市,337,0,44,2 636 | 20200209,120000,天津市,91,0,4,1 637 | 20200209,130000,河北省,218,0,35,2 638 | 20200209,140000,山西省,119,0,25,0 639 | 20200209,150000,内蒙古自治区,58,0,5,0 640 | 20200209,210000,辽宁省,108,0,12,0 641 | 20200209,220000,吉林省,80,0,12,1 642 | 20200209,230000,黑龙江省,331,0,15,7 643 | 20200209,310000,上海市,295,0,44,1 644 | 20200209,320000,江苏省,492,0,72,0 645 | 20200209,330000,浙江省,1092,0,200,0 646 | 20200209,340000,安徽省,830,0,73,3 647 | 20200209,350000,福建省,261,0,35,0 648 | 20200209,360000,江西省,772,0,102,1 649 | 20200209,370000,山东省,459,0,63,1 650 | 20200209,410000,河南省,1073,0,169,6 651 | 20200209,420000,湖北省,29631,0,1795,871 652 | 20200209,430000,湖南省,879,0,186,1 653 | 20200209,440000,广东省,1151,0,143,1 654 | 20200209,450000,广西壮族自治区,210,0,18,1 655 | 20200209,460000,海南省,136,0,19,3 656 | 20200209,500000,重庆市,468,0,51,2 657 | 20200209,510000,四川省,405,0,76,1 658 | 20200209,520000,贵州省,109,0,7,1 659 | 20200209,530000,云南省,141,0,18,0 660 | 20200209,540000,西藏自治区,1,0,0,0 661 | 20200209,610000,陕西省,208,0,20,0 662 | 20200209,620000,甘肃省,83,0,16,2 663 | 20200209,630000,青海省,18,0,3,0 664 | 20200209,640000,宁夏回族自治区,49,0,13,0 665 | 20200209,650000,新疆维吾尔自治区,49,0,0,0 666 | 20200210,110000,北京市,342,0,48,3 667 | 20200210,120000,天津市,95,0,8,2 668 | 20200210,130000,河北省,239,0,41,2 669 | 20200210,140000,山西省,122,0,26,0 670 | 20200210,150000,内蒙古自治区,58,0,5,0 671 | 20200210,210000,辽宁省,108,0,17,0 672 | 20200210,220000,吉林省,81,0,13,1 673 | 20200210,230000,黑龙江省,360,0,27,8 674 | 20200210,310000,上海市,302,0,48,1 675 | 20200210,320000,江苏省,515,0,84,0 676 | 20200210,330000,浙江省,1117,0,250,0 677 | 20200210,340000,安徽省,860,0,88,4 678 | 20200210,350000,福建省,267,0,39,0 679 | 20200210,360000,江西省,804,0,127,1 680 | 20200210,370000,山东省,486,0,71,1 681 | 20200210,410000,河南省,1105,0,198,7 682 | 20200210,420000,湖北省,31728,0,2222,974 683 | 20200210,430000,湖南省,912,0,213,1 684 | 20200210,440000,广东省,1177,0,181,1 685 | 20200210,450000,广西壮族自治区,215,0,30,1 686 | 20200210,460000,海南省,142,0,19,3 687 | 20200210,500000,重庆市,486,0,66,2 688 | 20200210,510000,四川省,417,0,82,1 689 | 20200210,520000,贵州省,118,0,10,1 690 | 20200210,530000,云南省,149,0,19,0 691 | 20200210,540000,西藏自治区,1,0,0,0 692 | 20200210,610000,陕西省,213,0,26,0 693 | 20200210,620000,甘肃省,86,0,21,2 694 | 20200210,630000,青海省,18,0,3,0 695 | 20200210,640000,宁夏回族自治区,53,0,14,0 696 | 20200210,650000,新疆维吾尔自治区,55,0,0,0 697 | 20200211,110000,北京市,352,0,56,3 698 | 20200211,120000,天津市,106,0,10,2 699 | 20200211,130000,河北省,251,0,48,2 700 | 20200211,140000,山西省,124,0,30,0 701 | 20200211,150000,内蒙古自治区,60,0,5,0 702 | 20200211,210000,辽宁省,116,0,19,0 703 | 20200211,220000,吉林省,83,0,18,1 704 | 20200211,230000,黑龙江省,378,0,28,8 705 | 20200211,310000,上海市,306,0,53,1 706 | 20200211,320000,江苏省,543,0,94,0 707 | 20200211,330000,浙江省,1131,0,279,0 708 | 20200211,340000,安徽省,888,0,108,4 709 | 20200211,350000,福建省,272,0,46,0 710 | 20200211,360000,江西省,844,0,152,1 711 | 20200211,370000,山东省,497,0,80,1 712 | 20200211,410000,河南省,1135,0,231,8 713 | 20200211,420000,湖北省,33366,0,2639,1068 714 | 20200211,430000,湖南省,946,0,263,2 715 | 20200211,440000,广东省,1219,0,241,1 716 | 20200211,450000,广西壮族自治区,222,0,31,1 717 | 20200211,460000,海南省,145,0,20,3 718 | 20200211,500000,重庆市,505,0,79,3 719 | 20200211,510000,四川省,436,0,85,1 720 | 20200211,520000,贵州省,131,0,17,1 721 | 20200211,530000,云南省,154,0,20,0 722 | 20200211,540000,西藏自治区,1,0,0,0 723 | 20200211,610000,陕西省,219,0,31,0 724 | 20200211,620000,甘肃省,86,0,24,2 725 | 20200211,630000,青海省,18,0,5,0 726 | 20200211,640000,宁夏回族自治区,58,0,22,0 727 | 20200211,650000,新疆维吾尔自治区,59,0,3,0 728 | 20200212,110000,北京市,366,0,68,3 729 | 20200212,120000,天津市,112,0,11,2 730 | 20200212,130000,河北省,265,0,54,3 731 | 20200212,140000,山西省,126,0,33,0 732 | 20200212,150000,内蒙古自治区,61,0,6,0 733 | 20200212,210000,辽宁省,116,0,22,0 734 | 20200212,220000,吉林省,84,0,22,1 735 | 20200212,230000,黑龙江省,395,0,31,9 736 | 20200212,310000,上海市,313,0,57,1 737 | 20200212,320000,江苏省,570,0,131,0 738 | 20200212,330000,浙江省,1145,0,327,0 739 | 20200212,340000,安徽省,910,0,128,5 740 | 20200212,350000,福建省,279,0,54,0 741 | 20200212,360000,江西省,872,0,170,1 742 | 20200212,370000,山东省,506,0,98,2 743 | 20200212,410000,河南省,1169,0,258,10 744 | 20200212,420000,湖北省,47163,0,3172,1202 745 | 20200212,430000,湖南省,968,0,312,2 746 | 20200212,440000,广东省,1241,0,284,2 747 | 20200212,450000,广西壮族自治区,222,0,33,2 748 | 20200212,460000,海南省,157,0,27,4 749 | 20200212,500000,重庆市,518,0,102,3 750 | 20200212,510000,四川省,451,0,93,1 751 | 20200212,520000,贵州省,135,0,20,1 752 | 20200212,530000,云南省,155,0,23,0 753 | 20200212,540000,西藏自治区,1,0,1,0 754 | 20200212,610000,陕西省,225,0,36,0 755 | 20200212,620000,甘肃省,87,0,31,2 756 | 20200212,630000,青海省,18,0,9,0 757 | 20200212,640000,宁夏回族自治区,64,0,24,0 758 | 20200212,650000,新疆维吾尔自治区,63,0,3,1 759 | 20200213,110000,北京市,372,0,79,3 760 | 20200213,120000,天津市,119,0,21,3 761 | 20200213,130000,河北省,283,0,69,3 762 | 20200213,140000,山西省,126,0,36,0 763 | 20200213,150000,内蒙古自治区,65,0,6,0 764 | 20200213,210000,辽宁省,116,0,22,1 765 | 20200213,220000,吉林省,86,0,25,1 766 | 20200213,230000,黑龙江省,418,0,37,11 767 | 20200213,310000,上海市,318,0,62,1 768 | 20200213,320000,江苏省,593,0,137,0 769 | 20200213,330000,浙江省,1155,0,367,0 770 | 20200213,340000,安徽省,934,0,166,6 771 | 20200213,350000,福建省,281,0,59,0 772 | 20200213,360000,江西省,900,0,187,1 773 | 20200213,370000,山东省,519,0,111,2 774 | 20200213,410000,河南省,1184,0,313,11 775 | 20200213,420000,湖北省,51986,0,3862,1318 776 | 20200213,430000,湖南省,988,0,352,2 777 | 20200213,440000,广东省,1261,0,332,2 778 | 20200213,450000,广西壮族自治区,226,0,35,2 779 | 20200213,460000,海南省,157,0,30,4 780 | 20200213,500000,重庆市,529,0,128,4 781 | 20200213,510000,四川省,463,0,105,1 782 | 20200213,520000,贵州省,140,0,28,1 783 | 20200213,530000,云南省,162,0,27,0 784 | 20200213,540000,西藏自治区,1,0,1,0 785 | 20200213,610000,陕西省,229,0,44,0 786 | 20200213,620000,甘肃省,90,0,39,2 787 | 20200213,630000,青海省,18,0,11,0 788 | 20200213,640000,宁夏回族自治区,67,0,24,0 789 | 20200213,650000,新疆维吾尔自治区,65,0,6,1 790 | 20200214,110000,北京市,375,0,97,4 791 | 20200214,120000,天津市,120,0,32,3 792 | 20200214,130000,河北省,291,0,86,3 793 | 20200214,140000,山西省,127,0,38,0 794 | 20200214,150000,内蒙古自治区,68,0,6,0 795 | 20200214,210000,辽宁省,119,0,29,1 796 | 20200214,220000,吉林省,88,0,25,1 797 | 20200214,230000,黑龙江省,425,0,48,11 798 | 20200214,310000,上海市,326,0,90,1 799 | 20200214,320000,江苏省,604,0,160,0 800 | 20200214,330000,浙江省,1162,0,409,0 801 | 20200214,340000,安徽省,950,0,198,6 802 | 20200214,350000,福建省,285,0,66,0 803 | 20200214,360000,江西省,913,0,210,1 804 | 20200214,370000,山东省,530,0,139,2 805 | 20200214,410000,河南省,1212,0,356,13 806 | 20200214,420000,湖北省,54406,0,4774,1457 807 | 20200214,430000,湖南省,1001,0,389,2 808 | 20200214,440000,广东省,1294,0,386,2 809 | 20200214,450000,广西壮族自治区,235,0,40,2 810 | 20200214,460000,海南省,162,0,38,4 811 | 20200214,500000,重庆市,537,0,152,5 812 | 20200214,510000,四川省,470,0,115,1 813 | 20200214,520000,贵州省,143,0,33,1 814 | 20200214,530000,云南省,168,0,35,0 815 | 20200214,540000,西藏自治区,1,0,1,0 816 | 20200214,610000,陕西省,230,0,49,0 817 | 20200214,620000,甘肃省,90,0,44,2 818 | 20200214,630000,青海省,18,0,11,0 819 | 20200214,640000,宁夏回族自治区,70,0,27,0 820 | 20200214,650000,新疆维吾尔自治区,70,0,6,1 821 | 20200215,110000,北京市,375,0,97,4 822 | 20200215,120000,天津市,122,0,37,3 823 | 20200215,130000,河北省,300,0,100,3 824 | 20200215,140000,山西省,128,0,46,0 825 | 20200215,150000,内蒙古自治区,68,0,7,0 826 | 20200215,210000,辽宁省,119,0,29,1 827 | 20200215,220000,吉林省,89,0,28,1 828 | 20200215,230000,黑龙江省,445,0,70,11 829 | 20200215,310000,上海市,328,0,124,1 830 | 20200215,320000,江苏省,604,0,186,0 831 | 20200215,330000,浙江省,1162,0,427,0 832 | 20200215,340000,安徽省,950,0,221,6 833 | 20200215,350000,福建省,287,0,77,0 834 | 20200215,360000,江西省,913,0,210,1 835 | 20200215,370000,山东省,537,0,164,2 836 | 20200215,410000,河南省,1231,0,397,13 837 | 20200215,420000,湖北省,56249,0,5623,1596 838 | 20200215,430000,湖南省,1004,0,430,3 839 | 20200215,440000,广东省,1294,0,417,2 840 | 20200215,450000,广西壮族自治区,237,0,46,2 841 | 20200215,460000,海南省,162,0,39,4 842 | 20200215,500000,重庆市,544,0,184,5 843 | 20200215,510000,四川省,481,0,127,3 844 | 20200215,520000,贵州省,144,0,37,1 845 | 20200215,530000,云南省,168,0,40,0 846 | 20200215,540000,西藏自治区,1,0,1,0 847 | 20200215,610000,陕西省,232,0,53,0 848 | 20200215,620000,甘肃省,90,0,49,2 849 | 20200215,630000,青海省,18,0,13,0 850 | 20200215,640000,宁夏回族自治区,70,0,33,0 851 | 20200215,650000,新疆维吾尔自治区,70,0,11,1 852 | 20200216,110000,北京市,380 853 | 20200216,120000,天津市,124 854 | 20200216,130000,河北省,300 855 | 20200216,140000,山西省,128 856 | 20200216,150000,内蒙古自治区,70 857 | 20200216,210000,辽宁省,121 858 | 20200216,220000,吉林省,89 859 | 20200216,230000,黑龙江省,445 860 | 20200216,310000,上海市,328 861 | 20200216,320000,江苏省,617 862 | 20200216,330000,浙江省,1167 863 | 20200216,340000,安徽省,962 864 | 20200216,350000,福建省,287 865 | 20200216,360000,江西省,925 866 | 20200216,370000,山东省,537 867 | 20200216,410000,河南省,1231 868 | 20200216,420000,湖北省,56249 869 | 20200216,430000,湖南省,1004 870 | 20200216,440000,广东省,1316 871 | 20200216,450000,广西壮族自治区,237 872 | 20200216,460000,海南省,162 873 | 20200216,500000,重庆市,547 874 | 20200216,510000,四川省,481 875 | 20200216,520000,贵州省,144 876 | 20200216,530000,云南省,171 877 | 20200216,540000,西藏自治区,1 878 | 20200216,610000,陕西省,236 879 | 20200216,620000,甘肃省,90 880 | 20200216,630000,青海省,18 881 | 20200216,640000,宁夏回族自治区,70 882 | 20200216,650000,新疆维吾尔自治区,71 883 | 20200217,110000,北京市,381 884 | 20200217,120000,天津市,125 885 | 20200217,130000,河北省,301 886 | 20200217,140000,山西省,129 887 | 20200217,150000,内蒙古自治区,72 888 | 20200217,210000,辽宁省,121 889 | 20200217,220000,吉林省,89 890 | 20200217,230000,黑龙江省,457 891 | 20200217,310000,上海市,332 892 | 20200217,320000,江苏省,626 893 | 20200217,330000,浙江省,1171 894 | 20200217,340000,安徽省,973 895 | 20200217,350000,福建省,290 896 | 20200217,360000,江西省,930 897 | 20200217,370000,山东省,541 898 | 20200217,410000,河南省,1246 899 | 20200217,420000,湖北省,58182 900 | 20200217,430000,湖南省,1006 901 | 20200217,440000,广东省,1322 902 | 20200217,450000,广西壮族自治区,238 903 | 20200217,460000,海南省,163 904 | 20200217,500000,重庆市,552 905 | 20200217,510000,四川省,495 906 | 20200217,520000,贵州省,146 907 | 20200217,530000,云南省,171 908 | 20200217,540000,西藏自治区,1 909 | 20200217,610000,陕西省,240 910 | 20200217,620000,甘肃省,91 911 | 20200217,630000,青海省,18 912 | 20200217,640000,宁夏回族自治区,70 913 | 20200217,650000,新疆维吾尔自治区,75 914 | 20200218,110000,北京市,387 915 | 20200218,120000,天津市,127 916 | 20200218,130000,河北省,302 917 | 20200218,140000,山西省,130 918 | 20200218,150000,内蒙古自治区,73 919 | 20200218,210000,辽宁省,121 920 | 20200218,220000,吉林省,89 921 | 20200218,230000,黑龙江省,464 922 | 20200218,310000,上海市,333 923 | 20200218,320000,江苏省,629 924 | 20200218,330000,浙江省,1172 925 | 20200218,340000,安徽省,982 926 | 20200218,350000,福建省,292 927 | 20200218,360000,江西省,933 928 | 20200218,370000,山东省,543 929 | 20200218,410000,河南省,1257 930 | 20200218,420000,湖北省,59989 931 | 20200218,430000,湖南省,1007 932 | 20200218,440000,广东省,1328 933 | 20200218,450000,广西壮族自治区,242 934 | 20200218,460000,海南省,163 935 | 20200218,500000,重庆市,553 936 | 20200218,510000,四川省,508 937 | 20200218,520000,贵州省,146 938 | 20200218,530000,云南省,172 939 | 20200218,540000,西藏自治区,1 940 | 20200218,610000,陕西省,240 941 | 20200218,620000,甘肃省,91 942 | 20200218,630000,青海省,18 943 | 20200218,640000,宁夏回族自治区,70 944 | 20200218,650000,新疆维吾尔自治区,76 -------------------------------------------------------------------------------- /元胞自动机/1_A_simple_model - 副本.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from enum import IntEnum 3 | import matplotlib.pyplot as plt 4 | import matplotlib.animation as animation # 制作动图 5 | import numpy as np 6 | 7 | # on为255, off为0 8 | class State(IntEnum): 9 | on = 255 10 | off = 0 11 | 12 | # 随机产生 length*length 的方阵, 返回类型np.array 13 | def random_data(length = 7, seed = 420) -> np.array: 14 | np.random.seed(seed) 15 | return np.random.choice([State.off, State.on], size=(length, length), p=[0.5, 0.5]) 16 | 17 | # 计算周围的活细胞个数 18 | def _count(data, row, col): 19 | shape = data.shape[0] 20 | up = (row - 1) % shape 21 | down = (row + 1) % shape 22 | right = (col + 1) % shape 23 | left = (col - 1) % shape 24 | return (data[up, right] + data[up, left] + 25 | data[down, right] + data[down, left] + 26 | data[row, right] + data[row, left] + 27 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 28 | 29 | def count(initial, data, row, col): 30 | total = _count(initial, row, col) 31 | # 周围存货的元胞太多或太少, 死掉 32 | if initial[row, col]: 33 | if (total < 2) or (total > 3): 34 | data[row, col] = State.off 35 | # 活下来 36 | else: 37 | if total == 3: 38 | data[row, col] = State.on 39 | 40 | NUM = 0 41 | 42 | # 更新每一帧图像所需数据的函数 43 | def generate(frame_num, img, plt, initial): 44 | global NUM 45 | NUM += 1 46 | plt.title(f'{NUM} generation') 47 | data = initial.copy() 48 | rows, cols = data.shape 49 | for row in range(rows): 50 | for col in range(cols): 51 | count(initial, data, row, col) 52 | img.set_data(data) 53 | initial[:] = data[:] 54 | return img 55 | 56 | # 制作动图 57 | def update(data): 58 | update_interval = 50 #更新频率,以ms计 59 | fig, ax = plt.subplots() 60 | ax.set_xticks([]) 61 | ax.set_yticks([]) 62 | img = ax.imshow(data, cmap='Blues', interpolation='nearest') 63 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 64 | frames=30, #动画长度, 一次循环包含的帧数 65 | interval=update_interval) #更新频率,以ms计 66 | plt.show() 67 | 68 | def initial_data(length, seed): 69 | data = random_data(length, seed) 70 | return data 71 | 72 | def main(): 73 | data = initial_data(7, 400) 74 | update(data) 75 | 76 | 77 | if __name__ == "__main__": 78 | main() 79 | -------------------------------------------------------------------------------- /元胞自动机/1_A_simple_model.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from enum import IntEnum 3 | import matplotlib.pyplot as plt 4 | import matplotlib.animation as animation # 制作动图 5 | import numpy as np 6 | 7 | # infected为255, susceptible 8 | class State(IntEnum): 9 | susceptible = 0 10 | infected = 255 11 | removed = 100 12 | 13 | # 计算周围的活细胞个数 14 | def _count(data, row, col): 15 | shape = data.shape[0] 16 | up = (row - 1) % shape 17 | down = (row + 1) % shape 18 | right = (col + 1) % shape 19 | left = (col - 1) % shape 20 | return (data[row, right] + data[row, left] + 21 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 22 | 23 | def count(initial, data, row, col): 24 | total = _count(initial, row, col) 25 | # 如果该元胞是感染的, removed 26 | if initial[row, col] == State.infected: 27 | data[row, col] = State.removed 28 | elif initial[row, col] == State.susceptible: 29 | if total != 0: 30 | data[row, col] = State.infected 31 | 32 | NUM = 0 33 | 34 | # 更新每一帧图像所需数据的函数 35 | def generate(frame_num, img, plt, initial): 36 | global NUM 37 | NUM += 1 38 | plt.title(f'{NUM} generation') 39 | 40 | data = initial.copy() 41 | rows, cols = data.shape 42 | # 遍历每个格子 43 | for row in range(rows): 44 | for col in range(cols): 45 | count(initial, data, row, col) 46 | img.set_data(data) 47 | initial[:] = data[:] 48 | return img 49 | 50 | # 制作动图 51 | def update(data): 52 | update_interval = 100 #更新频率,以ms计 53 | fig, ax = plt.subplots() 54 | ax.set_xticks([]) 55 | ax.set_yticks([]) 56 | img = ax.imshow(data, cmap='Blues', interpolation='nearest') 57 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 58 | frames=30, #动画长度, 一次循环包含的帧数 59 | interval=update_interval) #更新频率,以ms计 60 | plt.show() 61 | 62 | def initial_data(length): 63 | data = np.zeros(shape=(length,length)) 64 | data[length//2, length//2] = State.infected 65 | return data 66 | 67 | def main(): 68 | data = initial_data(19) 69 | update(data) 70 | 71 | 72 | if __name__ == "__main__": 73 | main() 74 | -------------------------------------------------------------------------------- /元胞自动机/2_SIR.py: -------------------------------------------------------------------------------- 1 | # Susceptible –> Infected –> Recovered 2 | import argparse 3 | from enum import IntEnum 4 | import matplotlib.pyplot as plt 5 | import matplotlib.animation as animation # 制作动图 6 | import numpy as np 7 | import random 8 | 9 | # infected为255, susceptible 10 | class State(IntEnum): 11 | susceptible = 0 12 | infected = 255 13 | removed = 100 14 | 15 | # 计算周围的活细胞个数 16 | def _count(data, row, col): 17 | shape = data.shape[0]-1 18 | up = row-1 if row-1 > 0 else 0 19 | down = row+1 if row+1 < shape else shape 20 | right = col+1 if col+1 < shape else shape 21 | left = col-1 if col-1 > 0 else 0 22 | return (data[row, right] + data[row, left] + 23 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 24 | 25 | def count(initial, data, row, col): 26 | total = _count(initial, row, col) 27 | # 如果该元胞是感染的, removed 28 | if initial[row, col] == State.infected: 29 | data[row, col] = State.removed 30 | # 如果是易感的 31 | elif initial[row, col] == State.susceptible: 32 | # 如果周围有 33 | if total != 0: 34 | data[row, col] = np.random.choice( 35 | [State.susceptible, State.infected], 36 | p=[1-transmission_rate, transmission_rate]) 37 | 38 | NUM = 0 39 | 40 | # 更新每一帧图像所需数据的函数 41 | def generate(frame_num, img, plt, initial): 42 | global NUM 43 | NUM += 1 44 | plt.title(f'{NUM} generation') 45 | 46 | data = initial.copy() # initial保持不变, 修改data 47 | rows, cols = data.shape 48 | # 遍历每个格子 49 | for row in range(rows): 50 | for col in range(cols): 51 | count(initial, data, row, col) 52 | img.set_data(data) 53 | initial[:] = data[:] 54 | return img 55 | 56 | # 制作动图 57 | def update(data): 58 | update_interval = 150 #更新频率,以ms计 59 | fig, ax = plt.subplots() 60 | ax.set_xticks([]) 61 | ax.set_yticks([]) 62 | img = ax.imshow(data, cmap='Blues', interpolation='nearest') 63 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 64 | frames=30, #动画长度, 一次循环包含的帧数 65 | interval=update_interval) #更新频率,以ms计 66 | plt.show() 67 | 68 | def initial_data(length): 69 | data = np.zeros(shape=(length,length)) 70 | data[length//2, length//2] = State.infected 71 | return data 72 | 73 | 74 | def main(): 75 | data = initial_data(length) 76 | update(data) 77 | 78 | 79 | if __name__ == "__main__": 80 | transmission_rate = 0.40 # 感染概率0~1 81 | length = 19 # 宽度 82 | main() 83 | -------------------------------------------------------------------------------- /元胞自动机/2_SIS.py: -------------------------------------------------------------------------------- 1 | # Susceptible –> Infected –> Susceptible 2 | import argparse 3 | from enum import IntEnum 4 | import matplotlib.pyplot as plt 5 | import matplotlib.animation as animation # 制作动图 6 | import numpy as np 7 | import random 8 | 9 | class State(IntEnum): 10 | susceptible = 0 11 | infected = 255 12 | removed = 100 13 | 14 | # 计算周围的活细胞个数 15 | def _count(data, row, col): 16 | shape = data.shape[0]-1 17 | up = row-1 if row-1 > 0 else 0 18 | down = row+1 if row+1 < shape else shape 19 | right = col+1 if col+1 < shape else shape 20 | left = col-1 if col-1 > 0 else 0 21 | return (data[row, right] + data[row, left] + 22 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 23 | 24 | def count(initial, data, row, col): 25 | total = _count(initial, row, col) 26 | # 如果该元胞是感染的, removed 27 | if initial[row, col] == State.infected: 28 | data[row, col] = np.random.choice( 29 | [State.susceptible, State.infected], 30 | p=[recovery_rate, 1-recovery_rate]) 31 | # 如果是易感的 32 | elif initial[row, col] == State.susceptible: 33 | # 如果周围有 34 | if total != 0: 35 | data[row, col] = np.random.choice( 36 | [State.susceptible, State.infected], 37 | p=[1-transmission_rate, transmission_rate]) 38 | 39 | NUM = 0 40 | 41 | # 更新每一帧图像所需数据的函数 42 | def generate(frame_num, img, plt, initial): 43 | global NUM 44 | NUM += 1 45 | plt.title(f'{NUM} generation') 46 | 47 | data = initial.copy() # initial保持不变, 修改data 48 | rows, cols = data.shape 49 | # 遍历每个格子 50 | for row in range(rows): 51 | for col in range(cols): 52 | count(initial, data, row, col) 53 | img.set_data(data) 54 | initial[:] = data[:] 55 | return img 56 | 57 | # 制作动图 58 | def update(data): 59 | update_interval = 100 #更新频率,以ms计 60 | fig, ax = plt.subplots() 61 | ax.set_xticks([]) 62 | ax.set_yticks([]) 63 | img = ax.imshow(data, cmap='Blues', interpolation='nearest') 64 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 65 | frames=30, #动画长度, 一次循环包含的帧数 66 | interval=update_interval) #更新频率,以ms计 67 | plt.show() 68 | 69 | def initial_data(length): 70 | data = np.zeros(shape=(length,length)) 71 | data[length//2, length//2] = State.infected 72 | return data 73 | 74 | 75 | def main(): 76 | data = initial_data(length) 77 | update(data) 78 | 79 | 80 | if __name__ == "__main__": 81 | transmission_rate = 0.74 # 感染概率0~1 82 | recovery_rate = 0.01 # 康复率0~1 83 | length = 19 # 宽度 84 | main() 85 | -------------------------------------------------------------------------------- /元胞自动机/2_SISa.py: -------------------------------------------------------------------------------- 1 | # Susceptible –> Infected –> Susceptible 2 | import argparse 3 | from enum import IntEnum 4 | import matplotlib.pyplot as plt 5 | import matplotlib.animation as animation # 制作动图 6 | import numpy as np 7 | import random 8 | 9 | class State(IntEnum): 10 | susceptible = 0 11 | infected = 255 12 | removed = 100 13 | 14 | # 计算周围的活细胞个数 15 | def _count(data, row, col): 16 | shape = data.shape[0]-1 17 | up = row-1 if row-1 > 0 else 0 18 | down = row+1 if row+1 < shape else shape 19 | right = col+1 if col+1 < shape else shape 20 | left = col-1 if col-1 > 0 else 0 21 | return (data[row, right] + data[row, left] + 22 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 23 | 24 | def count(initial, data, row, col): 25 | total = _count(initial, row, col) 26 | # 如果该元胞是感染的, removed 27 | if initial[row, col] == State.infected: 28 | data[row, col] = np.random.choice( 29 | [State.susceptible, State.infected], 30 | p=[recovery_rate, 1-recovery_rate]) 31 | # 如果是易感的 32 | elif initial[row, col] == State.susceptible: 33 | # 如果周围有 34 | if total != 0: 35 | data[row, col] = np.random.choice( 36 | [State.susceptible, State.infected], 37 | p=[1-transmission_rate, transmission_rate]) 38 | else: 39 | data[row, col] = State.infected 40 | # data[row, col] = np.random.choice( 41 | # [State.susceptible, ], 42 | # p=[1-transmission_rate, transmission_rate]) 43 | 44 | NUM = 0 45 | 46 | # 更新每一帧图像所需数据的函数 47 | def generate(frame_num, img, plt, initial): 48 | global NUM 49 | NUM += 1 50 | plt.title(f'{NUM} generation') 51 | 52 | data = initial.copy() # initial保持不变, 修改data 53 | rows, cols = data.shape 54 | # 遍历每个格子 55 | for row in range(rows): 56 | for col in range(cols): 57 | count(initial, data, row, col) 58 | 59 | img.set_data(data) 60 | initial[:] = data[:] 61 | print(data[length//2, length//2]) 62 | return img 63 | 64 | # 制作动图 65 | def update(data): 66 | update_interval = 1000 #更新频率,以ms计 67 | fig, ax = plt.subplots() 68 | ax.set_xticks([]) 69 | ax.set_yticks([]) 70 | img = ax.imshow(data, cmap='Blues', interpolation='none') 71 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 72 | frames=30, #动画长度, 一次循环包含的帧数 73 | interval=update_interval) #更新频率,以ms计 74 | plt.show() 75 | 76 | 77 | def main(): 78 | data = np.zeros(shape=(length, length)) 79 | update(data) 80 | 81 | if __name__ == "__main__": 82 | transmission_rate = 1 # 感染概率0~1 83 | recovery_rate = 0.00 # 康复率0~1 84 | spontaneous_activation_rate = 0.1 85 | length = 6 # 宽度 86 | main() -------------------------------------------------------------------------------- /元胞自动机/3_Immunity.py: -------------------------------------------------------------------------------- 1 | # Susceptible –> Infected –> Susceptible 2 | import argparse 3 | from enum import IntEnum 4 | import matplotlib.pyplot as plt 5 | import matplotlib.animation as animation # 制作动图 6 | import numpy as np 7 | import random 8 | 9 | class State(IntEnum): 10 | susceptible = 0 11 | infected = 255 12 | removed = 100 13 | 14 | # 计算周围的活细胞个数 15 | def _count(data, row, col): 16 | shape = data.shape[0]-1 17 | up = row-1 if row-1 > 0 else 0 18 | down = row+1 if row+1 < shape else shape 19 | right = col+1 if col+1 < shape else shape 20 | left = col-1 if col-1 > 0 else 0 21 | return (data[row, right] + data[row, left] + 22 | data[up, col] + data[down, col]) // 255 # 周围总颜色和除以255获得活细胞的个数 23 | 24 | def count(initial, data, row, col): 25 | total = _count(initial, row, col) 26 | # 如果该元胞是感染的, removed 27 | if initial[row, col] == State.infected: 28 | data[row, col] = np.random.choice( 29 | [State.susceptible, State.infected], 30 | p=[recovery_rate, 1-recovery_rate]) 31 | # 如果是易感的 32 | elif initial[row, col] == State.susceptible: 33 | # 如果周围有 34 | if total != 0: 35 | data[row, col] = np.random.choice( 36 | [State.susceptible, State.infected], 37 | p=[1-transmission_rate, transmission_rate]) 38 | 39 | NUM = 0 40 | 41 | # 更新每一帧图像所需数据的函数 42 | def generate(frame_num, img, plt, initial): 43 | global NUM 44 | NUM += 1 45 | plt.title(f'{NUM} generation') 46 | 47 | data = initial.copy() # initial保持不变, 修改data 48 | rows, cols = data.shape 49 | # 遍历每个格子 50 | for row in range(rows): 51 | for col in range(cols): 52 | count(initial, data, row, col) 53 | img.set_data(data) 54 | initial[:] = data[:] 55 | return img 56 | 57 | # 制作动图 58 | def update(data): 59 | update_interval = 10 #更新频率,以ms计 60 | fig, ax = plt.subplots() 61 | ax.set_xticks([]) 62 | ax.set_yticks([]) 63 | img = ax.imshow(data, cmap='Blues', interpolation='nearest') 64 | _ = animation.FuncAnimation(fig, generate, fargs=(img, plt, data), 65 | frames=30, #动画长度, 一次循环包含的帧数 66 | interval=update_interval) #更新频率,以ms计 67 | plt.show() 68 | 69 | def initial_data(length): 70 | # for i in range(length) 71 | 72 | data = np.zeros(shape=(length,length)) 73 | data[length//2, length//2] = State.infected 74 | return data 75 | 76 | 77 | def main(): 78 | data = initial_data(length) 79 | update(data) 80 | 81 | 82 | if __name__ == "__main__": 83 | transmission_rate = 0.74 # 感染概率0~1 84 | recovery_rate = 0.01 # 康复率0~1 85 | length = 81 # 宽度 86 | main() 87 | -------------------------------------------------------------------------------- /元胞自动机/README.md: -------------------------------------------------------------------------------- 1 | 看了 *Kevin Simler* 这篇文章[Going Critical](https://www.meltingasphalt.com/interactive/going-critical/)觉得很有意思, 实现了其中几个模型 2 | 3 | # 自动元胞机 4 | - 可以模拟传染病的传播, 火灾的蔓延, 新闻的传播, 核裂变 5 | 6 | - 一些想法 7 | - 文中在SIS模型中提到 `Transimission Rate`(转化率)在22%和23%之间有巨大的差异, 就是说病毒的传染性并不是连续的影响. 22%及以下演变到最后都趋近于消失, 23%及以上最后会蔓延到所有地方. 所以我们尽管看到疫情有一丝好转, 也还不能松懈, 不能输在那1%上 8 | 9 | 10 | 有时间再继续玩​ :D​ 11 | 12 | ## Reference list 13 | 14 | - https://www.jianshu.com/p/c5dcc828966a 15 | - https://www.meltingasphalt.com/interactive/going-critical/ 16 | --------------------------------------------------------------------------------