{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Useful links\n", "\n", "- https://blog.floydhub.com/a-beginners-guide-on-recurrent-neural-networks-with-pytorch/\n", "- http://karpathy.github.io/2015/05/21/rnn-effectiveness/\n", "- https://stackabuse.com/time-series-prediction-using-lstm-with-pytorch-in-python/\n", "- https://towardsdatascience.com/pytorch-basics-how-to-train-your-neural-net-intro-to-rnn-cb6ebc594677\n", "- https://towardsdatascience.com/time-series-forecasting-with-rnns-ff22683bbbb0\n", "- https://towardsdatascience.com/time-series-forecasting-with-recurrent-neural-networks-74674e289816\n", "- https://towardsdatascience.com/analyzing-time-series-data-in-pandas-be3887fdd621\n", "- http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/\n", "- https://colah.github.io/posts/2015-09-NN-Types-FP/\n", "- https://pytorch.org/docs/stable/nn.html#rnn" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import requests as rq\n", "import datetime as dt\n", "import traceback as tb\n", "import torch\n", "\n", "tnn = torch.nn\n", "top = torch.optim\n", "from torch.utils import data as tdt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Download India's data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateconfirmeddeceasedrecovered
452020-03-151003
\n", "
" ], "text/plain": [ " date confirmed deceased recovered\n", "45 2020-03-15 10 0 3" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get daily time series data from covid19india\n", "resp = rq.get(\"https://api.covid19india.org/data.json\")\n", "ts = resp.json()['cases_time_series']\n", "\n", "r = {\n", " \"date\": [],\n", " \"confirmed\": [],\n", " \"deceased\": [],\n", " \"recovered\": []\n", "}\n", "\n", "for d in ts:\n", " try:\n", " r['date'].append(dt.datetime.strptime(d['date'] + \"2020\", '%d %B %Y'))\n", " r['confirmed'].append(np.int64(d['dailyconfirmed']))\n", " r['deceased'].append(np.int64(d['dailydeceased']))\n", " r['recovered'].append(np.int64(d['dailyrecovered']))\n", " except Exception as e:\n", " print(d['date'])\n", " tb.print_exc()\n", "\n", "df = pd.DataFrame(r)\n", "df.sort_values('date', inplace=True)\n", "df.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Italy's and Spain's data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " date deceased recovered confirmed active daily\n", "5 2020-02-26 12 3.0 445 430 123\n", " date deaths recovered confirmed active daily\n", "39 2020-04-03 11164.0 30173 133017 91680 6680\n" ] } ], "source": [ "it_df = pd.read_csv('csv/italy.csv')\n", "print(it_df.sample())\n", "\n", "es_df = pd.read_csv('csv/spain.csv')\n", "print(es_df.sample())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prep data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def get_rnn_dataset(series, seq_len):\n", " \"\"\"get rnn training dataset, given a series and seq_len\"\"\"\n", " ip_seq = np.array(series[:-1], dtype=np.float32)\n", " op_seq = np.array(series[1:], dtype=np.float32)\n", " data_len = len(series) - 1\n", "\n", " ips = []\n", " ops = []\n", " for i in range(data_len - seq_len + 1):\n", " ip, op = ip_seq[i : i+seq_len], op_seq[i : i+seq_len]\n", " ips.append(ip)\n", " ops.append(op)\n", " ips = np.array(ips, dtype=np.float32)\n", " ops = np.array(ops, dtype=np.float32)\n", "\n", " # convert from numpy to torch\n", " ip_t = torch.from_numpy(ips)\n", " op_t = torch.from_numpy(ops)\n", "\n", " dataset = tdt.TensorDataset(ip_t, op_t)\n", " return dataset\n", "\n", "SEQ_LEN = 5\n", "VAL_SPLIT = 0.5\n", "\n", "IN_POP_FCT = 1300000 # 130Cr / 1000\n", "IT_POP_FCT = 60000 # 6Cr / 1000\n", "ES_POP_FCT = 47000 # 4.7Cr / 1000\n", "\n", "# preprocess data: sma(6) and normalise by 10k\n", "in_cnf = np.array(df['confirmed'][37:].rolling(6, center=True, min_periods=1).mean()) / IN_POP_FCT\n", "it_cnf = np.array(it_df['daily'].rolling(6, center=True, min_periods=1).mean()) / IT_POP_FCT\n", "es_cnf = np.array(es_df['daily'].rolling(6, center=True, min_periods=1).mean()) / ES_POP_FCT\n", "\n", "# Choose among India or Italy or Spain here\n", "cnf = es_cnf # np.append(it_cnf, es_cnf)\n", "dataset = get_rnn_dataset(cnf, SEQ_LEN)\n", "\n", "val_len = int(VAL_SPLIT * len(dataset))\n", "train_len = len(dataset) - val_len\n", "train_set, val_set = tdt.random_split(dataset, (train_len, val_len))\n", "\n", "trn_loader = tdt.DataLoader(train_set, shuffle=True, batch_size=1)\n", "val_loader = tdt.DataLoader(val_set, shuffle=True, batch_size=1)\n", "all_loader = tdt.DataLoader(dataset, shuffle=False, batch_size=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define NN and train" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch: 0 avg_val_loss: 0.23072 avg_trn_loss: 0.25161\n", "epoch: 20 avg_val_loss: 0.00911 avg_trn_loss: 0.01122\n", "epoch: 40 avg_val_loss: 0.00259 avg_trn_loss: 0.00375\n", "epoch: 60 avg_val_loss: 0.00199 avg_trn_loss: 0.00298\n", "epoch: 80 avg_val_loss: 0.00193 avg_trn_loss: 0.00286\n", "epoch: 100 avg_val_loss: 0.00193 avg_trn_loss: 0.00283\n", "epoch: 120 avg_val_loss: 0.00191 avg_trn_loss: 0.00281\n", "epoch: 140 avg_val_loss: 0.00189 avg_trn_loss: 0.00279\n", "epoch: 160 avg_val_loss: 0.00186 avg_trn_loss: 0.00275\n", "epoch: 180 avg_val_loss: 0.00178 avg_trn_loss: 0.00266\n", "epoch: 200 avg_val_loss: 0.00160 avg_trn_loss: 0.00242\n", "epoch: 220 avg_val_loss: 0.00133 avg_trn_loss: 0.00205\n", "epoch: 240 avg_val_loss: 0.00098 avg_trn_loss: 0.00155\n", "epoch: 260 avg_val_loss: 0.00057 avg_trn_loss: 0.00095\n", "epoch: 280 avg_val_loss: 0.00033 avg_trn_loss: 0.00056\n", "epoch: 300 avg_val_loss: 0.00024 avg_trn_loss: 0.00041\n", "epoch: 320 avg_val_loss: 0.00022 avg_trn_loss: 0.00036\n", "epoch: 340 avg_val_loss: 0.00021 avg_trn_loss: 0.00034\n", "epoch: 360 avg_val_loss: 0.00021 avg_trn_loss: 0.00033\n", "epoch: 380 avg_val_loss: 0.00021 avg_trn_loss: 0.00032\n", "epoch: 400 avg_val_loss: 0.00020 avg_trn_loss: 0.00031\n", "epoch: 420 avg_val_loss: 0.00021 avg_trn_loss: 0.00031\n", "epoch: 440 avg_val_loss: 0.00020 avg_trn_loss: 0.00031\n", "epoch: 460 avg_val_loss: 0.00020 avg_trn_loss: 0.00030\n", "epoch: 480 avg_val_loss: 0.00020 avg_trn_loss: 0.00030\n", "epoch: 500 avg_val_loss: 0.00020 avg_trn_loss: 0.00029\n", "epoch: 520 avg_val_loss: 0.00019 avg_trn_loss: 0.00029\n", "epoch: 540 avg_val_loss: 0.00020 avg_trn_loss: 0.00028\n", "epoch: 560 avg_val_loss: 0.00019 avg_trn_loss: 0.00029\n", "epoch: 580 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 600 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 620 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 640 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 660 avg_val_loss: 0.00020 avg_trn_loss: 0.00029\n", "epoch: 680 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 700 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 720 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 740 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 760 avg_val_loss: 0.00019 avg_trn_loss: 0.00027\n", "epoch: 780 avg_val_loss: 0.00019 avg_trn_loss: 0.00028\n", "epoch: 800 avg_val_loss: 0.00018 avg_trn_loss: 0.00028\n", "epoch: 820 avg_val_loss: 0.00018 avg_trn_loss: 0.00027\n", "epoch: 840 avg_val_loss: 0.00018 avg_trn_loss: 0.00026\n", "epoch: 860 avg_val_loss: 0.00018 avg_trn_loss: 0.00026\n", "epoch: 880 avg_val_loss: 0.00017 avg_trn_loss: 0.00026\n", "epoch: 900 avg_val_loss: 0.00015 avg_trn_loss: 0.00024\n", "epoch: 920 avg_val_loss: 0.00014 avg_trn_loss: 0.00022\n", "epoch: 940 avg_val_loss: 0.00012 avg_trn_loss: 0.00019\n", "epoch: 960 avg_val_loss: 0.00011 avg_trn_loss: 0.00017\n", "epoch: 980 avg_val_loss: 0.00010 avg_trn_loss: 0.00015\n", "epoch: 1000 avg_val_loss: 0.00010 avg_trn_loss: 0.00015\n", "epoch: 1020 avg_val_loss: 0.00009 avg_trn_loss: 0.00014\n", "epoch: 1040 avg_val_loss: 0.00010 avg_trn_loss: 0.00014\n", "epoch: 1060 avg_val_loss: 0.00009 avg_trn_loss: 0.00014\n", "epoch: 1080 avg_val_loss: 0.00009 avg_trn_loss: 0.00013\n", "epoch: 1100 avg_val_loss: 0.00009 avg_trn_loss: 0.00013\n", "epoch: 1120 avg_val_loss: 0.00009 avg_trn_loss: 0.00013\n", "epoch: 1140 avg_val_loss: 0.00009 avg_trn_loss: 0.00013\n", "epoch: 1160 avg_val_loss: 0.00009 avg_trn_loss: 0.00013\n", "epoch: 1180 avg_val_loss: 0.00008 avg_trn_loss: 0.00013\n", "epoch: 1200 avg_val_loss: 0.00008 avg_trn_loss: 0.00012\n", "epoch: 1220 avg_val_loss: 0.00008 avg_trn_loss: 0.00012\n", "epoch: 1240 avg_val_loss: 0.00008 avg_trn_loss: 0.00012\n", "epoch: 1260 avg_val_loss: 0.00008 avg_trn_loss: 0.00012\n", "epoch: 1280 avg_val_loss: 0.00008 avg_trn_loss: 0.00011\n", "epoch: 1300 avg_val_loss: 0.00008 avg_trn_loss: 0.00012\n", "epoch: 1320 avg_val_loss: 0.00008 avg_trn_loss: 0.00011\n", "epoch: 1340 avg_val_loss: 0.00007 avg_trn_loss: 0.00011\n", "epoch: 1360 avg_val_loss: 0.00008 avg_trn_loss: 0.00011\n", "epoch: 1380 avg_val_loss: 0.00007 avg_trn_loss: 0.00011\n", "epoch: 1400 avg_val_loss: 0.00007 avg_trn_loss: 0.00011\n", "epoch: 1420 avg_val_loss: 0.00008 avg_trn_loss: 0.00010\n", "epoch: 1440 avg_val_loss: 0.00007 avg_trn_loss: 0.00010\n", "epoch: 1460 avg_val_loss: 0.00007 avg_trn_loss: 0.00010\n", "epoch: 1480 avg_val_loss: 0.00007 avg_trn_loss: 0.00010\n", "epoch: 1500 avg_val_loss: 0.00007 avg_trn_loss: 0.00010\n", "epoch: 1520 avg_val_loss: 0.00006 avg_trn_loss: 0.00010\n", "epoch: 1540 avg_val_loss: 0.00006 avg_trn_loss: 0.00010\n", "epoch: 1560 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1580 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1600 avg_val_loss: 0.00007 avg_trn_loss: 0.00009\n", "epoch: 1620 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1640 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1660 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1680 avg_val_loss: 0.00007 avg_trn_loss: 0.00009\n", "epoch: 1700 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1720 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1740 avg_val_loss: 0.00006 avg_trn_loss: 0.00009\n", "epoch: 1760 avg_val_loss: 0.00006 avg_trn_loss: 0.00008\n", "epoch: 1780 avg_val_loss: 0.00006 avg_trn_loss: 0.00008\n", "epoch: 1800 avg_val_loss: 0.00006 avg_trn_loss: 0.00008\n", "epoch: 1820 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1840 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1860 avg_val_loss: 0.00006 avg_trn_loss: 0.00008\n", "epoch: 1880 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1900 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1920 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1940 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1960 avg_val_loss: 0.00005 avg_trn_loss: 0.00008\n", "epoch: 1980 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2000 avg_val_loss: 0.00007 avg_trn_loss: 0.00008\n", "epoch: 2020 avg_val_loss: 0.00006 avg_trn_loss: 0.00007\n", "epoch: 2040 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2060 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2080 avg_val_loss: 0.00006 avg_trn_loss: 0.00007\n", "epoch: 2100 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2120 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2140 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2160 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2180 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2200 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2220 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2240 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2260 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2280 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2300 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2320 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2340 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2360 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2380 avg_val_loss: 0.00005 avg_trn_loss: 0.00007\n", "epoch: 2400 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2420 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2440 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2460 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2480 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2500 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2520 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2540 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2560 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2580 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2600 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2620 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2640 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2660 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2680 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2700 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2720 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2740 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2760 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2780 avg_val_loss: 0.00005 avg_trn_loss: 0.00006\n", "epoch: 2800 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2820 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2840 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2860 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2880 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2900 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2920 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2940 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 2960 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 2980 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3000 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3020 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3040 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3060 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3080 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3100 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3120 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3140 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3160 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3180 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3200 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3220 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3240 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3260 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3280 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3300 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3320 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3340 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3360 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3380 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3400 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3420 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3440 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3460 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3480 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3500 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 3520 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3540 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3560 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3580 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3600 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3620 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3640 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3660 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3680 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3700 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3720 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3740 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3760 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3780 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3800 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3820 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3840 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3860 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3880 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3900 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3920 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3940 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3960 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 3980 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4000 avg_val_loss: 0.00005 avg_trn_loss: 0.00005\n", "epoch: 4020 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4040 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4060 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4080 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4100 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4120 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4140 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4160 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4180 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4200 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4220 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4240 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 4260 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4280 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4300 avg_val_loss: 0.00004 avg_trn_loss: 0.00006\n", "epoch: 4320 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4340 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4360 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4380 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4400 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4420 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4440 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4460 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4480 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4500 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4520 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4540 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4560 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4580 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4600 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4620 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4640 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4660 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4680 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4700 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4720 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4740 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4760 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4780 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4800 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4820 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4840 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4860 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4880 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4900 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4920 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4940 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4960 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n", "epoch: 4980 avg_val_loss: 0.00004 avg_trn_loss: 0.00005\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "class Forecaster(tnn.Module):\n", " def __init__(self, seq_len=1, hidden_size=1, num_layers=1):\n", " super(Forecaster, self).__init__()\n", " \n", " self.seq_len = seq_len\n", " self.hidden_size = hidden_size\n", " self.num_layers = num_layers\n", " \n", " self.rnn = tnn.RNN(input_size=1, hidden_size=self.hidden_size, num_layers=self.num_layers)\n", "# self.gru = tnn.GRU(input_size=1, hidden_size=self.hidden_size, num_layers=self.num_layers)\n", "# self.lstm = tnn.LSTM(input_size=1, hidden_size=self.hidden_size, num_layers=self.num_layers)\n", " self.linear = tnn.Linear(self.hidden_size, 1)\n", " self.sigmoid = tnn.Sigmoid()\n", " \n", " def forward(self, ip, h=None):\n", " rnn_out, rnn_h = self.rnn(ip, h)\n", "# return (torch.squeeze(rnn_out), torch.squeeze(rnn_h))\n", " # linear layer\n", " final_out = []\n", " for i in range(self.seq_len):\n", " linear_out = self.linear(rnn_out[i].view(self.hidden_size))\n", " sigmoid_out = self.sigmoid(linear_out)\n", " final_out.append(sigmoid_out)\n", " return torch.stack(final_out).view(self.seq_len), rnn_h\n", " \n", " def predict(self, ip, num_predictions=1):\n", " preds = []\n", " with torch.no_grad():\n", " pred = ip\n", " h = None\n", " while(num_predictions):\n", " pred, h = self.forward(pred.view(self.seq_len, 1, 1), h)\n", " preds.append(pred.view(self.seq_len)[-1])\n", " num_predictions -= 1\n", " return torch.stack(preds)\n", "\n", "HIDDEN_SIZE = 2\n", "NUM_LAYERS = 1\n", "LEARNING_RATE = 0.001\n", "NUM_EPOCHS = 5000\n", "\n", "model = Forecaster(seq_len=SEQ_LEN, hidden_size=HIDDEN_SIZE, num_layers=NUM_LAYERS)\n", "loss_fn = tnn.MSELoss()\n", "optimizer = top.Adam(model.parameters(), lr=LEARNING_RATE)\n", "\n", "# TRAIN\n", "trn_loss_vals = []\n", "val_loss_vals = []\n", "\n", "for e in range(NUM_EPOCHS):\n", " model.train()\n", " trn_losses = []\n", " for i, data in enumerate(trn_loader):\n", " ip, op = data \n", " optimizer.zero_grad() # set grads to 0\n", " pred, _ = model(ip.view(SEQ_LEN, 1, 1)) # predict\n", " loss = loss_fn(pred, op.view(SEQ_LEN)) # calc loss\n", " loss.backward() # calc and assign grads\n", " optimizer.step() # update weights\n", " trn_losses.append(loss) # logging\n", " avg_trn_loss = torch.stack(trn_losses).mean().item()\n", " trn_loss_vals.append(avg_trn_loss)\n", " \n", " model.eval()\n", " with torch.no_grad():\n", " val_losses = []\n", " for i, data in enumerate(val_loader):\n", " ip, op = data\n", " pred, _ = model(ip.view(SEQ_LEN, 1, 1))\n", " loss = loss_fn(pred, op.view(SEQ_LEN))\n", " val_losses.append(loss)\n", " avg_val_loss = torch.stack(val_losses).mean().item()\n", " val_loss_vals.append(avg_val_loss)\n", " \n", " if e%100==0:\n", " print(\"epoch:\", f\"{e:3}\", \"avg_val_loss:\", f\"{avg_val_loss: .5f}\", \"avg_trn_loss:\", f\"{avg_trn_loss: .5f}\")\n", "\n", "df_trn_loss = pd.DataFrame({\n", " 'trn_loss': trn_loss_vals,\n", " 'val_loss': val_loss_vals\n", "})\n", "_ = df_trn_loss.plot(\n", " y=['trn_loss', 'val_loss'],\n", " title=['Training loss per epoch', 'Validation loss per epoch'],\n", " subplots=True,\n", " figsize=(5,8),\n", " sharex=False,\n", " logy=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test\n", "- future values on any country's data" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IN: tensor([5394.6670, 5685.0000, 5954.3335, 6219.6001, 6236.0000])\n", "OUT: tensor([14522.6318, 18469.1309, 20658.3887, 21964.0020, 22775.1719, 23292.6777,\n", " 23629.5645, 23852.9922, 24004.1836, 24108.9355, 24183.5156, 24238.2090,\n", " 24279.5215, 24311.5332, 24336.8008, 24356.9375, 24372.9473, 24385.5215,\n", " 24395.1113, 24402.0801, 24406.7148, 24409.2734, 24410.0059, 24409.1367,\n", " 24406.8906, 24403.5020, 24399.1621, 24394.0645, 24388.3945, 24382.3008])\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# CHOOSE FROM IN, IT OR ES HERE\n", "df_cnf = in_cnf\n", "# df_cnf = np.array([8000, 7600, 7300, 6900, 6650], dtype=np.float32) / 10000\n", "\n", "test_in = df_cnf[-SEQ_LEN:]\n", "t = torch.tensor(\n", " test_in.reshape(SEQ_LEN, 1, 1),\n", " dtype=torch.float32\n", ")\n", "print(\"IN:\", t.view(SEQ_LEN) * IN_POP_FCT)\n", "out = model.predict(t, num_predictions=30)\n", "print(\"OUT:\", out * IN_POP_FCT)\n", "\n", "orig_df = pd.DataFrame({\n", " 'actual': df_cnf * IN_POP_FCT\n", "})\n", "fut_df = pd.DataFrame({\n", " 'predicted': (out.numpy() * IN_POP_FCT)\n", "})\n", "orig_df = orig_df.append(fut_df, ignore_index=True, sort=False)\n", "_ = orig_df.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- on training data" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# change this according to country selected for training\n", "pop_fct = ES_POP_FCT\n", "\n", "pred_vals = []\n", "out_vals = []\n", "for data in all_loader:\n", " ip, op = data\n", " pred = model.predict(ip.view(SEQ_LEN, 1, 1))\n", " pred_vals.append(pred.item() * pop_fct)\n", " out_vals.append(op.view(SEQ_LEN)[-1].item() * pop_fct)\n", "\n", "cmp_df = pd.DataFrame({\n", " 'predicted cases': pred_vals,\n", " 'actual cases': out_vals\n", "})\n", "_ = cmp_df.plot()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rnn.weight_ih_l0 = tensor([[-4.7741],\n", " [ 0.7617]])\n", "rnn.weight_hh_l0 = tensor([[-0.1013, -0.1580],\n", " [ 0.1943, -0.5698]])\n", "rnn.bias_ih_l0 = tensor([0.2483, 0.0914])\n", "rnn.bias_hh_l0 = tensor([ 0.1336, -0.1624])\n", "linear.weight = tensor([[-0.2352, -0.0221]])\n", "linear.bias = tensor([0.0798])\n" ] } ], "source": [ "for k in model.state_dict().keys():\n", " print(k, \"=\", model.state_dict()[k])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }