├── tests ├── __init__.py ├── test_model.py └── test_dataset.py ├── visualization ├── __init__.py ├── seir.py ├── comparison.py ├── advanced.py └── basic.py ├── models ├── validation │ ├── __init__.py │ └── validate.py ├── compartment │ ├── __init__.py │ ├── seir.py │ └── optimizer.py ├── selection │ ├── __init__.py │ └── simple_split.py └── __init__.py ├── data ├── rospotrebnadzor │ ├── __init__.py │ └── ros_parser.py ├── csv_parsers │ ├── __init__.py │ ├── google_parser.py │ ├── base.py │ ├── csse_parser.py │ └── oxford_parser.py ├── __init__.py └── dataset.py ├── report_files ├── README.md ├── rus_regions.csv └── world_countries.csv ├── requirements.txt ├── examples └── README.md ├── .travis.yml ├── .deepsource.toml ├── .gitignore ├── file_cfg.yml ├── README.ru.md ├── README.md ├── auxiliary_files ├── russia_regions.csv ├── countries.csv └── submission_example.csv └── LICENSE /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /visualization/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /models/validation/__init__.py: -------------------------------------------------------------------------------- 1 | from .validate import get_validation_results 2 | -------------------------------------------------------------------------------- /data/rospotrebnadzor/__init__.py: -------------------------------------------------------------------------------- 1 | from .ros_parser import RussianRegionsParser 2 | -------------------------------------------------------------------------------- /models/compartment/__init__.py: -------------------------------------------------------------------------------- 1 | from .optimizer import CompartmentalOptimizer 2 | -------------------------------------------------------------------------------- /models/selection/__init__.py: -------------------------------------------------------------------------------- 1 | from .simple_split import model_per_country_simple_split 2 | -------------------------------------------------------------------------------- /report_files/README.md: -------------------------------------------------------------------------------- 1 | An empty directory to store the reports. Contains example data by default. -------------------------------------------------------------------------------- /models/__init__.py: -------------------------------------------------------------------------------- 1 | from .compartment import CompartmentalOptimizer 2 | from .selection import model_per_country_simple_split 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pandas==1.0.3 2 | PyYAML 3 | requests 4 | scipy==1.4.1 5 | sklearn 6 | beautifulsoup4 7 | plotly==4.6.0 8 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | You can find visualization examples at 2 | https://colab.research.google.com/drive/1nDEeHwJJ46bfhp9NmHTvFqcsHFOQOh6O 3 | -------------------------------------------------------------------------------- /data/csv_parsers/__init__.py: -------------------------------------------------------------------------------- 1 | from .oxford_parser import OxfordParser 2 | from .csse_parser import CSSEParser 3 | from .google_parser import GoogleParser 4 | -------------------------------------------------------------------------------- /data/__init__.py: -------------------------------------------------------------------------------- 1 | from .dataset import ( 2 | DatasetManager, 3 | CSSEParser, 4 | OxfordParser, 5 | GoogleParser, 6 | RussianRegionsParser, 7 | ) 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | branches: 2 | only: 3 | - master 4 | 5 | language: python 6 | python: 7 | - "3.6" 8 | 9 | install: 10 | - pip install -r requirements.txt 11 | 12 | script: 13 | - python -m pytest 14 | -------------------------------------------------------------------------------- /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | test_patterns = [ 4 | "tests/**", 5 | "test_*.py" 6 | ] 7 | 8 | [[analyzers]] 9 | name = "python" 10 | enabled = true 11 | 12 | [analyzers.meta] 13 | runtime_version = "3.x.x" 14 | -------------------------------------------------------------------------------- /models/selection/simple_split.py: -------------------------------------------------------------------------------- 1 | def model_per_country_simple_split(data, targets, index=None, sort_by="date"): 2 | data_copy = data.copy() 3 | if index is not None: 4 | data_copy = data_copy.set_index(index) 5 | data_copy = data_copy.query(f"{targets[0]} > 0").sort_values(sort_by) 6 | 7 | return ( 8 | (code, {target: data_copy.loc[code, target].values for target in targets}) 9 | for code in data.index.unique() 10 | ) 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Archive files 2 | *.zip 3 | *.tar.gz 4 | *.tar 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | *.userprefs 12 | 13 | # Python 14 | __pycache__/ 15 | *.pyc 16 | 17 | # macOS 18 | .DS_Store 19 | 20 | # Build results 21 | [Dd]ebug/ 22 | [Dd]ebugPublic/ 23 | [Rr]elease/ 24 | [Rr]eleases/ 25 | x64/ 26 | x86/ 27 | bld/ 28 | [Bb]in/ 29 | [Oo]bj/ 30 | [Ll]og/ 31 | msbuild.log 32 | msbuild.err 33 | msbuild.wrn 34 | msbuild.binlog 35 | .vs/ 36 | 37 | -------------------------------------------------------------------------------- /data/csv_parsers/google_parser.py: -------------------------------------------------------------------------------- 1 | from .base import ReportDownloader 2 | 3 | 4 | class GoogleParser: 5 | def __init__(self, cfg): 6 | self.cfg = cfg["google"] 7 | self.downloader = ReportDownloader(self.cfg) 8 | 9 | def _filter_columns(self, df): 10 | df.columns = ["country_code"] + list(df.columns[1:]) 11 | df = df[df["sub_region_1"].isna()] 12 | return df.drop(["country_region", "sub_region_1", "sub_region_2"], 1) 13 | 14 | def load_data(self): 15 | raw_data = self.downloader.download_report( 16 | self.cfg["main_page_url"], "google_report.csv" 17 | ) 18 | processed_data = self._filter_columns(raw_data) 19 | return processed_data 20 | -------------------------------------------------------------------------------- /data/csv_parsers/base.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | import requests 4 | 5 | 6 | class ReportDownloader: 7 | def __init__(self, file_cfg): 8 | self.rewrite = file_cfg["rewrite"] 9 | self.root = file_cfg["root"] 10 | 11 | def download_report(self, url, to_filename): 12 | main_page = requests.get(url) 13 | if main_page.status_code != 200: 14 | raise ValueError(f"Wrong response code for {self.main_page_url}") 15 | data = main_page.content.decode() 16 | filename = f"{self.root}/{to_filename}" 17 | if not os.path.exists(filename) or self.rewrite: 18 | with open(filename, "w") as f: 19 | f.write(data) 20 | 21 | dataframe = pd.read_csv(filename) 22 | return dataframe 23 | 24 | 25 | def fix_date(df, date_format=None): 26 | df["date"] = pd.to_datetime(df.date, format=date_format).dt.strftime("%Y-%m-%d") 27 | return df 28 | -------------------------------------------------------------------------------- /data/csv_parsers/csse_parser.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from .base import ReportDownloader, fix_date 3 | 4 | 5 | class CSSEParser: 6 | def __init__(self, cfg): 7 | self.cfg = cfg["csse"] 8 | self.downloader = ReportDownloader(self.cfg) 9 | self.data = [ 10 | (self.cfg["global_confirmed"], "world_timeseries_confirmed.csv"), 11 | (self.cfg["global_deaths"], "world_timeseries_deaths.csv"), 12 | ] 13 | 14 | def _compose(self, frames): 15 | frames = [frame.groupby("Country/Region").sum() for frame in frames] 16 | frames = [ 17 | pd.melt( 18 | frame.drop(["Lat", "Long"], 1).reset_index(), 19 | id_vars=["Country/Region"], 20 | var_name="date", 21 | value_name="val", 22 | ).set_index(["Country/Region", "date"]) 23 | for frame in frames 24 | ] 25 | frames = pd.concat(frames, axis=1).reset_index() 26 | return frames 27 | 28 | def load_data(self): 29 | frames = [ 30 | self.downloader.download_report(page, fname) for page, fname in self.data 31 | ] 32 | frames = self._compose(frames) 33 | frames.columns = ["country_code", "date", "cases", "deaths"] 34 | csv_data = fix_date(frames, "%m/%d/%y").sort_values(by=["country_code", "date"]) 35 | return csv_data 36 | -------------------------------------------------------------------------------- /file_cfg.yml: -------------------------------------------------------------------------------- 1 | root: ./report_files 2 | reload: false 3 | auxiliary: 4 | { 5 | convention: iso_alpha3, 6 | countries: ./auxiliary_files/countries.csv, 7 | regions: ./auxiliary_files/russia_regions.csv, 8 | geojson: ./auxiliary_files/gadm36_RUS_1.json, 9 | } 10 | rospotreb: 11 | { 12 | rospotreb_page: 'https://www.rospotrebnadzor.ru/', 13 | timeseries_page: 'https://github.com/grwlf/COVID-19_plus_Russia/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_RU.csv', 14 | rewrite: true, 15 | root: ./report_files 16 | } 17 | csse: 18 | { 19 | global_confirmed: 'https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv', 20 | global_deaths: 'https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv', 21 | global_recovered: 'https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv', 22 | rewrite: true, 23 | root: ./report_files 24 | } 25 | google: 26 | { 27 | main_page_url: 'https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv', 28 | rewrite: true, 29 | root: ./report_files 30 | } 31 | oxford: 32 | { 33 | main_page_url: 'https://oxcgrtportal.azurewebsites.net/api/CSVDownload', 34 | rewrite: true, 35 | root: ./report_files 36 | } -------------------------------------------------------------------------------- /data/csv_parsers/oxford_parser.py: -------------------------------------------------------------------------------- 1 | from .base import ReportDownloader, fix_date 2 | 3 | 4 | class OxfordParser: 5 | def __init__(self, cfg): 6 | self.cfg = cfg["oxford"] 7 | self.downloader = ReportDownloader(self.cfg) 8 | 9 | def _filter_columns(self, df): 10 | columns = [ 11 | "CountryCode", 12 | "Date", 13 | "C1_School closing", 14 | "C2_Workplace closing", 15 | "C3_Cancel public events", 16 | "C4_Restrictions on gatherings", 17 | "C6_Stay at home requirements", 18 | "C7_Restrictions on internal movement", 19 | "C8_International travel controls", 20 | "E1_Income support", 21 | "E2_Debt/contract relief", 22 | "E3_Fiscal measures", 23 | "E4_International support", 24 | "H1_Public information campaigns", 25 | "H2_Testing policy", 26 | "H3_Contact tracing", 27 | "H4_Emergency investment in healthcare", 28 | "H5_Investment in vaccines", 29 | "StringencyIndexForDisplay", 30 | ] 31 | 32 | df = df[columns] 33 | df.columns = ["country_code", "date"] + [ 34 | col.replace(" ", "_").lower() for col in df.columns[2:] 35 | ] 36 | return df 37 | 38 | def _process_dataframe(self, df): 39 | df = self._filter_columns(df) 40 | df = fix_date(df, "%Y%m%d") 41 | df = df.fillna(method="ffill") 42 | return df 43 | 44 | def load_data(self): 45 | raw_data = self.downloader.download_report( 46 | self.cfg["main_page_url"], "oxford_report.csv" 47 | ) 48 | processed_data = self._process_dataframe(raw_data) 49 | return processed_data 50 | -------------------------------------------------------------------------------- /visualization/seir.py: -------------------------------------------------------------------------------- 1 | import plotly.graph_objects as go 2 | from IPython.display import Image 3 | from datetime import datetime, timedelta 4 | 5 | 6 | def graph_SEIR(code, opt_result, start_date, data_key="cases", static=False): 7 | fig = go.Figure() 8 | start_date = datetime.strptime(start_date, "%Y-%m-%d") 9 | graph_dates = [ 10 | start_date + timedelta(days=x) 11 | for x in range(len(opt_result[f"predicted_{data_key}"])) 12 | ] 13 | graph_dates = [x.strftime("%Y-%m-%d") for x in graph_dates] 14 | 15 | fig.add_trace( 16 | go.Scatter( 17 | x=graph_dates, 18 | y=[int(x) for x in opt_result[f"predicted_{data_key}"]], 19 | mode="lines", 20 | name="Model outputs", 21 | ) 22 | ) 23 | fig.add_trace( 24 | go.Scatter( 25 | x=graph_dates[: len(opt_result[f"original_{data_key}"])], 26 | y=opt_result[f"original_{data_key}"], 27 | mode="lines+markers", 28 | name="Official data", 29 | marker=dict(size=4), 30 | ) 31 | ) 32 | 33 | fig.update_layout( 34 | title=f"SEIR model outputs for {code}", 35 | xaxis_title="Date since the first confirmed case", 36 | yaxis_title=f"Confirmed {data_key}", 37 | autosize=False, 38 | width=600, 39 | height=350, 40 | margin=dict(l=50, r=50, b=50, t=50, pad=4), 41 | ) 42 | if static: 43 | img_bytes = img_bytes = fig.to_image(format="png") 44 | return Image(img_bytes) 45 | return fig 46 | 47 | 48 | def graph_Rt(code, opt_result, start_date, period=60, static=False): 49 | start_date = datetime.strptime(start_date, "%Y-%m-%d") 50 | graph_dates = [start_date + timedelta(days=x) for x in range(period)] 51 | graph_dates = [x.strftime("%Y-%m-%d") for x in graph_dates] 52 | params = opt_result["parameters"] 53 | k, L = params[-2:] 54 | R_0 = params[0] 55 | 56 | def time_varying_reproduction(t): 57 | return R_0 / (1 + (t / L) ** k) 58 | 59 | Rt = [time_varying_reproduction(x) for x in range(period)] 60 | fig = go.Figure() 61 | fig.add_trace( 62 | go.Scatter( 63 | x=graph_dates, y=[1 for _ in range(period)], mode="lines", name="R of 1" 64 | ) 65 | ) 66 | fig.add_trace(go.Scatter(x=graph_dates, y=Rt, mode="lines", name="Model value",)) 67 | 68 | fig.update_layout( 69 | title=f"SEIR model R parameter reproduction for {code}", 70 | xaxis_title="Date since the first confirmed case", 71 | yaxis_title="Value", 72 | autosize=False, 73 | width=600, 74 | height=350, 75 | margin=dict(l=50, r=50, b=50, t=50, pad=4), 76 | ) 77 | 78 | if static: 79 | img_bytes = img_bytes = fig.to_image(format="png") 80 | return Image(img_bytes) 81 | return fig 82 | -------------------------------------------------------------------------------- /models/validation/validate.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | 4 | 5 | def ale(true, predicted): 6 | """ 7 | Absolute Log Error 8 | """ 9 | return np.abs(np.log10((predicted + 1) / (true + 1))) 10 | 11 | 12 | def collect_scores(true_values, pred_df): 13 | """ 14 | Collects log error scores between predicted and original dataframes. 15 | """ 16 | csv_data = [] 17 | for index in true_values.index.unique(): 18 | if index not in pred_df.index: 19 | continue 20 | true_confirmed = true_values.loc[index]["confirmed"] 21 | pred_confirmed = pred_df.loc[index]["prediction_confirmed"] 22 | 23 | csv_data.append( 24 | [ 25 | index[0], 26 | index[1], 27 | true_values.loc[index]["geoname_code"], 28 | ale(true_confirmed, pred_confirmed), 29 | ] 30 | ) 31 | 32 | csv_data = pd.DataFrame(csv_data) 33 | csv_data.columns = ["region_code", "date", "geoname_code", "cases_male"] 34 | return csv_data.set_index(["region_code", "geoname_code", "date"]) 35 | 36 | 37 | def get_validation_results( 38 | predictions, 39 | test_source, 40 | start, 41 | end, 42 | summary_df, 43 | key="region", 44 | name_col="csse_province_state", 45 | custom_ids=None, 46 | ): 47 | """ 48 | Validates multiple predictions at a time for a specified date range. 49 | predictions = list of dataframes with predictions (submissions) 50 | test_source = original data to compare with 51 | start = starting date in format "%Y-%m-%d" 52 | end = ending date in format "%Y-%m-%d" 53 | summary_df = regions summary information dataframe 54 | key = column with region/country codes 55 | name_col = column with region/country names 56 | custom_ids = None or list of strings with distinct team ids 57 | """ 58 | fixed_predictions = [] 59 | for prediction_df in predictions: 60 | preds = prediction_df.copy() 61 | preds["geoname_code"] = preds[key].apply( 62 | lambda x: summary_df.loc[x, "geoname_code"] 63 | ) 64 | preds["region_name"] = preds[key].apply(lambda x: summary_df.loc[x, name_col]) 65 | preds = preds.query(f'date >= "{start}" & date <= "{end}"').set_index( 66 | ["region", "date"] 67 | ) 68 | fixed_predictions.append(preds) 69 | 70 | test_source["date"] = pd.to_datetime(test_source.date).dt.strftime("%Y-%m-%d") 71 | true_values = ( 72 | test_source.query(f'date >= "{start}" & date <= "{end}"') 73 | .reset_index() 74 | .set_index(["region", "date"]) 75 | ) 76 | 77 | scores = pd.concat( 78 | [collect_scores(true_values, preds) for preds in fixed_predictions], 1 79 | ) 80 | if custom_ids is None: 81 | scores.columns = [f"source_{x}" for x in range(len(scores.columns))] 82 | else: 83 | scores.columns = custom_ids 84 | return scores 85 | -------------------------------------------------------------------------------- /tests/test_model.py: -------------------------------------------------------------------------------- 1 | from data import DatasetManager 2 | from models import CompartmentalOptimizer 3 | from models.selection import model_per_country_simple_split 4 | import pytest 5 | import yaml 6 | 7 | 8 | @pytest.fixture(scope="class") 9 | def config(): 10 | with open("./file_cfg.yml") as f: 11 | cfg = yaml.safe_load(f) 12 | return cfg 13 | 14 | 15 | @pytest.fixture(scope="class") 16 | def manager(config): 17 | manager = DatasetManager(config) 18 | return manager 19 | 20 | 21 | @pytest.fixture(scope="class") 22 | def world_data(manager): 23 | frames = manager.get_data() 24 | frame = frames["world"]["by_date"].set_index("country_code") 25 | return frame 26 | 27 | 28 | @pytest.fixture(scope="class") 29 | def population(manager): 30 | frames = manager.get_data() 31 | frame = frames["world"]["by_country"].set_index("country_code")["population"] 32 | return frame 33 | 34 | 35 | @pytest.fixture(scope="class") 36 | def optimizer(manager): 37 | return CompartmentalOptimizer(optim_days=14) 38 | 39 | 40 | class Test_model: 41 | @pytest.mark.parametrize( 42 | "country_code, start, end, result, r_0", 43 | [ 44 | ("DEU", "2020-02-14", "2020-04-11", 0.008, 3.1407), 45 | ("RUS", "2020-02-14", "2020-04-11", 0.08, 6.9888), 46 | ], 47 | ) 48 | def test_compartment_with_dataframe( 49 | self, optimizer, world_data, population, country_code, start, end, result, r_0 50 | ): 51 | country = world_data.loc[country_code] 52 | mask = (country["date"] >= start) & (country["date"] <= end) 53 | cases = country[mask]["cases"].values 54 | deaths = country[mask]["deaths"].values 55 | pop = population[country_code] 56 | 57 | res = optimizer.fit(cases, deaths, pop) 58 | pred_cases, pred_dead = optimizer.predict(res.x, cases, deaths, pop, 30) 59 | assert len(cases) == len(deaths) 60 | assert len(pred_cases) == len(pred_dead) 61 | assert len(cases) + 30 == len(pred_cases) 62 | assert round(res.fun, 6) < result 63 | assert round(res.x[0], 4) == r_0 64 | 65 | @pytest.mark.parametrize( 66 | "cases, deaths, pop, result, r_0", 67 | [ 68 | ( 69 | [1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 7, 7, 8, 9, 10, 13], 70 | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2], 71 | 397628, 72 | 0.01, 73 | 3.4888, 74 | ), 75 | ], 76 | ) 77 | def test_compartment_raw(self, optimizer, cases, deaths, pop, result, r_0): 78 | res = optimizer.fit(cases, deaths, pop) 79 | pred_cases, pred_dead = optimizer.predict(res.x, cases, deaths, pop, 30) 80 | assert len(pred_cases) == len(pred_dead) 81 | assert round(res.fun, 6) < result 82 | assert round(res.x[0], 4) == r_0 83 | 84 | def test_splits(self, world_data): 85 | codes = set(world_data.index.unique()) 86 | splits = model_per_country_simple_split(world_data, targets=["cases", "deaths"]) 87 | country_codes_alpha3 = {x for x, y in splits} 88 | assert codes == country_codes_alpha3 89 | -------------------------------------------------------------------------------- /README.ru.md: -------------------------------------------------------------------------------- 1 | # Инструменты для обработки информации о COVID-19. 2 | 3 | [![CodeFactor](https://www.codefactor.io/repository/github/spaced0ge/covid-19-tools/badge)](https://www.codefactor.io/repository/github/spaced0ge/covid-19-tools) 4 | [![Build Status](https://travis-ci.com/SpaceD0ge/COVID-19-tools.svg?branch=master)](https://travis-ci.com/SpaceD0ge/COVID-19-tools) 5 | 6 | ## Источники данных 7 | | Source | Description | 8 | | --- | --- | 9 | | [Oxford COVID-19 Government Response Tracker](https://www.bsg.ox.ac.uk/research/research-projects/oxford-covid-19-government-response-tracker) | Реакция правительств стран, размеченная по шкале с индексом "строгости"| 10 | | [Google COVID-19 Community Mobility Reports](https://www.google.com/covid19/mobility/) | графики изменения посещаемости розницы, аптек, парков и т.д. по странам. | 11 | | [2019-nCoV Data Repository by Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19/) | Число подтвержденных заболеваний/смертей. | 12 | 13 | ## Требования 14 | 15 | python 3.5+ 16 | 17 | доступ в интернет 18 | 19 | ## С чего начать 20 | 21 | Собрать все данные в словарь из двух pandas.DataFrame: 22 | ```python 23 | from data import DatasetManager 24 | import yaml 25 | 26 | with open('file_cfg.yml') as f: 27 | cfg = yaml.safe_load(f) 28 | 29 | # чтобы собрать свежие данные, нужно раскомментировать 30 | # следующую строку: 31 | # cfg['reload'] = True 32 | 33 | with open(cfg['auxiliary']['geojson']) as f: 34 | geodata = json.load(f) 35 | data = DatasetManager(cfg).get_data() 36 | 37 | assert list(data.keys()) == ['world', 'russia'] 38 | ``` 39 | 40 | Или получить отчеты отдельно: 41 | ```python 42 | from data import CSSEParser, OxfordParser, GoogleParser, RussianRegionsParser 43 | parsers = [ 44 | CSSEParser(cfg), 45 | OxfordParser(cfg), 46 | GoogleParser(cfg), 47 | RussianRegionsParser(cfg) 48 | ] 49 | data = [parser.load_data() for parser in parsers] 50 | ``` 51 | 52 | Оптимизировать SEIR модель по данным страны: 53 | ```python 54 | from models import CompartmentalOptimizer 55 | 56 | optimizer = CompartmentalOptimizer(optim_days=14) 57 | cases = [1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 7, 7, 8, 9, 10, 13] 58 | deaths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2] 59 | population = 397628 60 | result = optimizer.fit(cases, deaths, population) 61 | ``` 62 | или следуя примерам из папки 63 | 64 | examples 65 | 66 | ## Формат файла конфигурации 67 | 68 | Основные параметры системы работы с файлами собраны в file_cfg.yml. 69 | Каждый парсер отчетов должен сохранять свои файлы в свою папку root. Установлена в "./report_files" по умолчанию. 70 | 71 | root: ./report_files 72 | 73 | Коды стран взяты из схемы "iso_alpha3" (3-буквенной). Файл "countries.csv" содержит не меняющуюся со временем 74 | информацию по странам. 75 | 76 | convention: iso_alpha3 77 | countries: ./countries.csv 78 | 79 | У каждого из источников свои конфигурации. 80 | 81 | csse: {} 82 | google: {} 83 | oxford: {} 84 | 85 | Для того, чтобы каждый раз получать новую информацию, нужно обозначить параметр reload как true. 86 | 87 | reload: false 88 | 89 | 90 | ## Тестирование 91 | 92 | python -m pytest . 93 | 94 | # Coming next 95 | Новые источники данных. 96 | 97 | Новые модели. 98 | 99 | Онлайн-дешборд. -------------------------------------------------------------------------------- /visualization/comparison.py: -------------------------------------------------------------------------------- 1 | import plotly.express as px 2 | import plotly.graph_objects as go 3 | import pandas as pd 4 | 5 | 6 | def plot_errors( 7 | scores, summary, source_id=None, graph_type="map", geodata=None, height=450 8 | ): 9 | region_errors = scores.reset_index().groupby(["region_code", "geoname_code"]).sum() 10 | if source_id is None: 11 | region_errors = region_errors.sum(1) 12 | else: 13 | region_errors = region_errors[source_id] 14 | region_errors = region_errors.reset_index() 15 | region_errors.columns = list(region_errors.columns[:-1]) + ["error"] 16 | title = f'Cumulative region error {"for " + source_id if source_id else "combined"}' 17 | 18 | if graph_type == "map": 19 | fig = px.choropleth_mapbox( 20 | region_errors, 21 | geojson=geodata, 22 | locations="geoname_code", 23 | featureidkey="properties.HASC_1", 24 | color="error", 25 | range_color=[0, region_errors.mean()["error"] * 2], 26 | ) 27 | fig.update_layout( 28 | mapbox_style="carto-positron", 29 | mapbox_zoom=0.8, 30 | mapbox_center={"lat": 61.5, "lon": 105}, 31 | height=height, 32 | margin={"r": 0, "t": 0, "l": 0, "b": 2}, 33 | ) 34 | return fig 35 | if graph_type == "pie": 36 | err = region_errors.sort_values(by="error", ascending=False).copy() 37 | err = err[:15].append( 38 | pd.DataFrame([["OTHER", "", err[15:]["error"].sum()]], columns=err.columns) 39 | ) 40 | err["region"] = err["region_code"].apply( 41 | lambda x: summary.loc[x, "name_with_type"] if x in summary.index else x 42 | ) 43 | fig = px.pie(err, values="error", names="region", title=title) 44 | return fig 45 | raise ValueError(f"Wrong {graph_type} type") 46 | 47 | 48 | def plot_predictions( 49 | predictions, 50 | names, 51 | data_source, 52 | group="region", 53 | value="RU-MOW", 54 | key="confirmed", 55 | height=None, 56 | ): 57 | local_data = data_source.reset_index() 58 | local_data = local_data.query(f'date > "{local_data["date"].values[-12]}"') 59 | local_data = local_data.set_index(group).loc[value] 60 | dates = local_data["date"] 61 | title = f"Predictions for {group} {value} ({key})" 62 | 63 | fig = go.Figure() 64 | fig.add_trace( 65 | go.Scatter( 66 | x=dates, 67 | y=local_data[key], 68 | mode="lines+markers", 69 | name="Source data", 70 | marker=dict(size=10,), 71 | ) 72 | ) 73 | for pred_idx, preds in enumerate(predictions): 74 | local_pred = preds.reset_index().set_index(group).loc[value] 75 | local_pred = local_pred.query( 76 | f'date >= "{min(dates)}" & date <= "{max(dates)}"' 77 | ) 78 | fig.add_trace( 79 | go.Scatter( 80 | x=local_pred["date"], 81 | y=local_pred["prediction_" + key], 82 | mode="lines+markers", 83 | name=names[pred_idx], 84 | ) 85 | ) 86 | fig.update_layout(title=title) 87 | if height is not None: 88 | fig.update_layout(height=height) 89 | return fig 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tools for the COVID-19 information processing. 2 | Simple up to date data retrieval tools. 3 | 4 | [![CodeFactor](https://www.codefactor.io/repository/github/spaced0ge/covid-19-tools/badge)](https://www.codefactor.io/repository/github/spaced0ge/covid-19-tools) 5 | [![Build Status](https://travis-ci.com/SpaceD0ge/COVID-19-tools.svg?branch=master)](https://travis-ci.com/SpaceD0ge/COVID-19-tools) 6 | 7 | ## Data sources 8 | | Source | Description | 9 | | --- | --- | 10 | | [Oxford COVID-19 Government Response Tracker](https://www.bsg.ox.ac.uk/research/research-projects/oxford-covid-19-government-response-tracker) | Stringency ratings for different government responses. | 11 | | [Google COVID-19 Community Mobility Reports](https://www.google.com/covid19/mobility/) | Mobility trends for different areas and types of places. | 12 | | [2019-nCoV Data Repository by Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19/) | Tracking cases by country. | 13 | 14 | ## Requirements 15 | 16 | python 3.5+ 17 | 18 | internet access 19 | 20 | ## Getting started 21 | 22 | Combine all data in one dictionary with two dataframes: 23 | ```python 24 | from data import DatasetManager 25 | import yaml 26 | 27 | with open('file_cfg.yml') as f: 28 | cfg = yaml.safe_load(f) 29 | 30 | # to get up to date data from online sources each time 31 | # uncomment the next part: 32 | # cfg['reload'] = True 33 | 34 | with open(cfg['auxiliary']['geojson']) as f: 35 | geodata = json.load(f) 36 | data = DatasetManager(cfg).get_data() 37 | 38 | assert list(data.keys()) == ['world', 'russia'] 39 | ``` 40 | 41 | Or get reports separately: 42 | ```python 43 | from data import CSSEParser, OxfordParser, GoogleParser 44 | parsers = [ 45 | CSSEParser(cfg), 46 | OxfordParser(cfg), 47 | GoogleParser(cfg) 48 | ] 49 | data = [parser.load_data() for parser in parsers] 50 | ``` 51 | 52 | Train a SEIR model approximation per country: 53 | ```python 54 | from models import CompartmentalOptimizer 55 | 56 | optimizer = CompartmentalOptimizer(optim_days=14) 57 | cases = [1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 7, 7, 8, 9, 10, 13] 58 | deaths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2] 59 | population = 397628 60 | result = optimizer.fit(cases, deaths, population) 61 | ``` 62 | 63 | or follow examples from the 64 | 65 | examples 66 | folder 67 | 68 | ## Configuration format 69 | 70 | The main file configuration parameters can be found in the file_cfg.yml. 71 | Each of the main data parsers should have a root folder. Set to "./report_files" by default. 72 | 73 | root: ./report_files 74 | 75 | Default naming convention is "iso_alpha3" (3-letter country code). The "countries.csv" file holds some additional information. 76 | 77 | convention: iso_alpha3 78 | countries: ./countries.csv 79 | 80 | Three data sources each have their specific configuration options. 81 | 82 | csse: {} 83 | google: {} 84 | oxford: {} 85 | 86 | Specify the "reload" option as true to retrieve up to date information each time. 87 | Do not unnecessarily overload the public servers though. 88 | 89 | reload: false 90 | 91 | 92 | ## Running tests 93 | 94 | python -m pytest . 95 | 96 | # Coming next 97 | New data sources 98 | 99 | Prediction models 100 | 101 | Online dashboard 102 | -------------------------------------------------------------------------------- /models/compartment/seir.py: -------------------------------------------------------------------------------- 1 | class SEIR_HCD: 2 | """ 3 | https://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology 4 | Succeptible - Exposed - Infectious - Recovered compartmental model 5 | with Hospitalized - Critical - Fatal parameters by research group 6 | of Richard Neher. 7 | Links/sources: 8 | https://covid19-scenarios.org/about 9 | https://www.kaggle.com/anjum48/seir-hcd-model 10 | """ 11 | 12 | def __init__(self): 13 | pass 14 | 15 | def _susceptible(self, S, I, R_t, infectious_period): 16 | return -(R_t / infectious_period) * I * S 17 | 18 | def _exposed(self, S, E, I, R_t, infectious_period, incubation_period): 19 | return (R_t / infectious_period) * I * S - (E / incubation_period) 20 | 21 | def _infected(self, I, E, incubation_period, infectious_period): 22 | return (E / incubation_period) - (I / infectious_period) 23 | 24 | def _hospitalized( 25 | self, 26 | I, 27 | C, 28 | H, 29 | infectious_period, 30 | time_in_hospital, 31 | time_critical, 32 | mild_fraction, 33 | fatal_fraction, 34 | ): 35 | return ( 36 | ((1 - mild_fraction) * (I / infectious_period)) 37 | + ((1 - fatal_fraction) * C / time_critical) 38 | - (H / time_in_hospital) 39 | ) 40 | 41 | def _critical(self, H, C, time_in_hospital, time_critical, critical_fraction): 42 | return (critical_fraction * H / time_in_hospital) - (C / time_critical) 43 | 44 | def _recovered( 45 | self, 46 | I, 47 | H, 48 | infectious_period, 49 | time_in_hospital, 50 | mild_fraction, 51 | critical_fraction, 52 | ): 53 | return (mild_fraction * I / infectious_period) + (1 - critical_fraction) * ( 54 | H / time_in_hospital 55 | ) 56 | 57 | def _dead(self, C, time_critical, fatal_fraction): 58 | return fatal_fraction * C / time_critical 59 | 60 | def model( 61 | self, 62 | time_step, 63 | compartments, 64 | R_t, 65 | incubation_period=7, 66 | infectious_period=5, 67 | time_in_hospital=4, 68 | time_critical=7, 69 | mild_fraction=0.8, 70 | critical_fraction=0.1, 71 | fatal_fraction=0.2, 72 | ): 73 | if callable(R_t): 74 | R_t = R_t(time_step) 75 | 76 | S, E, I, R, H, C, D = compartments 77 | 78 | S_out = self._susceptible(S, I, R_t, infectious_period) 79 | E_out = self._exposed(S, E, I, R_t, infectious_period, incubation_period) 80 | I_out = self._infected(I, E, incubation_period, infectious_period) 81 | R_out = self._recovered( 82 | I, H, infectious_period, time_in_hospital, mild_fraction, critical_fraction 83 | ) 84 | H_out = self._hospitalized( 85 | I, 86 | C, 87 | H, 88 | infectious_period, 89 | time_in_hospital, 90 | time_critical, 91 | mild_fraction, 92 | fatal_fraction, 93 | ) 94 | C_out = self._critical(H, C, time_in_hospital, time_critical, critical_fraction) 95 | D_out = self._dead(C, time_critical, fatal_fraction) 96 | return [S_out, E_out, I_out, R_out, H_out, C_out, D_out] 97 | 98 | def __call__(self, *args): 99 | return self.model(*args) 100 | -------------------------------------------------------------------------------- /tests/test_dataset.py: -------------------------------------------------------------------------------- 1 | import yaml 2 | from data import DatasetManager 3 | import pytest 4 | import pandas as pd 5 | 6 | 7 | @pytest.fixture(scope="class") 8 | def config(): 9 | with open("./file_cfg.yml") as f: 10 | cfg = yaml.safe_load(f) 11 | cfg["reload"] = True 12 | return cfg 13 | 14 | 15 | @pytest.fixture(scope="class") 16 | def country_codes_alpha3(config): 17 | data = pd.read_csv(config["auxiliary"]["countries"]) 18 | data = data["iso_alpha3"].unique() 19 | return set(data) 20 | 21 | 22 | @pytest.fixture(scope="class") 23 | def manager(config): 24 | manager = DatasetManager(config) 25 | return manager 26 | 27 | 28 | @pytest.fixture(scope="class") 29 | def dataframe(manager): 30 | frame = manager.get_data() 31 | return frame 32 | 33 | 34 | @pytest.fixture(scope="class") 35 | def world_data(dataframe): 36 | return dataframe["world"]["by_date"] 37 | 38 | 39 | @pytest.fixture(scope="class") 40 | def rus_data(dataframe): 41 | return dataframe["russia"]["by_date"] 42 | 43 | 44 | class Test_dataset: 45 | @pytest.mark.parametrize( 46 | "date, country_code, columns, values", 47 | [ 48 | ("2020-03-28", "SWZ", ["c1_school_closing", "cases"], [3, 9]), 49 | ("2020-04-02", "USA", ["deaths", "cases"], [7938, 244008]), 50 | ("2020-04-05", "RUS", ["cases", "deaths"], [5389, 45]), 51 | ("2020-04-30", "RUS", ["cases", "deaths"], [106498, 1073]), 52 | ("2020-01-22", "AFG", ["cases", "deaths", "c1_school_closing"], [0, 0, 0]), 53 | ], 54 | ) 55 | def test_different_dates(self, world_data, date, country_code, columns, values): 56 | row = world_data[ 57 | (world_data["date"] == date) & (world_data["country_code"] == country_code) 58 | ] 59 | assert list(row[columns].values[0]) == values 60 | 61 | @pytest.mark.parametrize( 62 | "country_code, start, end, column, changes", 63 | [ 64 | ( 65 | "DEU", 66 | "2020-03-11", 67 | "2020-03-19", 68 | "retail_and_recreation_percent_change_from_baseline", 69 | [0, 0, 1, 1, 0, 0, 0], 70 | ), 71 | ( 72 | "ITA", 73 | "2020-03-09", 74 | "2020-03-17", 75 | "parks_percent_change_from_baseline", 76 | [0, 0, 0, 0, 0, 1, 0], 77 | ), 78 | ], 79 | ) 80 | def test_graph_dynamic(self, world_data, country_code, start, end, column, changes): 81 | country = world_data.set_index("country_code").loc[country_code].dropna() 82 | mask = (country["date"] > start) & (country["date"] <= end) 83 | values = country[mask][column].rolling(2).apply(lambda x: x[0] < x[1]) 84 | values = list(values[1:]) 85 | assert values == changes 86 | 87 | def test_country_codes(self, world_data, country_codes_alpha3): 88 | codes = set(world_data["country_code"].unique()) 89 | assert codes == country_codes_alpha3 90 | 91 | def test_dataframe_integrity(self, dataframe): 92 | assert list(dataframe.keys()) == ["world", "russia"] 93 | world_timeline = dataframe["world"]["by_date"] 94 | for date in world_timeline["date"].unique(): 95 | assert ( 96 | world_timeline[world_timeline["date"] == date].shape[0] 97 | == dataframe["world"]["by_country"].shape[0] 98 | ) 99 | rus_timeline = dataframe["russia"]["by_date"] 100 | for date in rus_timeline["date"].unique(): 101 | assert ( 102 | rus_timeline[rus_timeline["date"] == date].shape[0] 103 | == dataframe["russia"]["by_region"].shape[0] 104 | ) 105 | -------------------------------------------------------------------------------- /data/dataset.py: -------------------------------------------------------------------------------- 1 | from .csv_parsers import OxfordParser, CSSEParser, GoogleParser 2 | from .rospotrebnadzor import RussianRegionsParser 3 | import pandas as pd 4 | import os 5 | 6 | 7 | class Convention: 8 | def __init__(self, cfg): 9 | country_code_file = cfg["countries"] 10 | self.convention = cfg["convention"] 11 | conventions = { 12 | "iso_alpha2", 13 | "iso_alpha3", 14 | "iso_numeric", 15 | "name", 16 | "official_name", 17 | "ccse_name", 18 | } 19 | self.converters = { 20 | code: pd.read_csv(country_code_file, index_col=code).to_dict() 21 | for code in conventions 22 | if code != self.convention 23 | } 24 | 25 | def _get_country_convention(self, country_code): 26 | if country_code.isupper(): 27 | if len(country_code) == 2: 28 | return "iso_alpha2" 29 | if len(country_code) == 3: 30 | return "iso_alpha3" 31 | raise ValueError(f"Can't find proper convention for {country_code}") 32 | return "ccse_name" 33 | 34 | def _convert_code(self, code, from_convention): 35 | converter = self.converters[from_convention] 36 | if code in converter[self.convention]: 37 | return converter[self.convention][code] 38 | return None 39 | 40 | def fix_report(self, report, key="country_code"): 41 | report_convention = self._get_country_convention(report.loc[0, key]) 42 | if report_convention != self.convention: 43 | report.loc[:, key] = report[key].apply( 44 | lambda x: self._convert_code(x, report_convention) 45 | ) 46 | return report[report[key].notna()] 47 | 48 | 49 | class DateLevelStatCollector: 50 | def __init__(self, cfg): 51 | self.convention = Convention(cfg["auxiliary"]) 52 | csse_parser = CSSEParser(cfg) 53 | oxford_parser = OxfordParser(cfg) 54 | google_parser = GoogleParser(cfg) 55 | self.parsers = [csse_parser, oxford_parser, google_parser] 56 | 57 | def collect_dataframe(self): 58 | reports = [parser.load_data() for parser in self.parsers] 59 | reports = [ 60 | self.convention.fix_report(report, "country_code") for report in reports 61 | ] 62 | 63 | joint_report = None 64 | for report_index in range(len(reports) - 1): 65 | left_report = ( 66 | reports[report_index] if joint_report is None else joint_report 67 | ) 68 | right_report = reports[report_index + 1] 69 | 70 | joint_report = pd.merge( 71 | left_report, 72 | right_report, 73 | how="left", 74 | left_on=["date", "country_code"], 75 | right_on=["date", "country_code"], 76 | ) 77 | 78 | return joint_report 79 | 80 | 81 | class SummaryStatCollector: 82 | def __init__(self, cfg): 83 | self.cfg = cfg["auxiliary"] 84 | 85 | def collect_dataframe(self, key="countries"): 86 | country_file = self.cfg[key] 87 | data = pd.read_csv(country_file) 88 | return data.rename(columns={"iso_alpha3": "country_code"}) 89 | 90 | 91 | class RegionLevelStatCollector: 92 | def __init__(self, cfg): 93 | self.rosparser = RussianRegionsParser(cfg) 94 | 95 | def collect_dataframe(self): 96 | report = self.rosparser.load_data() 97 | return report.reset_index() 98 | 99 | 100 | class DatasetManager: 101 | def __init__(self, cfg): 102 | self.root = cfg["root"] 103 | self.reload = cfg["reload"] 104 | self.summary = SummaryStatCollector(cfg) 105 | self.date_parser = DateLevelStatCollector(cfg) 106 | self.region_parser = RegionLevelStatCollector(cfg) 107 | 108 | def _load(self, filename, parser, **args): 109 | if os.path.exists(filename) and self.reload is False: 110 | dataframe = pd.read_csv(filename) 111 | else: 112 | dataframe = parser.collect_dataframe(**args) 113 | dataframe.to_csv(filename, index=False) 114 | return dataframe 115 | 116 | def get_data(self): 117 | wold_countries = self._load( 118 | f"{self.root}/world_countries.csv", self.summary, key="countries" 119 | ) 120 | world_timeseries = self._load( 121 | f"{self.root}/world_confirmed_cases.csv", self.date_parser 122 | ) 123 | russia_regions = self._load( 124 | f"{self.root}/rus_regions.csv", self.summary, key="regions" 125 | ) 126 | russia_timeseries = self._load( 127 | f"{self.root}/rus_confirmed_cases.csv", self.region_parser 128 | ) 129 | 130 | return { 131 | "world": {"by_country": wold_countries, "by_date": world_timeseries}, 132 | "russia": {"by_region": russia_regions, "by_date": russia_timeseries}, 133 | } 134 | -------------------------------------------------------------------------------- /visualization/advanced.py: -------------------------------------------------------------------------------- 1 | import plotly.express as px 2 | import plotly.graph_objects as go 3 | from plotly.subplots import make_subplots 4 | import numpy as np 5 | 6 | 7 | class CustomOverviewGraph: 8 | def __init__(self, df, geodata): 9 | self.regions_df = df 10 | self.geodata = geodata 11 | 12 | def get_pop_map(self, data, date="2020-04-20"): 13 | local_data = data.query(f'date == "{date}"') 14 | return go.Choroplethmapbox( 15 | locations=local_data["geoname_code"], 16 | geojson=self.geodata, 17 | text=[ 18 | self.regions_df.loc[x, "name_with_type"] 19 | for x in local_data["region"].values 20 | ], 21 | hoverinfo="all", 22 | featureidkey="properties.HASC_1", 23 | z=local_data["confirmed_pop"], 24 | colorscale=px.colors.sequential.tempo, 25 | coloraxis="coloraxis", 26 | name="Russian map", 27 | ) 28 | 29 | def get_bar_ratings(self, data, key="prediction_confirmed", date="2020-04-20"): 30 | bar_data = data.query(f'date == "{date}"').reset_index() 31 | bar_data = bar_data.sort_values(by=key)[-15:] 32 | return go.Bar( 33 | text=[ 34 | self.regions_df.loc[x, "name_with_type"] 35 | for x in bar_data["region"].values 36 | ], 37 | y=bar_data[key].apply(np.log10), 38 | textposition="inside", 39 | showlegend=False, 40 | yaxis="y2", 41 | ) 42 | 43 | def get_dynamic(self, data, key="prediction_confirmed"): 44 | df_diff = data[["date", key]].groupby("date").sum().diff().dropna() 45 | return go.Bar(x=df_diff.index, y=df_diff[key], showlegend=False) 46 | 47 | def animate(self, fig, data, key, dates): 48 | frames = [ 49 | go.Frame( 50 | data=[ 51 | go.Bar(visible=True), 52 | self.get_bar_ratings(data, key, date), 53 | self.get_pop_map(data, date), 54 | ], 55 | traces=[0, 1, 2], 56 | name=date, 57 | ) 58 | for date in dates 59 | ] 60 | 61 | steps = [ 62 | dict( 63 | method="animate", 64 | args=[ 65 | [date], 66 | dict( 67 | mode="e", 68 | frame=dict(duration=20, redraw=True), 69 | transition=dict(duration=0), 70 | ), 71 | ], 72 | label=date, 73 | ) 74 | for date in dates 75 | ] 76 | 77 | sliders = [dict(steps=steps, active=0)] 78 | 79 | fig.frames = frames 80 | fig.update_layout(sliders=sliders) 81 | 82 | def get_annotations(self): 83 | return [ 84 | dict( 85 | text="% населения с подтвержденным заражением для областей России", 86 | bgcolor="black", 87 | bordercolor="black", 88 | borderwidth=1, 89 | showarrow=False, 90 | xref="paper", 91 | yref="paper", 92 | x=1, 93 | y=1, 94 | ), 95 | dict( 96 | text="Заражений по дням", 97 | showarrow=False, 98 | textangle=90, 99 | xref="paper", 100 | yref="paper", 101 | x=0.4, 102 | y=1, 103 | ), 104 | dict( 105 | text="Log шкала заражений", 106 | showarrow=False, 107 | textangle=90, 108 | xref="paper", 109 | yref="paper", 110 | x=0.4, 111 | y=0.05, 112 | ), 113 | ] 114 | 115 | def fix_axis(self, fig): 116 | fig.update_layout( 117 | coloraxis={"colorscale": px.colors.sequential.tempo, "cmax": 0.3, "cmin": 0} 118 | ) 119 | fig.update_layout(yaxis2={"range": (0, 5)}) 120 | 121 | def fix_style(self, fig): 122 | fig.update_layout( 123 | title="Распространение COVID-19 по России (подтвержденные случаи заражений)", 124 | template="plotly_dark", 125 | mapbox_style="carto-darkmatter", 126 | mapbox_zoom=1.2, 127 | mapbox_center={"lat": 65.5, "lon": 105}, 128 | margin=dict(r=20, t=50, b=20, l=30), 129 | annotations=self.get_annotations(), 130 | ) 131 | 132 | def plot(self, data, key, dates): 133 | 134 | fig = make_subplots( 135 | rows=2, 136 | cols=2, 137 | column_widths=[0.4, 0.6], 138 | row_heights=[0.5, 0.5], 139 | specs=[ 140 | [{"type": "bar"}, {"type": "choroplethmapbox", "rowspan": 2}], 141 | [{"type": "bar"}, None], 142 | ], 143 | ) 144 | 145 | data = data.query('date > "2020-03-20"').reset_index().copy() 146 | data["pop"] = data["region"].apply( 147 | lambda x: self.regions_df.loc[x, "population"] 148 | ) 149 | data["confirmed_pop"] = 100 * data[key] / data["pop"] 150 | fig.add_trace(self.get_dynamic(data, key), 1, 1) 151 | fig.add_trace(self.get_bar_ratings(data, key, dates[0]), 2, 1) 152 | fig.add_trace(self.get_pop_map(data, dates[0]), 1, 2) 153 | 154 | if len(dates) > 0: 155 | self.animate(fig, data, key, dates) 156 | 157 | self.fix_axis(fig) 158 | self.fix_style(fig) 159 | 160 | return fig 161 | -------------------------------------------------------------------------------- /visualization/basic.py: -------------------------------------------------------------------------------- 1 | import plotly.express as px 2 | import plotly.graph_objects as go 3 | import numpy as np 4 | 5 | 6 | def plot_map( 7 | data, 8 | title, 9 | color_key, 10 | color_scale, 11 | geodata=None, 12 | hover_name=None, 13 | animation_frame=None, 14 | center=(61.5, 105), 15 | map_style="carto-positron", 16 | map_class="choropleth", 17 | ): 18 | if map_class == "choropleth": 19 | map_figure = px.choropleth 20 | elif map_class in ("choropleth_mapbox", "mapbox"): 21 | map_figure = px.choropleth_mapbox 22 | else: 23 | raise ValueError(f"Wrong map type {map_class}") 24 | fig = map_figure( 25 | data, 26 | geojson=geodata, 27 | locations="geoname_code", 28 | featureidkey="properties.HASC_1", 29 | color=color_key, 30 | animation_frame=animation_frame, 31 | range_color=[data[color_key].min(), data[color_key].max() * 1.3], 32 | hover_name=hover_name, 33 | hover_data=[color_key], 34 | center={"lat": center[0], "lon": center[1]}, 35 | color_continuous_scale=color_scale, 36 | ) 37 | 38 | fig.update_layout( 39 | mapbox_style=map_style, mapbox_zoom=1, mapbox_center=center, 40 | ) 41 | fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0}) 42 | 43 | fig.update_layout( 44 | annotations=[ 45 | dict(text=title, showarrow=False, xref="paper", yref="paper", x=0, y=1.00) 46 | ] 47 | ) 48 | return fig 49 | 50 | 51 | def plot_country_dynamic( 52 | data, start="2020-03-06", key="confirmed", group="region_name", clip=0 53 | ): 54 | if start: 55 | data = data.query(f'date > "{start}"') 56 | if clip > 0: 57 | date = data["date"].max() 58 | selected = data[data["date"] == date].sort_values(by="cases")[-clip:][group] 59 | data = data.set_index(group).loc[selected].reset_index() 60 | fig = px.line(data, x="date", y=key, color=group) 61 | fig.update_layout(yaxis_type="log") 62 | fig.update_layout(dict(title="Country dynamics for confirmed cases")) 63 | return fig 64 | 65 | 66 | def plot_cases_map( 67 | data, 68 | geojson=None, 69 | key="confirmed", 70 | group="geoname_code", 71 | log_scale=False, 72 | mtype="choropleth", 73 | center=None, 74 | date=None, 75 | ): 76 | data["geoname_code"] = data[group] 77 | if date is None: 78 | date = data["date"].max() 79 | local_data = data.query(f'date == "{date}"').copy() 80 | if log_scale: 81 | local_data["log_values"] = np.log10(local_data[key]) 82 | key = "log_values" 83 | 84 | postfix = "Log scale" if log_scale else "" 85 | title = f"Confirmed cases by region by {date}. {postfix}" 86 | 87 | return plot_map( 88 | local_data, 89 | title, 90 | key, 91 | px.colors.sequential.tempo, 92 | geodata=geojson, 93 | map_class=mtype, 94 | center=center, 95 | ) 96 | 97 | 98 | def plot_region_dynamic(data, region_code, key="confirmed", group="region_name"): 99 | bar_data = data.reset_index().set_index(group).loc[region_code].query(f"{key} > 5") 100 | fig = go.Figure( 101 | [ 102 | go.Bar(x=bar_data["date"], y=bar_data[key], name="cumulative"), 103 | go.Scatter(x=bar_data["date"], y=bar_data[key].diff(), name="by day"), 104 | ] 105 | ) 106 | title = f"Confirmed cases dynamic for {region_code}" 107 | fig.update_layout(title=title) 108 | return fig 109 | 110 | 111 | def plot_simple_difference( 112 | scores, group="date", graph_type="scatter", cumulative=False 113 | ): 114 | aggregate = scores.reset_index().groupby(group).mean() 115 | if cumulative: 116 | aggregate = aggregate.rolling(min_periods=1, window=120).sum() 117 | 118 | aggregate = aggregate.reset_index().melt( 119 | id_vars=[group], var_name="source_id", value_name="log_error" 120 | ) 121 | title = "Comparing different predictions" 122 | if graph_type == "scatter": 123 | return px.line( 124 | aggregate, x=group, y="log_error", color="source_id", title=title 125 | ) 126 | if graph_type == "bar": 127 | return px.bar( 128 | aggregate, 129 | x=group, 130 | y="log_error", 131 | color="source_id", 132 | barmode="group", 133 | title=title, 134 | ) 135 | raise ValueError(f"Wrong graph type {graph_type}") 136 | 137 | 138 | def plot_map_difference( 139 | scores, 140 | geojson, 141 | group="geoname_code", 142 | by_source=False, 143 | mtype="choropleth", 144 | center=None, 145 | ): 146 | agg = scores.reset_index().groupby(group).mean() 147 | if by_source: 148 | agg["best"] = agg.apply(np.argmin, 1) 149 | agg.reset_index(inplace=True) 150 | key = "best" 151 | animation = None 152 | title = "Comparing different predictions by best index" 153 | scale = px.colors.sequential.Rainbow 154 | else: 155 | agg = agg.reset_index().melt( 156 | id_vars=["geoname_code"], var_name="source", value_name="error" 157 | ) 158 | key = "error" 159 | animation = "source" 160 | title = "Comparing different predictions by region error values" 161 | scale = px.colors.sequential.Reds 162 | fig = plot_map( 163 | agg, 164 | title, 165 | key, 166 | scale, 167 | animation_frame=animation, 168 | geodata=geojson, 169 | map_class=mtype, 170 | center=center, 171 | ) 172 | 173 | if not by_source: 174 | fig.update_layout(coloraxis={"cmax": agg.error.max(), "cmin": agg.error.min()}) 175 | 176 | return fig 177 | 178 | 179 | __all__ = [ 180 | "plot_region_dynamic", 181 | "plot_country_dynamic", 182 | "plot_simple_difference", 183 | "plot_map_difference", 184 | "plot_cases_map", 185 | ] 186 | -------------------------------------------------------------------------------- /models/compartment/optimizer.py: -------------------------------------------------------------------------------- 1 | from scipy.optimize import minimize, NonlinearConstraint 2 | from sklearn.metrics import mean_squared_log_error 3 | from scipy.integrate import solve_ivp 4 | from .seir import SEIR_HCD 5 | import numpy as np 6 | 7 | 8 | DEFAULT_STATES = { 9 | "R_0": [2, (1, 7)], 10 | "time_incubation": [2, (2, 15)], 11 | "time_infectious": [1.5, (1.5, 16)], 12 | "time_in_hospital": [2, (2, 10)], 13 | "time_critical": [1, (1, 20)], 14 | "mild_fraction": [0.5, (0.5, 0.95)], 15 | "critical_fraction": [0, (0.05, 0.65)], 16 | "fatal_fraction": [0, (0.01, 0.65)], 17 | "k": [2, (1, 10)], 18 | "L": [2, (1, 100)], 19 | } 20 | 21 | 22 | class CompartmentalModel: 23 | def __init__(self, model_function, optimize_days=21): 24 | self.model = model_function 25 | self.optim_days = optimize_days 26 | 27 | def _get_optimization_args(self, params): 28 | """ 29 | Returns parameters with the reproduction number decayed by Hill. 30 | Assume this order of parameters: 31 | (R_0, t_inc, t_inf, t_hosp, t_crit, 32 | mild, critical, fatal, 33 | k, L) 34 | """ 35 | R_0 = params[0] 36 | k, L = params[-2:] 37 | 38 | def time_varying_reproduction(t): 39 | return R_0 / (1 + (t / L) ** k) 40 | 41 | args = (time_varying_reproduction,) + tuple(params[1:-2]) 42 | return args 43 | 44 | def _get_predictions(self, solution, population): 45 | """ 46 | Returns predictions of confirmed cases and fatalities. 47 | Original solution values are measured in fractions of population. 48 | """ 49 | _, _, inf, rec, hosp, crit, deaths = solution.y 50 | pred_cases = np.clip(inf + rec + hosp + crit + deaths, 0, np.inf) * population 51 | pred_fatal = np.clip(deaths, 0, np.inf) * population 52 | return pred_cases, pred_fatal 53 | 54 | def _eval_msle(self, sol, data_cases, data_deaths, population): 55 | """ 56 | Weighted mean squared log error for measuring data similarity. 57 | Returns combined msle score with predicted numbers. 58 | Used to optimize SEIR model parameters. 59 | """ 60 | pred_cases, pred_fatal = self._get_predictions(sol, population) 61 | optim_days = min(self.optim_days, len(data_cases)) 62 | weights = 1 / np.arange(1, optim_days + 1)[::-1] 63 | 64 | msle_cases = mean_squared_log_error( 65 | data_cases[-optim_days:], pred_cases[-optim_days:], sample_weight=weights 66 | ) 67 | msle_fat = mean_squared_log_error( 68 | data_deaths[-optim_days:], pred_fatal[-optim_days:], sample_weight=weights 69 | ) 70 | score = np.mean([msle_cases * 0.75, msle_fat * 0.25]) 71 | return score, (pred_cases, pred_fatal) 72 | 73 | def _solve_ode(self, args, population, n_infected, days): 74 | """ 75 | Solve the SEIR differential equation system to get the compartmental 76 | function model for further optimization. 77 | """ 78 | initial_state = [ 79 | (population - n_infected) / population, 80 | 0, 81 | n_infected / population, 82 | 0, 0, 0, 0, 83 | ] 84 | 85 | solution = solve_ivp( 86 | self.model, [0, days], initial_state, args=args, t_eval=np.arange(0, days) 87 | ) 88 | return solution 89 | 90 | def model_optimization_function( 91 | self, params, data_cases, data_deaths, population, forecast_days=0 92 | ): 93 | """ 94 | Main optimization function for comparing the SEIR model with 95 | Returns either the SEIR msle likelihood score or the predicted numbers. 96 | """ 97 | args = self._get_optimization_args(params) 98 | max_days = len(data_cases) + forecast_days 99 | sol = self._solve_ode(args, population, data_cases[0], max_days) 100 | msle_score, predicted = self._eval_msle( 101 | sol, data_cases, data_deaths, population 102 | ) 103 | 104 | if forecast_days == 0: 105 | return msle_score 106 | return predicted 107 | 108 | 109 | class CompartmentalOptimizer: 110 | """ 111 | Compartment model interface with fit() and predict() functionality. 112 | Fits the SEIR model to amounts of cases and deaths. 113 | """ 114 | 115 | def __init__(self, parameter_states=None, optim_days=21): 116 | model = CompartmentalModel(SEIR_HCD(), optim_days) 117 | self.model_fn = model.model_optimization_function 118 | self.states = parameter_states 119 | if parameter_states is None: 120 | self.states = DEFAULT_STATES 121 | if list(self.states.keys()) != [ 122 | "R_0", 123 | "time_incubation", 124 | "time_infectious", 125 | "time_in_hospital", 126 | "time_critical", 127 | "mild_fraction", 128 | "critical_fraction", 129 | "fatal_fraction", 130 | "k", 131 | "L", 132 | ]: 133 | raise ValueError("Wrong state keys") 134 | 135 | def fit(self, cases, deaths, population, generate_guesses=None): 136 | if generate_guesses is None: 137 | initial_guesses = [[x[0] for x in self.states.values()]] 138 | else: 139 | initial_guesses = [ 140 | np.linspace(x[1][0], x[1][1], generate_guesses) 141 | for x in DEFAULT_STATES.values() 142 | ] 143 | initial_guesses = np.array(initial_guesses).transpose() 144 | 145 | bounds = [x[1] for x in self.states.values()] 146 | 147 | def constraint(x): 148 | return x[3] - x[4] 149 | 150 | cons = NonlinearConstraint(constraint, 1.0, 10.0) 151 | best = (10000, None) 152 | for initial_guess in initial_guesses: 153 | result = minimize( 154 | self.model_fn, 155 | initial_guess, 156 | bounds=bounds, 157 | constraints=cons, 158 | args=(cases, deaths, population, False), 159 | method="SLSQP", 160 | tol=1e-10, 161 | options={"maxiter": 5000}, 162 | ) 163 | if result.fun < best[0]: 164 | best = (result.fun, result) 165 | 166 | return best[1] 167 | 168 | def predict(self, params, cases, deaths, population, horizon=10): 169 | predicted = self.model_fn(params, cases, deaths, population, horizon) 170 | return predicted 171 | -------------------------------------------------------------------------------- /data/rospotrebnadzor/ros_parser.py: -------------------------------------------------------------------------------- 1 | from bs4 import BeautifulSoup 2 | from datetime import datetime, timedelta 3 | import warnings 4 | import requests 5 | import pandas as pd 6 | import re 7 | 8 | 9 | class RegionMatcher: 10 | """ 11 | Ironing out disrepances between RosPotrebNadzor labels and iso_alpha3 codes. 12 | """ 13 | 14 | def get_simplified_region(self, x): 15 | x = x.lower() 16 | x = ( 17 | x.replace("край", "") 18 | .replace("область", "") 19 | .replace("республика", "") 20 | .replace(" ао", "") 21 | .replace("г.", "") 22 | ) 23 | return x.split()[0] 24 | 25 | def get_matching_regions(self, soup, tag="li"): 26 | matches = [ 27 | re.match("(\d+\.\s){0,1}(.*)\s-\s(\d+)", x.text) for x in soup.find_all(tag) 28 | ] 29 | matches = [ 30 | [x.group(2).lower(), int(x.group(3))] for x in matches if x is not None 31 | ] 32 | return matches 33 | 34 | def collect_region_update(self, table_soup, region_df): 35 | matches = self.get_matching_regions(table_soup, "li") 36 | if len(matches) == 0: 37 | matches = self.get_matching_regions(table_soup, "p") 38 | if len(matches) == 0: 39 | matches = self.get_matching_regions(table_soup, "div") 40 | if len(matches) == 0: 41 | raise ValueError('Rospotrebnadzor parser is not working\ 42 | due to an unexpected page formatting change.') 43 | # to simplified format 44 | matches = [(self.get_simplified_region(x[0]), x[1]) for x in matches] 45 | # extracting iso codes 46 | iso_codes = region_df.set_index("name")["iso_code"].to_dict() 47 | iso_codes = {self.get_simplified_region(x): iso_codes[x] for x in iso_codes} 48 | matched_codes = [(iso_codes[x[0]], x[1]) for x in matches] 49 | # finding the last date 50 | date = table_soup.find("p", {"class": "date"}) 51 | date = datetime.strptime(date.text[:-3], "%d.%m.%Y").strftime("%Y-%m-%d") 52 | update_df = pd.DataFrame(matched_codes) 53 | update_df.columns = ["region", "confirmed"] 54 | update_df["date"] = date 55 | return update_df 56 | 57 | 58 | class ReportDownloader: 59 | def __init__(self, cfg): 60 | self.cfg = cfg 61 | 62 | def get_latest_info(self): 63 | rospage_response = requests.get(self.cfg["rospotreb_page"] + "about/info/news/") 64 | main_page_content = rospage_response.content.decode("Windows-1251") 65 | soup = BeautifulSoup(main_page_content, "html.parser") 66 | link = ( 67 | self.cfg["rospotreb_page"] 68 | + soup.find( 69 | "a", 70 | text=" О подтвержденных случаях новой коронавирусной инфекции COVID-2019 в России", 71 | )["href"] 72 | ) 73 | last_report_response = requests.get(link) 74 | report = last_report_response.content.decode("Windows-1251") 75 | soup = BeautifulSoup(report, "html.parser") 76 | div = soup.find("div", {"class": "news-detail"}) 77 | return div 78 | 79 | def download_report(self): 80 | confirmed_cases = pd.read_csv(self.cfg["timeseries_page"]) 81 | last_update = self.get_latest_info() 82 | return confirmed_cases, last_update 83 | 84 | 85 | class RussianRegionsParser: 86 | """ 87 | Getting up to date data about confirmed COVID-19 cases in Russia. 88 | """ 89 | 90 | def __init__(self, cfg): 91 | main_cfg = cfg["rospotreb"] 92 | aux_cfg = cfg["auxiliary"] 93 | self.downloader = ReportDownloader(main_cfg) 94 | self.regions_fname = aux_cfg["regions"] 95 | self.matcher = RegionMatcher() 96 | 97 | def fix_date(self, df): 98 | df["date"] = pd.to_datetime(df.date).dt.strftime("%Y-%m-%d") 99 | return df 100 | 101 | def convert_series_format(self, original_series_df, regions_df): 102 | """ 103 | Converting original files to a submission-based format. 104 | From regions as columns and dates as rows to the opposite. 105 | """ 106 | regions_df = regions_df.set_index("csse_province_state") 107 | new_cols = ["date"] + list(original_series_df["Province_State"]) 108 | date_series = ( 109 | original_series_df[original_series_df.columns[11:]] 110 | .transpose() 111 | .reset_index() 112 | ) 113 | date_series.columns = new_cols 114 | date_series = date_series.melt( 115 | id_vars=["date"], var_name="region_name", value_name="confirmed" 116 | ) 117 | date_series["region"] = date_series["region_name"].apply( 118 | lambda x: regions_df.loc[x, "iso_code"] 119 | ) 120 | return self.fix_date(date_series.set_index("region")) 121 | 122 | def merge_update(self, original, update): 123 | """ 124 | RosPotrebNadzor updates are measured in changes by day. 125 | We need to add them to the originals to make resulting update cumulative. 126 | """ 127 | date = datetime.strptime(update["date"][0], "%Y-%m-%d") - timedelta(days=1) 128 | date = date.strftime("%Y-%m-%d") 129 | update["region_name"] = update["region"].apply( 130 | lambda x: original.loc[x, "region_name"][0] 131 | ) 132 | update.set_index("region", inplace=True) 133 | original_prev = original.query(f'date == "{date}"') 134 | if original_prev.shape[0] == 0: 135 | warnings.warn( 136 | "Original timeseries source lags two days behind latest rospotrebnadzor update. Returning original." 137 | ) 138 | return original 139 | update["confirmed"] = original_prev["confirmed"] + update["confirmed"] 140 | # fill missing values 141 | for region_code in original.index.unique(): 142 | if region_code not in update.index: 143 | update.loc[region_code] = [ 144 | original_prev.loc[region_code, "confirmed"], 145 | update["date"][0], 146 | original_prev.loc[region_code, "region_name"], 147 | ] 148 | return original.append(update).sort_values(by=["region", "date"]) 149 | 150 | def load_data(self): 151 | regions_df = pd.read_csv(self.regions_fname) 152 | # download the latest rospotrebnadzor report for up to date retrieval 153 | confirmed_cases, last_update = self.downloader.download_report() 154 | confirmed_cases = self.convert_series_format(confirmed_cases, regions_df) 155 | # collecting iso_alpha3 codes for raw rospotrebnadzor representations 156 | update = self.matcher.collect_region_update(last_update, regions_df) 157 | # merging the last update with data 158 | full_cases = self.merge_update(confirmed_cases, update) 159 | regions_df.set_index("iso_code", inplace=True) 160 | # adding proper geocodes 161 | full_cases = pd.merge( 162 | full_cases, 163 | regions_df["geoname_code"], 164 | how="outer", 165 | left_index=True, 166 | right_index=True, 167 | ) 168 | full_cases.index = full_cases.index.rename("region") 169 | return full_cases 170 | -------------------------------------------------------------------------------- /report_files/rus_regions.csv: -------------------------------------------------------------------------------- 1 | iso_code,name,type,name_with_type,csse_province_state,federal_district,timezone,geoname_code,geoname_id,geoname_name,population,population_urban,population_rural 2 | RU-ALT,Алтайский,край,Алтайский край,Altayskiy kray,Сибирский,UTC+7,RU.AL,1511732,Altai Krai,2317052,1320066,996986 3 | RU-AMU,Амурская,обл,Амурская обл,Amursk oblast,Дальневосточный,UTC+9,RU.AM,2027748,Amur Oblast,790676,535760,254916 4 | RU-ARK,Архангельская,обл,Архангельская обл,Arkhangelsk oblast,Северо-Западный,UTC+3,RU.AR,581043,Arkhangelskaya,1136387,893305,243082 5 | RU-AST,Астраханская,обл,Астраханская обл,Astrahan oblast,Южный,UTC+4,RU.AS,580491,Astrakhan,1005967,671311,334656 6 | RU-BEL,Белгородская,обл,Белгородская обл,Belgorod oblast,Центральный,UTC+3,RU.BL,578071,Belgorod Oblast,1547532,1044622,502910 7 | RU-BRY,Брянская,обл,Брянская обл,Briansk oblast,Центральный,UTC+3,RU.BR,571473,Bryansk Oblast,1192570,839959,352611 8 | RU-VLA,Владимирская,обл,Владимирская обл,Vladimir oblast,Центральный,UTC+3,RU.VL,826294,Vladimir,1358538,1063144,295394 9 | RU-VGG,Волгоградская,обл,Волгоградская обл,Volgograd oblast,Южный,UTC+4,RU.VG,472755,Volgograd Oblast,2491751,1925884,565867 10 | RU-VLG,Вологодская,обл,Вологодская обл,Vologda oblast,Северо-Западный,UTC+3,RU.VO,472454,Vologda,1160721,843528,317193 11 | RU-VOR,Воронежская,обл,Воронежская обл,Voronezh oblast,Центральный,UTC+3,RU.VR,472039,Voronezj,2323657,1578552,745105 12 | RU-MOW,Москва,г,г Москва,Moscow,Центральный,UTC+3,RU.MOW,524894,Moscow,12692466,12479250,213216 13 | RU-SPE,Санкт-Петербург,г,г Санкт-Петербург,Saint Petersburg,Северо-Западный,UTC+3,RU.SP,536203,St.-Petersburg,5392992,5392992,0 14 | UA-40,Севастополь,г,г Севастополь,Sevastopol,Южный,UTC+3,,694422,Sevastopol City,448829,418486,30343 15 | RU-YEV,Еврейская,Аобл,Еврейская Аобл,Jewish Autonomous oblast,Дальневосточный,UTC+10,RU.YV,2026639,Jewish Autonomous Oblast,158381,108743,49638 16 | RU-ZAB,Забайкальский,край,Забайкальский край,Zabaykalskiy kray,Дальневосточный,UTC+9,RU.ZB,7779061,Transbaikal Territory,1059657,722656,337001 17 | RU-IVA,Ивановская,обл,Ивановская обл,Ivanovo oblast,Центральный,UTC+3,RU.IV,555235,Ivanovo,997196,814762,182434 18 | RU-IRK,Иркутская,обл,Иркутская обл,Irkutsk oblast,Сибирский,UTC+8,RU.IK,2023468,Irkutsk Oblast,2390827,1866866,523961 19 | RU-KGD,Калининградская,обл,Калининградская обл,Kaliningrad oblast,Северо-Западный,UTC+2,RU.KN,554230,Kaliningrad,1012253,786074,226179 20 | RU-KLU,Калужская,обл,Калужская обл,Kaluga oblast,Центральный,UTC+3,RU.KG,553899,Kaluga,1000070,758622,241448 21 | RU-KAM,Камчатский,край,Камчатский край,Kamchatskiy kray,Дальневосточный,UTC+12,RU.KQ,2125072,Kamchatka,312438,245128,67310 22 | RU-KEM,Кемеровская область - Кузбасс,обл,Кемеровская область - Кузбасс,Kemerovo oblast,Сибирский,UTC+7,RU.KE,1503900,Kemerovo Oblast,2657758,2287209,370549 23 | RU-KIR,Кировская,обл,Кировская обл,Kirov oblast,Приволжский,UTC+3,RU.KV,548389,Kirov,1262549,982009,280540 24 | RU-KOS,Костромская,обл,Костромская обл,Kostroma oblast,Центральный,UTC+3,RU.KT,543871,Kostroma Oblast,633392,460492,172900 25 | RU-KDA,Краснодарский,край,Краснодарский край,Krasnodarskiy kray,Южный,UTC+3,RU.KD,542415,Krasnodarskiy,5677786,3142394,2535392 26 | RU-KYA,Красноярский,край,Красноярский край,Krasnoyarskiy kray,Сибирский,UTC+7,RU.KX,1502020,Krasnoyarskiy,2867875,2223281,644594 27 | RU-KGN,Курганская,обл,Курганская обл,Kurgan oblast,Уральский,UTC+5,RU.KU,1501312,Kurgan Oblast,826941,514369,312572 28 | RU-KRS,Курская,обл,Курская обл,Kursk oblast,Центральный,UTC+3,RU.KS,538555,Kursk,1103059,755463,347596 29 | RU-LEN,Ленинградская,обл,Ленинградская обл,Leningradskaya oblast,Северо-Западный,UTC+3,RU.LN,536199,Leningradskaya Oblast,1876392,1259045,617347 30 | RU-LIP,Липецкая,обл,Липецкая обл,Lipetsk oblast,Центральный,UTC+3,RU.LP,535120,Lipetsk Oblast,1139492,736624,402868 31 | RU-MAG,Магаданская,обл,Магаданская обл,Magadan oblast,Дальневосточный,UTC+11,RU.MG,2123627,Magadan Oblast,140199,134720,5479 32 | RU-MOS,Московская,обл,Московская обл,Moscow oblast,Центральный,UTC+3,RU.MS,524925,Moscow Oblast,7687647,6255436,1432211 33 | RU-MUR,Мурманская,обл,Мурманская обл,Murmansk oblast,Северо-Западный,UTC+3,RU.MM,524304,Murmansk,741511,683463,58048 34 | RU-NEN,Ненецкий,АО,Ненецкий АО,Nenetskiy autonomous oblast,Северо-Западный,UTC+3,RU.NN,522652,Nenets,44110,32542,11568 35 | RU-NIZ,Нижегородская,обл,Нижегородская обл,Nizhegorodskaya oblast,Приволжский,UTC+3,RU.NZ,559838,Nizhny Novgorod Oblast,3203818,2553182,650636 36 | RU-NGR,Новгородская,обл,Новгородская обл,Novgorod oblast,Северо-Западный,UTC+3,RU.NG,519324,Novgorod Oblast,596173,426224,169949 37 | RU-NVS,Новосибирская,обл,Новосибирская обл,Novosibirsk oblast,Сибирский,UTC+7,RU.NS,1496745,Novosibirsk Oblast,2798251,2216509,581742 38 | RU-OMS,Омская,обл,Омская обл,Omsk oblast,Сибирский,UTC+6,RU.OM,1496152,Omsk,1926562,1405124,521438 39 | RU-ORE,Оренбургская,обл,Оренбургская обл,Orenburg oblast,Приволжский,UTC+5,RU.OB,515001,Orenburg Oblast,1956256,1186257,769999 40 | RU-ORL,Орловская,обл,Орловская обл,Orel oblast,Центральный,UTC+3,RU.OL,514801,Orel Oblast,733682,490115,243567 41 | RU-PNZ,Пензенская,обл,Пензенская обл,Pensa oblast,Приволжский,UTC+3,RU.PZ,511555,Penza,1304825,899237,405588 42 | RU-PER,Пермский,край,Пермский край,Perm oblast,Приволжский,UTC+5,RU.PE,511180,Perm,2599301,1973085,626216 43 | RU-PRI,Приморский,край,Приморский край,Primorskiy kray,Дальневосточный,UTC+10,RU.PR,2017623,Primorskiy (Maritime) Kray,1895305,1468917,426388 44 | RU-PSK,Псковская,обл,Псковская обл,Pskov oblast,Северо-Западный,UTC+3,RU.PS,504338,Pskov Oblast,626046,445301,180745 45 | RU-AD,Адыгея,Респ,Респ Адыгея,Republic of Adygeia,Южный,UTC+3,RU.AD,584222,Adygeya Republic,463453,219137,244316 46 | RU-AL,Алтай,Респ,Респ Алтай,Altay republic,Сибирский,UTC+7,RU.GA,1506272,Altai,220140,64478,155662 47 | RU-BA,Башкортостан,Респ,Респ Башкортостан,Republic of Bashkortostan,Приволжский,UTC+5,RU.BK,578853,Bashkortostan Republic,4037811,2520970,1516841 48 | RU-BU,Бурятия,Респ,Респ Бурятия,Republic of Buriatia,Дальневосточный,UTC+8,RU.BU,2050915,Buryatiya Republic,986109,584178,401931 49 | RU-DA,Дагестан,Респ,Респ Дагестан,Republic of Dagestan,Северо-Кавказский,UTC+3,RU.DA,567293,Dagestan,3111353,1409380,1701973 50 | RU-IN,Ингушетия,Респ,Респ Ингушетия,Ingushetia republic,Северо-Кавказский,UTC+3,RU.IN,556349,Ingushetiya Republic,506688,281966,224722 51 | RU-KB,Кабардино-Балкарская,Респ,Респ Кабардино-Балкарская,Republic of Kabardino-Balkaria,Северо-Кавказский,UTC+3,RU.KB,554667,Kabardino-Balkariya Republic,868174,451834,416340 52 | RU-KL,Калмыкия,Респ,Респ Калмыкия,Republic of Kalmykia,Южный,UTC+3,RU.KL,553972,Kalmykiya Republic,271035,124393,146642 53 | RU-KC,Карачаево-Черкесская,Респ,Респ Карачаево-Черкесская,Republic of Karachaevo-Cherkessia,Северо-Кавказский,UTC+3,RU.KC,552927,Karachayevo-Cherkesiya Republic,465669,199703,265966 54 | RU-KR,Карелия,Респ,Респ Карелия,Republic of Karelia,Северо-Западный,UTC+3,RU.KI,552548,Karelia,614628,498156,116472 55 | RU-KO,Коми,Респ,Респ Коми,Komi republic,Северо-Западный,UTC+3,RU.KO,545854,Komi,820171,641442,178729 56 | UA-43,Крым,Респ,Респ Крым,Republic of Crimea,Южный,UTC+3,,703883,Crimea,1912025,974739,937286 57 | RU-ME,Марий Эл,Респ,Респ Марий Эл,Republic of Mariy El,Приволжский,UTC+3,RU.ME,529352,Mariy-El Republic,679094,455179,223915 58 | RU-MO,Мордовия,Респ,Респ Мордовия,Republic of Mordovia,Приволжский,UTC+3,RU.MR,525369,Mordoviya Republic,790829,504905,285924 59 | RU-SA,Саха /Якутия/,Респ,Респ Саха /Якутия/,Saha republic,Дальневосточный,UTC+9,RU.SK,2013162,Sakha,970105,640897,329208 60 | RU-SE,Северная Осетия - Алания,Респ,Респ Северная Осетия - Алания,Republic of North Osetia - Alania,Северо-Кавказский,UTC+3,RU.NO,519969,North Ossetia,697064,448320,248744 61 | RU-TA,Татарстан,Респ,Респ Татарстан,Republic of Tatarstan,Приволжский,UTC+3,RU.TT,484048,Tatarstan Republic,3902642,3001688,900954 62 | RU-TY,Тыва,Респ,Респ Тыва,Republic of Tyva,Сибирский,UTC+7,RU.TU,1488873,Republic of Tyva,327388,177665,149723 63 | RU-UD,Удмуртская,Респ,Респ Удмуртская,Republic of Udmurtia,Приволжский,UTC+4,RU.UD,479613,Udmurtiya Republic,1501005,992330,508675 64 | RU-KK,Хакасия,Респ,Респ Хакасия,Republic of Hakassia,Сибирский,UTC+7,RU.KK,1503834,Khakasiya Republic,534186,372955,161231 65 | RU-CE,Чеченская,Респ,Респ Чеченская,Chechen republic,Северо-Кавказский,UTC+3,RU.CN,569665,Chechnya,1476752,544760,931992 66 | RU-ROS,Ростовская,обл,Ростовская обл,Rostov oblast,Южный,UTC+3,RU.RO,501165,Rostov,4195327,2860931,1334396 67 | RU-RYA,Рязанская,обл,Рязанская обл,Ryazan oblast,Центральный,UTC+3,RU.RZ,500059,Ryazan Oblast,1108924,800800,308124 68 | RU-SAM,Самарская,обл,Самарская обл,Samara oblast,Приволжский,UTC+4,RU.SA,499068,Samara Oblast,3179026,2537265,641761 69 | RU-SAR,Саратовская,обл,Саратовская обл,Saratov oblast,Приволжский,UTC+4,RU.SR,498671,Saratovskaya Oblast,2421785,1830957,590828 70 | RU-SAK,Сахалинская,обл,Сахалинская обл,Sakhalin oblast,Дальневосточный,UTC+11,RU.SL,2121529,Sakhalin Oblast,488453,402271,86182 71 | RU-SVE,Свердловская,обл,Свердловская обл,Sverdlov oblast,Уральский,UTC+5,RU.SV,1490542,Sverdlovsk,4310861,3664833,646028 72 | RU-SMO,Смоленская,обл,Смоленская обл,Smolensk oblast,Центральный,UTC+3,RU.SM,491684,Smolensk,934747,671445,263302 73 | RU-STA,Ставропольский,край,Ставропольский край,Stavropolskiy kray,Северо-Кавказский,UTC+3,RU.ST,487839,Stavropol Kray,2803021,1655987,1147034 74 | RU-TAM,Тамбовская,обл,Тамбовская обл,Tambov oblast,Центральный,UTC+3,RU.TB,484638,Tambov,1006962,618169,388793 75 | RU-TVE,Тверская,обл,Тверская обл,Tver oblast,Центральный,UTC+3,RU.TV,480041,Tver Oblast,1260345,959753,300592 76 | RU-TOM,Томская,обл,Томская обл,Tomsk oblast,Сибирский,UTC+7,RU.TO,1489421,Tomsk Oblast,1079051,781262,297789 77 | RU-TUL,Тульская,обл,Тульская обл,Tula oblast,Центральный,UTC+3,RU.TL,480508,Tula,1466025,1096891,369134 78 | RU-TYU,Тюменская,обл,Тюменская обл,Tumen oblast,Уральский,UTC+5,RU.TY,1488747,Tyumen Oblast,3755778,3042591,713187 79 | RU-ULY,Ульяновская,обл,Ульяновская обл,Ulianovsk oblast,Приволжский,UTC+4,RU.UL,479119,Ulyanovsk,1229687,932510,297177 80 | RU-KHA,Хабаровский,край,Хабаровский край,Habarovskiy kray,Дальневосточный,UTC+10,RU.KH,2022888,Khabarovsk,1315310,1079726,235584 81 | RU-KHM,Ханты-Мансийский Автономный округ - Югра,АО,Ханты-Мансийский Автономный округ - Югра,Hanty-Mansiyskiy AO,Уральский,UTC+5,RU.KM,1503773,Khanty-Mansia,1674086,1548527,125559 82 | RU-CHE,Челябинская,обл,Челябинская обл,Cheliabinsk oblast,Уральский,UTC+5,RU.CL,1508290,Chelyabinsk,3466960,2865000,601960 83 | RU-CU,Чувашская Республика -,Чувашия,Чувашская Республика - Чувашия,Republic of Chuvashia,Приволжский,UTC+3,RU.CV,567395,Chuvashia,1217820,772101,445719 84 | RU-CHU,Чукотский,АО,Чукотский АО,Chukotskiy autonomous oblast,Дальневосточный,UTC+12,RU.CK,2126099,Chukotka,50726,36273,14453 85 | RU-YAN,Ямало-Ненецкий,АО,Ямало-Ненецкий АО,Yamalo-Nenetskiy AO,Уральский,UTC+5,RU.YN,1486462,Yamalo-Nenets,544008,456604,87404 86 | RU-YAR,Ярославская,обл,Ярославская обл,Yaroslavl oblast,Центральный,UTC+3,RU.YS,468898,Jaroslavl,1253189,1022434,230755 87 | -------------------------------------------------------------------------------- /auxiliary_files/russia_regions.csv: -------------------------------------------------------------------------------- 1 | iso_code,name,type,name_with_type,csse_province_state,federal_district,timezone,geoname_code,geoname_id,geoname_name,population,population_urban,population_rural 2 | RU-ALT,Алтайский,край,Алтайский край,Altayskiy kray,Сибирский,UTC+7,RU.AL,1511732,Altai Krai,2317052,1320066,996986 3 | RU-AMU,Амурская,обл,Амурская обл,Amursk oblast,Дальневосточный,UTC+9,RU.AM,2027748,Amur Oblast,790676,535760,254916 4 | RU-ARK,Архангельская,обл,Архангельская обл,Arkhangelsk oblast,Северо-Западный,UTC+3,RU.AR,581043,Arkhangelskaya,1136387,893305,243082 5 | RU-AST,Астраханская,обл,Астраханская обл,Astrahan oblast,Южный,UTC+4,RU.AS,580491,Astrakhan,1005967,671311,334656 6 | RU-BEL,Белгородская,обл,Белгородская обл,Belgorod oblast,Центральный,UTC+3,RU.BL,578071,Belgorod Oblast,1547532,1044622,502910 7 | RU-BRY,Брянская,обл,Брянская обл,Briansk oblast,Центральный,UTC+3,RU.BR,571473,Bryansk Oblast,1192570,839959,352611 8 | RU-VLA,Владимирская,обл,Владимирская обл,Vladimir oblast,Центральный,UTC+3,RU.VL,826294,Vladimir,1358538,1063144,295394 9 | RU-VGG,Волгоградская,обл,Волгоградская обл,Volgograd oblast,Южный,UTC+4,RU.VG,472755,Volgograd Oblast,2491751,1925884,565867 10 | RU-VLG,Вологодская,обл,Вологодская обл,Vologda oblast,Северо-Западный,UTC+3,RU.VO,472454,Vologda,1160721,843528,317193 11 | RU-VOR,Воронежская,обл,Воронежская обл,Voronezh oblast,Центральный,UTC+3,RU.VR,472039,Voronezj,2323657,1578552,745105 12 | RU-MOW,Москва,г,г Москва,Moscow,Центральный,UTC+3,RU.MOW,524894,Moscow,12692466,12479250,213216 13 | RU-SPE,Санкт-Петербург,г,г Санкт-Петербург,Saint Petersburg,Северо-Западный,UTC+3,RU.SP,536203,St.-Petersburg,5392992,5392992,0 14 | UA-40,Севастополь,г,г Севастополь,Sevastopol,Южный,UTC+3,,694422,Sevastopol City,448829,418486,30343 15 | RU-YEV,Еврейская,Аобл,Еврейская Аобл,Jewish Autonomous oblast,Дальневосточный,UTC+10,RU.YV,2026639,Jewish Autonomous Oblast,158381,108743,49638 16 | RU-ZAB,Забайкальский,край,Забайкальский край,Zabaykalskiy kray,Дальневосточный,UTC+9,RU.ZB,7779061,Transbaikal Territory,1059657,722656,337001 17 | RU-IVA,Ивановская,обл,Ивановская обл,Ivanovo oblast,Центральный,UTC+3,RU.IV,555235,Ivanovo,997196,814762,182434 18 | RU-IRK,Иркутская,обл,Иркутская обл,Irkutsk oblast,Сибирский,UTC+8,RU.IK,2023468,Irkutsk Oblast,2390827,1866866,523961 19 | RU-KGD,Калининградская,обл,Калининградская обл,Kaliningrad oblast,Северо-Западный,UTC+2,RU.KN,554230,Kaliningrad,1012253,786074,226179 20 | RU-KLU,Калужская,обл,Калужская обл,Kaluga oblast,Центральный,UTC+3,RU.KG,553899,Kaluga,1000070,758622,241448 21 | RU-KAM,Камчатский,край,Камчатский край,Kamchatskiy kray,Дальневосточный,UTC+12,RU.KQ,2125072,Kamchatka,312438,245128,67310 22 | RU-KEM,Кемеровская область - Кузбасс,обл,Кемеровская область - Кузбасс,Kemerovo oblast,Сибирский,UTC+7,RU.KE,1503900,Kemerovo Oblast,2657758,2287209,370549 23 | RU-KIR,Кировская,обл,Кировская обл,Kirov oblast,Приволжский,UTC+3,RU.KV,548389,Kirov,1262549,982009,280540 24 | RU-KOS,Костромская,обл,Костромская обл,Kostroma oblast,Центральный,UTC+3,RU.KT,543871,Kostroma Oblast,633392,460492,172900 25 | RU-KDA,Краснодарский,край,Краснодарский край,Krasnodarskiy kray,Южный,UTC+3,RU.KD,542415,Krasnodarskiy,5677786,3142394,2535392 26 | RU-KYA,Красноярский,край,Красноярский край,Krasnoyarskiy kray,Сибирский,UTC+7,RU.KX,1502020,Krasnoyarskiy,2867875,2223281,644594 27 | RU-KGN,Курганская,обл,Курганская обл,Kurgan oblast,Уральский,UTC+5,RU.KU,1501312,Kurgan Oblast,826941,514369,312572 28 | RU-KRS,Курская,обл,Курская обл,Kursk oblast,Центральный,UTC+3,RU.KS,538555,Kursk,1103059,755463,347596 29 | RU-LEN,Ленинградская,обл,Ленинградская обл,Leningradskaya oblast,Северо-Западный,UTC+3,RU.LN,536199,Leningradskaya Oblast,1876392,1259045,617347 30 | RU-LIP,Липецкая,обл,Липецкая обл,Lipetsk oblast,Центральный,UTC+3,RU.LP,535120,Lipetsk Oblast,1139492,736624,402868 31 | RU-MAG,Магаданская,обл,Магаданская обл,Magadan oblast,Дальневосточный,UTC+11,RU.MG,2123627,Magadan Oblast,140199,134720,5479 32 | RU-MOS,Московская,обл,Московская обл,Moscow oblast,Центральный,UTC+3,RU.MS,524925,Moscow Oblast,7687647,6255436,1432211 33 | RU-MUR,Мурманская,обл,Мурманская обл,Murmansk oblast,Северо-Западный,UTC+3,RU.MM,524304,Murmansk,741511,683463,58048 34 | RU-NEN,Ненецкий,АО,Ненецкий АО,Nenetskiy autonomous oblast,Северо-Западный,UTC+3,RU.NN,522652,Nenets,44110,32542,11568 35 | RU-NIZ,Нижегородская,обл,Нижегородская обл,Nizhegorodskaya oblast,Приволжский,UTC+3,RU.NZ,559838,Nizhny Novgorod Oblast,3203818,2553182,650636 36 | RU-NGR,Новгородская,обл,Новгородская обл,Novgorod oblast,Северо-Западный,UTC+3,RU.NG,519324,Novgorod Oblast,596173,426224,169949 37 | RU-NVS,Новосибирская,обл,Новосибирская обл,Novosibirsk oblast,Сибирский,UTC+7,RU.NS,1496745,Novosibirsk Oblast,2798251,2216509,581742 38 | RU-OMS,Омская,обл,Омская обл,Omsk oblast,Сибирский,UTC+6,RU.OM,1496152,Omsk,1926562,1405124,521438 39 | RU-ORE,Оренбургская,обл,Оренбургская обл,Orenburg oblast,Приволжский,UTC+5,RU.OB,515001,Orenburg Oblast,1956256,1186257,769999 40 | RU-ORL,Орловская,обл,Орловская обл,Orel oblast,Центральный,UTC+3,RU.OL,514801,Orel Oblast,733682,490115,243567 41 | RU-PNZ,Пензенская,обл,Пензенская обл,Pensa oblast,Приволжский,UTC+3,RU.PZ,511555,Penza,1304825,899237,405588 42 | RU-PER,Пермский,край,Пермский край,Perm oblast,Приволжский,UTC+5,RU.PE,511180,Perm,2599301,1973085,626216 43 | RU-PRI,Приморский,край,Приморский край,Primorskiy kray,Дальневосточный,UTC+10,RU.PR,2017623,Primorskiy (Maritime) Kray,1895305,1468917,426388 44 | RU-PSK,Псковская,обл,Псковская обл,Pskov oblast,Северо-Западный,UTC+3,RU.PS,504338,Pskov Oblast,626046,445301,180745 45 | RU-AD,Адыгея,Респ,Респ Адыгея,Republic of Adygeia,Южный,UTC+3,RU.AD,584222,Adygeya Republic,463453,219137,244316 46 | RU-AL,Алтай,Респ,Респ Алтай,Altay republic,Сибирский,UTC+7,RU.GA,1506272,Altai,220140,64478,155662 47 | RU-BA,Башкортостан,Респ,Респ Башкортостан,Republic of Bashkortostan,Приволжский,UTC+5,RU.BK,578853,Bashkortostan Republic,4037811,2520970,1516841 48 | RU-BU,Бурятия,Респ,Респ Бурятия,Republic of Buriatia,Дальневосточный,UTC+8,RU.BU,2050915,Buryatiya Republic,986109,584178,401931 49 | RU-DA,Дагестан,Респ,Респ Дагестан,Republic of Dagestan,Северо-Кавказский,UTC+3,RU.DA,567293,Dagestan,3111353,1409380,1701973 50 | RU-IN,Ингушетия,Респ,Респ Ингушетия,Ingushetia republic,Северо-Кавказский,UTC+3,RU.IN,556349,Ingushetiya Republic,506688,281966,224722 51 | RU-KB,Кабардино-Балкарская,Респ,Респ Кабардино-Балкарская,Republic of Kabardino-Balkaria,Северо-Кавказский,UTC+3,RU.KB,554667,Kabardino-Balkariya Republic,868174,451834,416340 52 | RU-KL,Калмыкия,Респ,Респ Калмыкия,Republic of Kalmykia,Южный,UTC+3,RU.KL,553972,Kalmykiya Republic,271035,124393,146642 53 | RU-KC,Карачаево-Черкесская,Респ,Респ Карачаево-Черкесская,Republic of Karachaevo-Cherkessia,Северо-Кавказский,UTC+3,RU.KC,552927,Karachayevo-Cherkesiya Republic,465669,199703,265966 54 | RU-KR,Карелия,Респ,Респ Карелия,Republic of Karelia,Северо-Западный,UTC+3,RU.KI,552548,Karelia,614628,498156,116472 55 | RU-KO,Коми,Респ,Респ Коми,Komi republic,Северо-Западный,UTC+3,RU.KO,545854,Komi,820171,641442,178729 56 | UA-43,Крым,Респ,Респ Крым,Republic of Crimea,Южный,UTC+3,,703883,Crimea,1912025,974739,937286 57 | RU-ME,Марий Эл,Респ,Респ Марий Эл,Republic of Mariy El,Приволжский,UTC+3,RU.ME,529352,Mariy-El Republic,679094,455179,223915 58 | RU-MO,Мордовия,Респ,Респ Мордовия,Republic of Mordovia,Приволжский,UTC+3,RU.MR,525369,Mordoviya Republic,790829,504905,285924 59 | RU-SA,Саха /Якутия/,Респ,Респ Саха /Якутия/,Saha republic,Дальневосточный,UTC+9,RU.SK,2013162,Sakha,970105,640897,329208 60 | RU-SE,Северная Осетия - Алания,Респ,Респ Северная Осетия - Алания,Republic of North Osetia - Alania,Северо-Кавказский,UTC+3,RU.NO,519969,North Ossetia,697064,448320,248744 61 | RU-TA,Татарстан,Респ,Респ Татарстан,Republic of Tatarstan,Приволжский,UTC+3,RU.TT,484048,Tatarstan Republic,3902642,3001688,900954 62 | RU-TY,Тыва,Респ,Респ Тыва,Republic of Tyva,Сибирский,UTC+7,RU.TU,1488873,Republic of Tyva,327388,177665,149723 63 | RU-UD,Удмуртская,Респ,Респ Удмуртская,Republic of Udmurtia,Приволжский,UTC+4,RU.UD,479613,Udmurtiya Republic,1501005,992330,508675 64 | RU-KK,Хакасия,Респ,Респ Хакасия,Republic of Hakassia,Сибирский,UTC+7,RU.KK,1503834,Khakasiya Republic,534186,372955,161231 65 | RU-CE,Чеченская,Респ,Респ Чеченская,Chechen republic,Северо-Кавказский,UTC+3,RU.CN,569665,Chechnya,1476752,544760,931992 66 | RU-ROS,Ростовская,обл,Ростовская обл,Rostov oblast,Южный,UTC+3,RU.RO,501165,Rostov,4195327,2860931,1334396 67 | RU-RYA,Рязанская,обл,Рязанская обл,Ryazan oblast,Центральный,UTC+3,RU.RZ,500059,Ryazan Oblast,1108924,800800,308124 68 | RU-SAM,Самарская,обл,Самарская обл,Samara oblast,Приволжский,UTC+4,RU.SA,499068,Samara Oblast,3179026,2537265,641761 69 | RU-SAR,Саратовская,обл,Саратовская обл,Saratov oblast,Приволжский,UTC+4,RU.SR,498671,Saratovskaya Oblast,2421785,1830957,590828 70 | RU-SAK,Сахалинская,обл,Сахалинская обл,Sakhalin oblast,Дальневосточный,UTC+11,RU.SL,2121529,Sakhalin Oblast,488453,402271,86182 71 | RU-SVE,Свердловская,обл,Свердловская обл,Sverdlov oblast,Уральский,UTC+5,RU.SV,1490542,Sverdlovsk,4310861,3664833,646028 72 | RU-SMO,Смоленская,обл,Смоленская обл,Smolensk oblast,Центральный,UTC+3,RU.SM,491684,Smolensk,934747,671445,263302 73 | RU-STA,Ставропольский,край,Ставропольский край,Stavropolskiy kray,Северо-Кавказский,UTC+3,RU.ST,487839,Stavropol Kray,2803021,1655987,1147034 74 | RU-TAM,Тамбовская,обл,Тамбовская обл,Tambov oblast,Центральный,UTC+3,RU.TB,484638,Tambov,1006962,618169,388793 75 | RU-TVE,Тверская,обл,Тверская обл,Tver oblast,Центральный,UTC+3,RU.TV,480041,Tver Oblast,1260345,959753,300592 76 | RU-TOM,Томская,обл,Томская обл,Tomsk oblast,Сибирский,UTC+7,RU.TO,1489421,Tomsk Oblast,1079051,781262,297789 77 | RU-TUL,Тульская,обл,Тульская обл,Tula oblast,Центральный,UTC+3,RU.TL,480508,Tula,1466025,1096891,369134 78 | RU-TYU,Тюменская,обл,Тюменская обл,Tumen oblast,Уральский,UTC+5,RU.TY,1488747,Tyumen Oblast,3755778,3042591,713187 79 | RU-ULY,Ульяновская,обл,Ульяновская обл,Ulianovsk oblast,Приволжский,UTC+4,RU.UL,479119,Ulyanovsk,1229687,932510,297177 80 | RU-KHA,Хабаровский,край,Хабаровский край,Habarovskiy kray,Дальневосточный,UTC+10,RU.KH,2022888,Khabarovsk,1315310,1079726,235584 81 | RU-KHM,Ханты-Мансийский Автономный округ - Югра,АО,Ханты-Мансийский Автономный округ - Югра,Hanty-Mansiyskiy AO,Уральский,UTC+5,RU.KM,1503773,Khanty-Mansia,1674086,1548527,125559 82 | RU-CHE,Челябинская,обл,Челябинская обл,Cheliabinsk oblast,Уральский,UTC+5,RU.CL,1508290,Chelyabinsk,3466960,2865000,601960 83 | RU-CU,Чувашская Республика -,Чувашия,Чувашская Республика - Чувашия,Republic of Chuvashia,Приволжский,UTC+3,RU.CV,567395,Chuvashia,1217820,772101,445719 84 | RU-CHU,Чукотский,АО,Чукотский АО,Chukotskiy autonomous oblast,Дальневосточный,UTC+12,RU.CK,2126099,Chukotka,50726,36273,14453 85 | RU-YAN,Ямало-Ненецкий,АО,Ямало-Ненецкий АО,Yamalo-Nenetskiy AO,Уральский,UTC+5,RU.YN,1486462,Yamalo-Nenets,544008,456604,87404 86 | RU-YAR,Ярославская,обл,Ярославская обл,Yaroslavl oblast,Центральный,UTC+3,RU.YS,468898,Jaroslavl,1253189,1022434,230755 87 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /report_files/world_countries.csv: -------------------------------------------------------------------------------- 1 | iso_alpha2,country_code,iso_numeric,name,official_name,ccse_name,density,fertility_rate,land_area,median_age,migrants,population,urban_pop_rate,world_share 2 | AF,AFG,4,Afghanistan,Islamic Republic of Afghanistan,Afghanistan,60,4.6,652860,18.0,-62920.0,38928346,0.25,0.005 3 | AL,ALB,8,Albania,Republic of Albania,Albania,105,1.6,27400,36.0,-14000.0,2877797,0.63,0.0004 4 | DZ,DZA,12,Algeria,People's Democratic Republic of Algeria,Algeria,18,3.1,2381740,29.0,-10000.0,43851044,0.73,0.005600000000000001 5 | AD,AND,20,Andorra,Principality of Andorra,Andorra,164,,470,,,77265,0.88,0.0 6 | AO,AGO,24,Angola,Republic of Angola,Angola,26,5.6,1246700,17.0,6413.0,32866272,0.67,0.0042 7 | AG,ATG,28,Antigua and Barbuda,Antigua and Barbuda,Antigua and Barbuda,223,2.0,440,34.0,0.0,97929,0.26,0.0 8 | AZ,AZE,31,Azerbaijan,Republic of Azerbaijan,Azerbaijan,123,2.1,82658,32.0,1200.0,10139177,0.56,0.0013 9 | AR,ARG,32,Argentina,Argentine Republic,Argentina,17,2.3,2736690,32.0,4800.0,45195774,0.93,0.0058 10 | AU,AUS,36,Australia,Australia,Australia,3,1.8,7682300,38.0,158246.0,25499884,0.86,0.0033 11 | AT,AUT,40,Austria,Republic of Austria,Austria,109,1.5,82409,43.0,65000.0,9006398,0.57,0.0012 12 | BS,BHS,44,Bahamas,Commonwealth of the Bahamas,Bahamas,39,1.8,10010,32.0,1000.0,393244,0.86,0.0001 13 | BH,BHR,48,Bahrain,Kingdom of Bahrain,Bahrain,2239,2.0,760,32.0,47800.0,1701575,0.89,0.0002 14 | BD,BGD,50,Bangladesh,People's Republic of Bangladesh,Bangladesh,1265,2.1,130170,28.0,-369501.0,164689383,0.39,0.0211 15 | AM,ARM,51,Armenia,Republic of Armenia,Armenia,104,1.8,28470,35.0,-4998.0,2963243,0.63,0.0004 16 | BB,BRB,52,Barbados,Barbados,Barbados,668,1.6,430,40.0,-79.0,287375,0.31,0.0 17 | BE,BEL,56,Belgium,Kingdom of Belgium,Belgium,383,1.7,30280,42.0,48000.0,11589623,0.98,0.0015 18 | BT,BTN,64,Bhutan,Kingdom of Bhutan,Bhutan,20,2.0,38117,28.0,320.0,771608,0.46,0.0001 19 | BO,BOL,68,"Bolivia, Plurinational State of",Plurinational State of Bolivia,Bolivia,11,2.8,1083300,26.0,-9504.0,11673021,0.69,0.0015 20 | BA,BIH,70,Bosnia and Herzegovina,Republic of Bosnia and Herzegovina,Bosnia and Herzegovina,64,1.3,51000,43.0,-21585.0,3280819,0.52,0.0004 21 | BR,BRA,76,Brazil,Federative Republic of Brazil,Brazil,25,1.7,8358140,33.0,21200.0,212559417,0.88,0.0273 22 | BZ,BLZ,84,Belize,Belize,Belize,17,2.3,22810,25.0,1200.0,397628,0.46,0.0001 23 | BN,BRN,96,Brunei Darussalam,Brunei Darussalam,Brunei,83,1.8,5270,32.0,0.0,437479,0.8,0.0001 24 | BG,BGR,100,Bulgaria,Republic of Bulgaria,Bulgaria,64,1.6,108560,45.0,-4800.0,6948445,0.76,0.0009 25 | BY,BLR,112,Belarus,Republic of Belarus,Belarus,47,1.7,202910,40.0,8730.0,9449323,0.79,0.0012 26 | KH,KHM,116,Cambodia,Kingdom of Cambodia,Cambodia,95,2.5,176520,26.0,-30000.0,16718965,0.24,0.0021 27 | CM,CMR,120,Cameroon,Republic of Cameroon,Cameroon,56,4.6,472710,19.0,-4800.0,26545863,0.56,0.0034 28 | CA,CAN,124,Canada,Canada,Canada,4,1.5,9093510,41.0,242032.0,37742154,0.81,0.0048 29 | CV,CPV,132,Cabo Verde,Republic of Cabo Verde,Cabo Verde,138,2.3,4030,28.0,-1342.0,555987,0.68,0.0001 30 | CF,CAF,140,Central African Republic,Central African Republic,Central African Republic,8,4.8,622980,18.0,-40000.0,4829767,0.43,0.0006 31 | LK,LKA,144,Sri Lanka,Democratic Socialist Republic of Sri Lanka,Sri Lanka,341,2.2,62710,34.0,-97986.0,21413249,0.18,0.0027 32 | TD,TCD,148,Chad,Republic of Chad,Chad,13,5.8,1259200,17.0,2000.0,16425864,0.23,0.0021 33 | CL,CHL,152,Chile,Republic of Chile,Chile,26,1.7,743532,35.0,111708.0,19116201,0.85,0.0025 34 | CN,CHN,156,China,People's Republic of China,China,153,1.7,9388211,38.0,-348399.0,1439323776,0.61,0.1847 35 | TW,TWN,158,"Taiwan, Province of China","Taiwan, Province of China",Taiwan*,673,1.2,35410,42.0,30001.0,23816775,0.79,0.0031 36 | CO,COL,170,Colombia,Republic of Colombia,Colombia,46,1.8,1109500,31.0,204796.0,50882891,0.8,0.006500000000000001 37 | CG,COG,178,Congo,Republic of the Congo,Congo (Brazzaville),16,4.5,341500,19.0,-4000.0,5518087,0.7,0.0007000000000000001 38 | CD,COD,180,"Congo, The Democratic Republic of the","Congo, The Democratic Republic of the",Congo (Kinshasa),40,6.0,2267050,17.0,23861.0,89561403,0.46,0.0115 39 | CR,CRI,188,Costa Rica,Republic of Costa Rica,Costa Rica,100,1.8,51060,33.0,4200.0,5094118,0.8,0.0007000000000000001 40 | HR,HRV,191,Croatia,Republic of Croatia,Croatia,73,1.4,55960,44.0,-8001.0,4105267,0.58,0.0005 41 | CU,CUB,192,Cuba,Republic of Cuba,Cuba,106,1.6,106440,42.0,-14400.0,11326616,0.78,0.0015 42 | CY,CYP,196,Cyprus,Republic of Cyprus,Cyprus,131,1.3,9240,37.0,5000.0,1207359,0.67,0.0002 43 | CZ,CZE,203,Czechia,Czech Republic,Czechia,139,1.6,77240,43.0,22011.0,10708981,0.74,0.0014000000000000002 44 | BJ,BEN,204,Benin,Republic of Benin,Benin,108,4.9,112760,19.0,-2000.0,12123200,0.48,0.0016 45 | DK,DNK,208,Denmark,Kingdom of Denmark,Denmark,137,1.8,42430,42.0,15200.0,5792202,0.88,0.0007000000000000001 46 | DM,DMA,212,Dominica,Commonwealth of Dominica,Dominica,96,,750,,,71986,0.74,0.0 47 | DO,DOM,214,Dominican Republic,Dominican Republic,Dominican Republic,225,2.4,48320,28.0,-30000.0,10847910,0.85,0.0014000000000000002 48 | EC,ECU,218,Ecuador,Republic of Ecuador,Ecuador,71,2.4,248360,28.0,36400.0,17643054,0.63,0.0023 49 | SV,SLV,222,El Salvador,Republic of El Salvador,El Salvador,313,2.1,20720,28.0,-40539.0,6486205,0.73,0.0008 50 | GQ,GNQ,226,Equatorial Guinea,Republic of Equatorial Guinea,Equatorial Guinea,50,4.6,28050,22.0,16000.0,1402985,0.73,0.0002 51 | ET,ETH,231,Ethiopia,Federal Democratic Republic of Ethiopia,Ethiopia,115,4.3,1000000,19.0,30000.0,114963588,0.21,0.0147 52 | ER,ERI,232,Eritrea,the State of Eritrea,Eritrea,35,4.1,101000,19.0,-39858.0,3546421,0.63,0.0005 53 | EE,EST,233,Estonia,Republic of Estonia,Estonia,31,1.6,42390,42.0,3911.0,1326535,0.68,0.0002 54 | FJ,FJI,242,Fiji,Republic of Fiji,Fiji,49,2.8,18270,28.0,-6202.0,896445,0.59,0.0001 55 | FI,FIN,246,Finland,Republic of Finland,Finland,18,1.5,303890,43.0,14000.0,5540720,0.86,0.0007000000000000001 56 | FR,FRA,250,France,French Republic,France,119,1.9,547557,42.0,36527.0,65273511,0.82,0.0084 57 | DJ,DJI,262,Djibouti,Republic of Djibouti,Djibouti,43,2.8,23180,27.0,900.0,988000,0.79,0.0001 58 | GA,GAB,266,Gabon,Gabonese Republic,Gabon,9,4.0,257670,23.0,3260.0,2225734,0.87,0.0003 59 | GE,GEO,268,Georgia,Georgia,Georgia,57,2.1,69490,38.0,-10000.0,3989167,0.58,0.0005 60 | GM,GMB,270,Gambia,Republic of the Gambia,Gambia,239,5.3,10120,18.0,-3087.0,2416668,0.59,0.0003 61 | DE,DEU,276,Germany,Federal Republic of Germany,Germany,240,1.6,348560,46.0,543822.0,83783942,0.76,0.0107 62 | GH,GHA,288,Ghana,Republic of Ghana,Ghana,137,3.9,227540,22.0,-10000.0,31072940,0.57,0.004 63 | GR,GRC,300,Greece,Hellenic Republic,Greece,81,1.3,128900,46.0,-16000.0,10423054,0.85,0.0013 64 | GD,GRD,308,Grenada,Grenada,Grenada,331,2.1,340,32.0,-200.0,112523,0.35,0.0 65 | GT,GTM,320,Guatemala,Republic of Guatemala,Guatemala,167,2.9,107160,23.0,-9215.0,17915568,0.52,0.0023 66 | GN,GIN,324,Guinea,Republic of Guinea,Guinea,53,4.7,245720,18.0,-4000.0,13132795,0.39,0.0017 67 | GY,GUY,328,Guyana,Republic of Guyana,Guyana,4,2.5,196850,27.0,-6000.0,786552,0.27,0.0001 68 | HT,HTI,332,Haiti,Republic of Haiti,Haiti,414,3.0,27560,24.0,-35000.0,11402528,0.57,0.0015 69 | VA,VAT,336,Holy See (Vatican City State),Holy See (Vatican City State),Holy See,2003,,0,,,801,,0.0 70 | HN,HND,340,Honduras,Republic of Honduras,Honduras,89,2.5,111890,24.0,-6800.0,9904607,0.57,0.0013 71 | HU,HUN,348,Hungary,Hungary,Hungary,107,1.5,90530,43.0,6000.0,9660351,0.72,0.0012 72 | IS,ISL,352,Iceland,Republic of Iceland,Iceland,3,1.8,100250,37.0,380.0,341243,0.94,0.0 73 | IN,IND,356,India,Republic of India,India,464,2.2,2973190,28.0,-532687.0,1380004385,0.35,0.177 74 | ID,IDN,360,Indonesia,Republic of Indonesia,Indonesia,151,2.3,1811570,30.0,-98955.0,273523615,0.56,0.0351 75 | IR,IRN,364,"Iran, Islamic Republic of",Islamic Republic of Iran,Iran,52,2.2,1628550,32.0,-55000.0,83992949,0.76,0.0108 76 | IQ,IRQ,368,Iraq,Republic of Iraq,Iraq,93,3.7,434320,21.0,7834.0,40222493,0.73,0.0052 77 | IE,IRL,372,Ireland,Ireland,Ireland,72,1.8,68890,38.0,23604.0,4937786,0.63,0.0006 78 | IL,ISR,376,Israel,State of Israel,Israel,400,3.0,21640,30.0,10000.0,8655535,0.93,0.0011 79 | IT,ITA,380,Italy,Italian Republic,Italy,206,1.3,294140,47.0,148943.0,60461826,0.69,0.0078 80 | CI,CIV,384,Côte d'Ivoire,Republic of Côte d'Ivoire,Cote d'Ivoire,83,4.7,318000,19.0,-8000.0,26378274,0.51,0.0034 81 | JM,JAM,388,Jamaica,Jamaica,Jamaica,273,2.0,10830,31.0,-11332.0,2961167,0.55,0.0004 82 | JP,JPN,392,Japan,Japan,Japan,347,1.4,364555,48.0,71560.0,126476461,0.92,0.016200000000000003 83 | KZ,KAZ,398,Kazakhstan,Republic of Kazakhstan,Kazakhstan,7,2.8,2699700,31.0,-18000.0,18776707,0.58,0.0024 84 | JO,JOR,400,Jordan,Hashemite Kingdom of Jordan,Jordan,115,2.8,88780,24.0,10220.0,10203134,0.91,0.0013 85 | KE,KEN,404,Kenya,Republic of Kenya,Kenya,94,3.5,569140,20.0,-10000.0,53771296,0.28,0.0069 86 | KR,KOR,410,"Korea, Republic of","Korea, Republic of","Korea, South",527,1.1,97230,44.0,11731.0,51269185,0.82,0.0066 87 | KW,KWT,414,Kuwait,State of Kuwait,Kuwait,240,2.1,17820,37.0,39520.0,4270571,,0.0005 88 | KG,KGZ,417,Kyrgyzstan,Kyrgyz Republic,Kyrgyzstan,34,3.0,191800,26.0,-4000.0,6524195,0.36,0.0008 89 | LA,LAO,418,Lao People's Democratic Republic,Lao People's Democratic Republic,Laos,32,2.7,230800,24.0,-14704.0,7275560,0.36,0.0009 90 | LB,LBN,422,Lebanon,Lebanese Republic,Lebanon,667,2.1,10230,30.0,-30012.0,6825445,0.78,0.0009 91 | LV,LVA,428,Latvia,Republic of Latvia,Latvia,30,1.7,62200,44.0,-14837.0,1886198,0.69,0.0002 92 | LR,LBR,430,Liberia,Republic of Liberia,Liberia,53,4.4,96320,19.0,-5000.0,5057681,0.53,0.0006 93 | LY,LBY,434,Libya,Libya,Libya,4,2.3,1759540,29.0,-1999.0,6871292,0.78,0.0009 94 | LI,LIE,438,Liechtenstein,Principality of Liechtenstein,Liechtenstein,238,,160,,,38128,0.15,0.0 95 | LT,LTU,440,Lithuania,Republic of Lithuania,Lithuania,43,1.7,62674,45.0,-32780.0,2722289,0.71,0.0003 96 | LU,LUX,442,Luxembourg,Grand Duchy of Luxembourg,Luxembourg,242,1.5,2590,40.0,9741.0,625978,0.88,0.0001 97 | MG,MDG,450,Madagascar,Republic of Madagascar,Madagascar,48,4.1,581795,20.0,-1500.0,27691018,0.39,0.0036 98 | MY,MYS,458,Malaysia,Malaysia,Malaysia,99,2.0,328550,30.0,50000.0,32365999,0.78,0.0042 99 | MV,MDV,462,Maldives,Republic of Maldives,Maldives,1802,1.9,300,30.0,11370.0,540544,0.35,0.0001 100 | MT,MLT,470,Malta,Republic of Malta,Malta,1380,1.5,320,43.0,900.0,441543,0.93,0.0001 101 | MR,MRT,478,Mauritania,Islamic Republic of Mauritania,Mauritania,5,4.6,1030700,20.0,5000.0,4649658,0.57,0.0006 102 | MU,MUS,480,Mauritius,Republic of Mauritius,Mauritius,626,1.4,2030,37.0,0.0,1271768,0.41,0.0002 103 | MX,MEX,484,Mexico,United Mexican States,Mexico,66,2.1,1943950,29.0,-60000.0,128932753,0.84,0.0165 104 | MC,MCO,492,Monaco,Principality of Monaco,Monaco,26337,,1,,,39242,,0.0 105 | MN,MNG,496,Mongolia,Mongolia,Mongolia,2,2.9,1553560,28.0,-852.0,3278290,0.67,0.0004 106 | MD,MDA,498,"Moldova, Republic of",Republic of Moldova,Moldova,123,1.3,32850,38.0,-1387.0,4033963,0.43,0.0005 107 | ME,MNE,499,Montenegro,Montenegro,Montenegro,47,1.8,13450,39.0,-480.0,628066,0.68,0.0001 108 | MA,MAR,504,Morocco,Kingdom of Morocco,Morocco,83,2.4,446300,30.0,-51419.0,36910560,0.64,0.004699999999999999 109 | MZ,MOZ,508,Mozambique,Republic of Mozambique,Mozambique,40,4.9,786380,18.0,-5000.0,31255435,0.38,0.004 110 | OM,OMN,512,Oman,Sultanate of Oman,Oman,16,2.9,309500,31.0,87400.0,5106626,0.87,0.0007000000000000001 111 | ,NAM,516,Namibia,Republic of Namibia,Namibia,3,3.4,823290,22.0,-4806.0,2540905,0.55,0.0003 112 | NP,NPL,524,Nepal,Federal Democratic Republic of Nepal,Nepal,203,1.9,143350,25.0,41710.0,29136808,0.21,0.0037 113 | NL,NLD,528,Netherlands,Kingdom of the Netherlands,Netherlands,508,1.7,33720,43.0,16000.0,17134872,0.92,0.0022 114 | NZ,NZL,554,New Zealand,New Zealand,New Zealand,18,1.9,263310,38.0,14881.0,4822233,0.87,0.0006 115 | NI,NIC,558,Nicaragua,Republic of Nicaragua,Nicaragua,55,2.4,120340,26.0,-21272.0,6624554,0.57,0.0008 116 | NE,NER,562,Niger,Republic of the Niger,Niger,19,7.0,1266700,15.0,4000.0,24206644,0.17,0.0031 117 | NG,NGA,566,Nigeria,Federal Republic of Nigeria,Nigeria,226,5.4,910770,18.0,-60000.0,206139589,0.52,0.0264 118 | NO,NOR,578,Norway,Kingdom of Norway,Norway,15,1.7,365268,40.0,28000.0,5421241,0.83,0.0007000000000000001 119 | PK,PAK,586,Pakistan,Islamic Republic of Pakistan,Pakistan,287,3.6,770880,23.0,-233379.0,220892340,0.35,0.0283 120 | PA,PAN,591,Panama,Republic of Panama,Panama,58,2.5,74340,30.0,11200.0,4314767,0.68,0.0006 121 | PG,PNG,598,Papua New Guinea,Independent State of Papua New Guinea,Papua New Guinea,20,3.6,452860,22.0,-800.0,8947024,0.13,0.0011 122 | PY,PRY,600,Paraguay,Republic of Paraguay,Paraguay,18,2.4,397300,26.0,-16556.0,7132538,0.62,0.0009 123 | PE,PER,604,Peru,Republic of Peru,Peru,26,2.3,1280000,31.0,99069.0,32971854,0.79,0.0042 124 | PH,PHL,608,Philippines,Republic of the Philippines,Philippines,368,2.6,298170,26.0,-67152.0,109581078,0.47,0.0141 125 | PL,POL,616,Poland,Republic of Poland,Poland,124,1.4,306230,42.0,-29395.0,37846611,0.6,0.0049 126 | PT,PRT,620,Portugal,Portuguese Republic,Portugal,111,1.3,91590,46.0,-6000.0,10196709,0.66,0.0013 127 | TL,TLS,626,Timor-Leste,Democratic Republic of Timor-Leste,Timor-Leste,89,4.1,14870,21.0,-5385.0,1318445,0.33,0.0002 128 | QA,QAT,634,Qatar,State of Qatar,Qatar,248,1.9,11610,32.0,40000.0,2881053,0.96,0.0004 129 | RO,ROU,642,Romania,Romania,Romania,84,1.6,230170,43.0,-73999.0,19237691,0.55,0.0025 130 | RU,RUS,643,Russian Federation,Russian Federation,Russia,9,1.8,16376870,40.0,182456.0,145934462,0.74,0.0187 131 | RW,RWA,646,Rwanda,Rwandese Republic,Rwanda,525,4.1,24670,20.0,-9000.0,12952218,0.18,0.0017 132 | LC,LCA,662,Saint Lucia,Saint Lucia,Saint Lucia,301,1.4,610,34.0,0.0,183627,0.19,0.0 133 | VC,VCT,670,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,284,1.9,390,33.0,-200.0,110940,0.53,0.0 134 | SM,SMR,674,San Marino,Republic of San Marino,San Marino,566,,60,,,33931,0.97,0.0 135 | SA,SAU,682,Saudi Arabia,Kingdom of Saudi Arabia,Saudi Arabia,16,2.3,2149690,32.0,134979.0,34813871,0.84,0.0045000000000000005 136 | SN,SEN,686,Senegal,Republic of Senegal,Senegal,87,4.7,192530,19.0,-20000.0,16743927,0.49,0.0021 137 | RS,SRB,688,Serbia,Republic of Serbia,Serbia,100,1.5,87460,42.0,4000.0,8737371,0.56,0.0011 138 | SC,SYC,690,Seychelles,Republic of Seychelles,Seychelles,214,2.5,460,34.0,-200.0,98347,0.56,0.0 139 | SG,SGP,702,Singapore,Republic of Singapore,Singapore,8358,1.2,700,42.0,27028.0,5850342,,0.0008 140 | SK,SVK,703,Slovakia,Slovak Republic,Slovakia,114,1.5,48088,41.0,1485.0,5459642,0.54,0.0007000000000000001 141 | VN,VNM,704,Viet Nam,Socialist Republic of Viet Nam,Vietnam,314,2.1,310070,32.0,-80000.0,97338579,0.38,0.0125 142 | SI,SVN,705,Slovenia,Republic of Slovenia,Slovenia,103,1.6,20140,45.0,2000.0,2078938,0.55,0.0003 143 | SO,SOM,706,Somalia,Federal Republic of Somalia,Somalia,25,6.1,627340,17.0,-40000.0,15893222,0.47,0.002 144 | ZA,ZAF,710,South Africa,Republic of South Africa,South Africa,49,2.4,1213090,28.0,145405.0,59308690,0.67,0.0076 145 | ZW,ZWE,716,Zimbabwe,Republic of Zimbabwe,Zimbabwe,38,3.6,386850,19.0,-116858.0,14862924,0.38,0.0019 146 | ES,ESP,724,Spain,Kingdom of Spain,Spain,94,1.3,498800,45.0,40000.0,46754778,0.8,0.006 147 | SD,SDN,729,Sudan,Republic of the Sudan,Sudan,25,4.4,1765048,20.0,-50000.0,43849260,0.35,0.005600000000000001 148 | SR,SUR,740,Suriname,Republic of Suriname,Suriname,4,2.4,156000,29.0,-1000.0,586632,0.65,0.0001 149 | SZ,SWZ,748,Eswatini,Kingdom of Eswatini,Eswatini,67,3.0,17200,21.0,-8353.0,1160164,0.3,0.0001 150 | SE,SWE,752,Sweden,Kingdom of Sweden,Sweden,25,1.9,410340,41.0,40000.0,10099265,0.88,0.0013 151 | CH,CHE,756,Switzerland,Swiss Confederation,Switzerland,219,1.5,39516,43.0,52000.0,8654622,0.74,0.0011 152 | SY,SYR,760,Syrian Arab Republic,Syrian Arab Republic,Syria,95,2.8,183630,26.0,-427391.0,17500658,0.6,0.0022 153 | TH,THA,764,Thailand,Kingdom of Thailand,Thailand,137,1.5,510890,40.0,19444.0,69799978,0.51,0.009000000000000001 154 | TG,TGO,768,Togo,Togolese Republic,Togo,152,4.4,54390,19.0,-2000.0,8278724,0.43,0.0011 155 | TT,TTO,780,Trinidad and Tobago,Republic of Trinidad and Tobago,Trinidad and Tobago,273,1.7,5130,36.0,-800.0,1399488,0.52,0.0002 156 | AE,ARE,784,United Arab Emirates,United Arab Emirates,United Arab Emirates,118,1.4,83600,33.0,40000.0,9890402,0.86,0.0013 157 | TN,TUN,788,Tunisia,Republic of Tunisia,Tunisia,76,2.2,155360,33.0,-4000.0,11818619,0.7,0.0015 158 | TR,TUR,792,Turkey,Republic of Turkey,Turkey,110,2.1,769630,32.0,283922.0,84339067,0.76,0.0108 159 | UG,UGA,800,Uganda,Republic of Uganda,Uganda,229,5.0,199810,17.0,168694.0,45741007,0.26,0.0059 160 | UA,UKR,804,Ukraine,Ukraine,Ukraine,75,1.4,579320,41.0,10000.0,43733762,0.69,0.005600000000000001 161 | MK,MKD,807,North Macedonia,Republic of North Macedonia,North Macedonia,83,1.5,25220,39.0,-1000.0,2083374,0.59,0.0003 162 | EG,EGY,818,Egypt,Arab Republic of Egypt,Egypt,103,3.3,995450,25.0,-38033.0,102334404,0.43,0.0131 163 | GB,GBR,826,United Kingdom,United Kingdom of Great Britain and Northern Ireland,United Kingdom,281,1.8,241930,40.0,260650.0,67886011,0.83,0.0087 164 | TZ,TZA,834,"Tanzania, United Republic of",United Republic of Tanzania,Tanzania,67,4.9,885800,18.0,-40076.0,59734218,0.37,0.0077 165 | US,USA,840,United States,United States of America,US,36,1.8,9147420,38.0,954806.0,331002651,0.83,0.0425 166 | BF,BFA,854,Burkina Faso,Burkina Faso,Burkina Faso,76,5.2,273600,18.0,-25000.0,20903273,0.31,0.0027 167 | UY,URY,858,Uruguay,Eastern Republic of Uruguay,Uruguay,20,2.0,175020,36.0,-3000.0,3473730,0.96,0.0004 168 | UZ,UZB,860,Uzbekistan,Republic of Uzbekistan,Uzbekistan,79,2.4,425400,28.0,-8863.0,33469203,0.5,0.0043 169 | VE,VEN,862,"Venezuela, Bolivarian Republic of",Bolivarian Republic of Venezuela,Venezuela,32,2.3,882050,30.0,-653249.0,28435940,,0.0036 170 | ZM,ZMB,894,Zambia,Republic of Zambia,Zambia,25,4.7,743390,18.0,-8000.0,18383955,0.45,0.0024 171 | -------------------------------------------------------------------------------- /auxiliary_files/countries.csv: -------------------------------------------------------------------------------- 1 | iso_alpha2,iso_alpha3,iso_numeric,name,official_name,ccse_name,density,fertility_rate,land_area,median_age,migrants,population,urban_pop_rate,world_share 2 | AF,AFG,004,Afghanistan,Islamic Republic of Afghanistan,Afghanistan,60,4.6,652860,18.0,-62920.0,38928346,0.25,0.005 3 | AL,ALB,008,Albania,Republic of Albania,Albania,105,1.6,27400,36.0,-14000.0,2877797,0.63,0.0004 4 | DZ,DZA,012,Algeria,People's Democratic Republic of Algeria,Algeria,18,3.1,2381740,29.0,-10000.0,43851044,0.73,0.005600000000000001 5 | AD,AND,020,Andorra,Principality of Andorra,Andorra,164,,470,,,77265,0.88,0.0 6 | AO,AGO,024,Angola,Republic of Angola,Angola,26,5.6,1246700,17.0,6413.0,32866272,0.67,0.0042 7 | AG,ATG,028,Antigua and Barbuda,Antigua and Barbuda,Antigua and Barbuda,223,2.0,440,34.0,0.0,97929,0.26,0.0 8 | AZ,AZE,031,Azerbaijan,Republic of Azerbaijan,Azerbaijan,123,2.1,82658,32.0,1200.0,10139177,0.56,0.0013 9 | AR,ARG,032,Argentina,Argentine Republic,Argentina,17,2.3,2736690,32.0,4800.0,45195774,0.93,0.0058 10 | AU,AUS,036,Australia,Australia,Australia,3,1.8,7682300,38.0,158246.0,25499884,0.86,0.0033 11 | AT,AUT,040,Austria,Republic of Austria,Austria,109,1.5,82409,43.0,65000.0,9006398,0.57,0.0012 12 | BS,BHS,044,Bahamas,Commonwealth of the Bahamas,Bahamas,39,1.8,10010,32.0,1000.0,393244,0.86,0.0001 13 | BH,BHR,048,Bahrain,Kingdom of Bahrain,Bahrain,2239,2.0,760,32.0,47800.0,1701575,0.89,0.0002 14 | BD,BGD,050,Bangladesh,People's Republic of Bangladesh,Bangladesh,1265,2.1,130170,28.0,-369501.0,164689383,0.39,0.021099999999999997 15 | AM,ARM,051,Armenia,Republic of Armenia,Armenia,104,1.8,28470,35.0,-4998.0,2963243,0.63,0.0004 16 | BB,BRB,052,Barbados,Barbados,Barbados,668,1.6,430,40.0,-79.0,287375,0.31,0.0 17 | BE,BEL,056,Belgium,Kingdom of Belgium,Belgium,383,1.7,30280,42.0,48000.0,11589623,0.98,0.0015 18 | BT,BTN,064,Bhutan,Kingdom of Bhutan,Bhutan,20,2.0,38117,28.0,320.0,771608,0.46,0.0001 19 | BO,BOL,068,"Bolivia, Plurinational State of",Plurinational State of Bolivia,Bolivia,11,2.8,1083300,26.0,-9504.0,11673021,0.69,0.0015 20 | BA,BIH,070,Bosnia and Herzegovina,Republic of Bosnia and Herzegovina,Bosnia and Herzegovina,64,1.3,51000,43.0,-21585.0,3280819,0.52,0.0004 21 | BR,BRA,076,Brazil,Federative Republic of Brazil,Brazil,25,1.7,8358140,33.0,21200.0,212559417,0.88,0.0273 22 | BZ,BLZ,084,Belize,Belize,Belize,17,2.3,22810,25.0,1200.0,397628,0.46,0.0001 23 | BN,BRN,096,Brunei Darussalam,Brunei Darussalam,Brunei,83,1.8,5270,32.0,0.0,437479,0.8,0.0001 24 | BG,BGR,100,Bulgaria,Republic of Bulgaria,Bulgaria,64,1.6,108560,45.0,-4800.0,6948445,0.76,0.0009 25 | BY,BLR,112,Belarus,Republic of Belarus,Belarus,47,1.7,202910,40.0,8730.0,9449323,0.79,0.0012 26 | KH,KHM,116,Cambodia,Kingdom of Cambodia,Cambodia,95,2.5,176520,26.0,-30000.0,16718965,0.24,0.0021 27 | CM,CMR,120,Cameroon,Republic of Cameroon,Cameroon,56,4.6,472710,19.0,-4800.0,26545863,0.56,0.0034000000000000002 28 | CA,CAN,124,Canada,Canada,Canada,4,1.5,9093510,41.0,242032.0,37742154,0.81,0.0048 29 | CV,CPV,132,Cabo Verde,Republic of Cabo Verde,Cabo Verde,138,2.3,4030,28.0,-1342.0,555987,0.68,0.0001 30 | CF,CAF,140,Central African Republic,Central African Republic,Central African Republic,8,4.8,622980,18.0,-40000.0,4829767,0.43,0.0006 31 | LK,LKA,144,Sri Lanka,Democratic Socialist Republic of Sri Lanka,Sri Lanka,341,2.2,62710,34.0,-97986.0,21413249,0.18,0.0027 32 | TD,TCD,148,Chad,Republic of Chad,Chad,13,5.8,1259200,17.0,2000.0,16425864,0.23,0.0021 33 | CL,CHL,152,Chile,Republic of Chile,Chile,26,1.7,743532,35.0,111708.0,19116201,0.85,0.0025 34 | CN,CHN,156,China,People's Republic of China,China,153,1.7,9388211,38.0,-348399.0,1439323776,0.61,0.18469999999999998 35 | TW,TWN,158,"Taiwan, Province of China","Taiwan, Province of China",Taiwan*,673,1.2,35410,42.0,30001.0,23816775,0.79,0.0031 36 | CO,COL,170,Colombia,Republic of Colombia,Colombia,46,1.8,1109500,31.0,204796.0,50882891,0.8,0.006500000000000001 37 | CG,COG,178,Congo,Republic of the Congo,Congo (Brazzaville),16,4.5,341500,19.0,-4000.0,5518087,0.7,0.0007000000000000001 38 | CD,COD,180,"Congo, The Democratic Republic of the","Congo, The Democratic Republic of the",Congo (Kinshasa),40,6.0,2267050,17.0,23861.0,89561403,0.46,0.0115 39 | CR,CRI,188,Costa Rica,Republic of Costa Rica,Costa Rica,100,1.8,51060,33.0,4200.0,5094118,0.8,0.0007000000000000001 40 | HR,HRV,191,Croatia,Republic of Croatia,Croatia,73,1.4,55960,44.0,-8001.0,4105267,0.58,0.0005 41 | CU,CUB,192,Cuba,Republic of Cuba,Cuba,106,1.6,106440,42.0,-14400.0,11326616,0.78,0.0015 42 | CY,CYP,196,Cyprus,Republic of Cyprus,Cyprus,131,1.3,9240,37.0,5000.0,1207359,0.67,0.0002 43 | CZ,CZE,203,Czechia,Czech Republic,Czechia,139,1.6,77240,43.0,22011.0,10708981,0.74,0.0014000000000000002 44 | BJ,BEN,204,Benin,Republic of Benin,Benin,108,4.9,112760,19.0,-2000.0,12123200,0.48,0.0016 45 | DK,DNK,208,Denmark,Kingdom of Denmark,Denmark,137,1.8,42430,42.0,15200.0,5792202,0.88,0.0007000000000000001 46 | DM,DMA,212,Dominica,Commonwealth of Dominica,Dominica,96,,750,,,71986,0.74,0.0 47 | DO,DOM,214,Dominican Republic,Dominican Republic,Dominican Republic,225,2.4,48320,28.0,-30000.0,10847910,0.85,0.0014000000000000002 48 | EC,ECU,218,Ecuador,Republic of Ecuador,Ecuador,71,2.4,248360,28.0,36400.0,17643054,0.63,0.0023 49 | SV,SLV,222,El Salvador,Republic of El Salvador,El Salvador,313,2.1,20720,28.0,-40539.0,6486205,0.73,0.0008 50 | GQ,GNQ,226,Equatorial Guinea,Republic of Equatorial Guinea,Equatorial Guinea,50,4.6,28050,22.0,16000.0,1402985,0.73,0.0002 51 | ET,ETH,231,Ethiopia,Federal Democratic Republic of Ethiopia,Ethiopia,115,4.3,1000000,19.0,30000.0,114963588,0.21,0.0147 52 | ER,ERI,232,Eritrea,the State of Eritrea,Eritrea,35,4.1,101000,19.0,-39858.0,3546421,0.63,0.0005 53 | EE,EST,233,Estonia,Republic of Estonia,Estonia,31,1.6,42390,42.0,3911.0,1326535,0.68,0.0002 54 | FJ,FJI,242,Fiji,Republic of Fiji,Fiji,49,2.8,18270,28.0,-6202.0,896445,0.59,0.0001 55 | FI,FIN,246,Finland,Republic of Finland,Finland,18,1.5,303890,43.0,14000.0,5540720,0.86,0.0007000000000000001 56 | FR,FRA,250,France,French Republic,France,119,1.9,547557,42.0,36527.0,65273511,0.82,0.0084 57 | DJ,DJI,262,Djibouti,Republic of Djibouti,Djibouti,43,2.8,23180,27.0,900.0,988000,0.79,0.0001 58 | GA,GAB,266,Gabon,Gabonese Republic,Gabon,9,4.0,257670,23.0,3260.0,2225734,0.87,0.0003 59 | GE,GEO,268,Georgia,Georgia,Georgia,57,2.1,69490,38.0,-10000.0,3989167,0.58,0.0005 60 | GM,GMB,270,Gambia,Republic of the Gambia,Gambia,239,5.3,10120,18.0,-3087.0,2416668,0.59,0.0003 61 | DE,DEU,276,Germany,Federal Republic of Germany,Germany,240,1.6,348560,46.0,543822.0,83783942,0.76,0.010700000000000001 62 | GH,GHA,288,Ghana,Republic of Ghana,Ghana,137,3.9,227540,22.0,-10000.0,31072940,0.57,0.004 63 | GR,GRC,300,Greece,Hellenic Republic,Greece,81,1.3,128900,46.0,-16000.0,10423054,0.85,0.0013 64 | GD,GRD,308,Grenada,Grenada,Grenada,331,2.1,340,32.0,-200.0,112523,0.35,0.0 65 | GT,GTM,320,Guatemala,Republic of Guatemala,Guatemala,167,2.9,107160,23.0,-9215.0,17915568,0.52,0.0023 66 | GN,GIN,324,Guinea,Republic of Guinea,Guinea,53,4.7,245720,18.0,-4000.0,13132795,0.39,0.0017000000000000001 67 | GY,GUY,328,Guyana,Republic of Guyana,Guyana,4,2.5,196850,27.0,-6000.0,786552,0.27,0.0001 68 | HT,HTI,332,Haiti,Republic of Haiti,Haiti,414,3.0,27560,24.0,-35000.0,11402528,0.57,0.0015 69 | VA,VAT,336,Holy See (Vatican City State),Holy See (Vatican City State),Holy See,2003,,0,,,801,,0.0 70 | HN,HND,340,Honduras,Republic of Honduras,Honduras,89,2.5,111890,24.0,-6800.0,9904607,0.57,0.0013 71 | HU,HUN,348,Hungary,Hungary,Hungary,107,1.5,90530,43.0,6000.0,9660351,0.72,0.0012 72 | IS,ISL,352,Iceland,Republic of Iceland,Iceland,3,1.8,100250,37.0,380.0,341243,0.94,0.0 73 | IN,IND,356,India,Republic of India,India,464,2.2,2973190,28.0,-532687.0,1380004385,0.35,0.177 74 | ID,IDN,360,Indonesia,Republic of Indonesia,Indonesia,151,2.3,1811570,30.0,-98955.0,273523615,0.56,0.0351 75 | IR,IRN,364,"Iran, Islamic Republic of",Islamic Republic of Iran,Iran,52,2.2,1628550,32.0,-55000.0,83992949,0.76,0.0108 76 | IQ,IRQ,368,Iraq,Republic of Iraq,Iraq,93,3.7,434320,21.0,7834.0,40222493,0.73,0.0052 77 | IE,IRL,372,Ireland,Ireland,Ireland,72,1.8,68890,38.0,23604.0,4937786,0.63,0.0006 78 | IL,ISR,376,Israel,State of Israel,Israel,400,3.0,21640,30.0,10000.0,8655535,0.93,0.0011 79 | IT,ITA,380,Italy,Italian Republic,Italy,206,1.3,294140,47.0,148943.0,60461826,0.69,0.0078000000000000005 80 | CI,CIV,384,Côte d'Ivoire,Republic of Côte d'Ivoire,Cote d'Ivoire,83,4.7,318000,19.0,-8000.0,26378274,0.51,0.0034000000000000002 81 | JM,JAM,388,Jamaica,Jamaica,Jamaica,273,2.0,10830,31.0,-11332.0,2961167,0.55,0.0004 82 | JP,JPN,392,Japan,Japan,Japan,347,1.4,364555,48.0,71560.0,126476461,0.92,0.016200000000000003 83 | KZ,KAZ,398,Kazakhstan,Republic of Kazakhstan,Kazakhstan,7,2.8,2699700,31.0,-18000.0,18776707,0.58,0.0024 84 | JO,JOR,400,Jordan,Hashemite Kingdom of Jordan,Jordan,115,2.8,88780,24.0,10220.0,10203134,0.91,0.0013 85 | KE,KEN,404,Kenya,Republic of Kenya,Kenya,94,3.5,569140,20.0,-10000.0,53771296,0.28,0.0069 86 | KR,KOR,410,"Korea, Republic of","Korea, Republic of","Korea, South",527,1.1,97230,44.0,11731.0,51269185,0.82,0.0066 87 | KW,KWT,414,Kuwait,State of Kuwait,Kuwait,240,2.1,17820,37.0,39520.0,4270571,,0.0005 88 | KG,KGZ,417,Kyrgyzstan,Kyrgyz Republic,Kyrgyzstan,34,3.0,191800,26.0,-4000.0,6524195,0.36,0.0008 89 | LA,LAO,418,Lao People's Democratic Republic,Lao People's Democratic Republic,Laos,32,2.7,230800,24.0,-14704.0,7275560,0.36,0.0009 90 | LB,LBN,422,Lebanon,Lebanese Republic,Lebanon,667,2.1,10230,30.0,-30012.0,6825445,0.78,0.0009 91 | LV,LVA,428,Latvia,Republic of Latvia,Latvia,30,1.7,62200,44.0,-14837.0,1886198,0.69,0.0002 92 | LR,LBR,430,Liberia,Republic of Liberia,Liberia,53,4.4,96320,19.0,-5000.0,5057681,0.53,0.0006 93 | LY,LBY,434,Libya,Libya,Libya,4,2.3,1759540,29.0,-1999.0,6871292,0.78,0.0009 94 | LI,LIE,438,Liechtenstein,Principality of Liechtenstein,Liechtenstein,238,,160,,,38128,0.15,0.0 95 | LT,LTU,440,Lithuania,Republic of Lithuania,Lithuania,43,1.7,62674,45.0,-32780.0,2722289,0.71,0.0003 96 | LU,LUX,442,Luxembourg,Grand Duchy of Luxembourg,Luxembourg,242,1.5,2590,40.0,9741.0,625978,0.88,0.0001 97 | MG,MDG,450,Madagascar,Republic of Madagascar,Madagascar,48,4.1,581795,20.0,-1500.0,27691018,0.39,0.0036 98 | MY,MYS,458,Malaysia,Malaysia,Malaysia,99,2.0,328550,30.0,50000.0,32365999,0.78,0.0042 99 | MV,MDV,462,Maldives,Republic of Maldives,Maldives,1802,1.9,300,30.0,11370.0,540544,0.35,0.0001 100 | MT,MLT,470,Malta,Republic of Malta,Malta,1380,1.5,320,43.0,900.0,441543,0.93,0.0001 101 | MR,MRT,478,Mauritania,Islamic Republic of Mauritania,Mauritania,5,4.6,1030700,20.0,5000.0,4649658,0.57,0.0006 102 | MU,MUS,480,Mauritius,Republic of Mauritius,Mauritius,626,1.4,2030,37.0,0.0,1271768,0.41,0.0002 103 | MX,MEX,484,Mexico,United Mexican States,Mexico,66,2.1,1943950,29.0,-60000.0,128932753,0.84,0.0165 104 | MC,MCO,492,Monaco,Principality of Monaco,Monaco,26337,,1,,,39242,,0.0 105 | MN,MNG,496,Mongolia,Mongolia,Mongolia,2,2.9,1553560,28.0,-852.0,3278290,0.67,0.0004 106 | MD,MDA,498,"Moldova, Republic of",Republic of Moldova,Moldova,123,1.3,32850,38.0,-1387.0,4033963,0.43,0.0005 107 | ME,MNE,499,Montenegro,Montenegro,Montenegro,47,1.8,13450,39.0,-480.0,628066,0.68,0.0001 108 | MA,MAR,504,Morocco,Kingdom of Morocco,Morocco,83,2.4,446300,30.0,-51419.0,36910560,0.64,0.004699999999999999 109 | MZ,MOZ,508,Mozambique,Republic of Mozambique,Mozambique,40,4.9,786380,18.0,-5000.0,31255435,0.38,0.004 110 | OM,OMN,512,Oman,Sultanate of Oman,Oman,16,2.9,309500,31.0,87400.0,5106626,0.87,0.0007000000000000001 111 | NA,NAM,516,Namibia,Republic of Namibia,Namibia,3,3.4,823290,22.0,-4806.0,2540905,0.55,0.0003 112 | NP,NPL,524,Nepal,Federal Democratic Republic of Nepal,Nepal,203,1.9,143350,25.0,41710.0,29136808,0.21,0.0037 113 | NL,NLD,528,Netherlands,Kingdom of the Netherlands,Netherlands,508,1.7,33720,43.0,16000.0,17134872,0.92,0.0022 114 | NZ,NZL,554,New Zealand,New Zealand,New Zealand,18,1.9,263310,38.0,14881.0,4822233,0.87,0.0006 115 | NI,NIC,558,Nicaragua,Republic of Nicaragua,Nicaragua,55,2.4,120340,26.0,-21272.0,6624554,0.57,0.0008 116 | NE,NER,562,Niger,Republic of the Niger,Niger,19,7.0,1266700,15.0,4000.0,24206644,0.17,0.0031 117 | NG,NGA,566,Nigeria,Federal Republic of Nigeria,Nigeria,226,5.4,910770,18.0,-60000.0,206139589,0.52,0.0264 118 | NO,NOR,578,Norway,Kingdom of Norway,Norway,15,1.7,365268,40.0,28000.0,5421241,0.83,0.0007000000000000001 119 | PK,PAK,586,Pakistan,Islamic Republic of Pakistan,Pakistan,287,3.6,770880,23.0,-233379.0,220892340,0.35,0.028300000000000002 120 | PA,PAN,591,Panama,Republic of Panama,Panama,58,2.5,74340,30.0,11200.0,4314767,0.68,0.0006 121 | PG,PNG,598,Papua New Guinea,Independent State of Papua New Guinea,Papua New Guinea,20,3.6,452860,22.0,-800.0,8947024,0.13,0.0011 122 | PY,PRY,600,Paraguay,Republic of Paraguay,Paraguay,18,2.4,397300,26.0,-16556.0,7132538,0.62,0.0009 123 | PE,PER,604,Peru,Republic of Peru,Peru,26,2.3,1280000,31.0,99069.0,32971854,0.79,0.0042 124 | PH,PHL,608,Philippines,Republic of the Philippines,Philippines,368,2.6,298170,26.0,-67152.0,109581078,0.47,0.0141 125 | PL,POL,616,Poland,Republic of Poland,Poland,124,1.4,306230,42.0,-29395.0,37846611,0.6,0.0049 126 | PT,PRT,620,Portugal,Portuguese Republic,Portugal,111,1.3,91590,46.0,-6000.0,10196709,0.66,0.0013 127 | TL,TLS,626,Timor-Leste,Democratic Republic of Timor-Leste,Timor-Leste,89,4.1,14870,21.0,-5385.0,1318445,0.33,0.0002 128 | QA,QAT,634,Qatar,State of Qatar,Qatar,248,1.9,11610,32.0,40000.0,2881053,0.96,0.0004 129 | RO,ROU,642,Romania,Romania,Romania,84,1.6,230170,43.0,-73999.0,19237691,0.55,0.0025 130 | RU,RUS,643,Russian Federation,Russian Federation,Russia,9,1.8,16376870,40.0,182456.0,145934462,0.74,0.0187 131 | RW,RWA,646,Rwanda,Rwandese Republic,Rwanda,525,4.1,24670,20.0,-9000.0,12952218,0.18,0.0017000000000000001 132 | LC,LCA,662,Saint Lucia,Saint Lucia,Saint Lucia,301,1.4,610,34.0,0.0,183627,0.19,0.0 133 | VC,VCT,670,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines,284,1.9,390,33.0,-200.0,110940,0.53,0.0 134 | SM,SMR,674,San Marino,Republic of San Marino,San Marino,566,,60,,,33931,0.97,0.0 135 | SA,SAU,682,Saudi Arabia,Kingdom of Saudi Arabia,Saudi Arabia,16,2.3,2149690,32.0,134979.0,34813871,0.84,0.0045000000000000005 136 | SN,SEN,686,Senegal,Republic of Senegal,Senegal,87,4.7,192530,19.0,-20000.0,16743927,0.49,0.0021 137 | RS,SRB,688,Serbia,Republic of Serbia,Serbia,100,1.5,87460,42.0,4000.0,8737371,0.56,0.0011 138 | SC,SYC,690,Seychelles,Republic of Seychelles,Seychelles,214,2.5,460,34.0,-200.0,98347,0.56,0.0 139 | SG,SGP,702,Singapore,Republic of Singapore,Singapore,8358,1.2,700,42.0,27028.0,5850342,,0.0008 140 | SK,SVK,703,Slovakia,Slovak Republic,Slovakia,114,1.5,48088,41.0,1485.0,5459642,0.54,0.0007000000000000001 141 | VN,VNM,704,Viet Nam,Socialist Republic of Viet Nam,Vietnam,314,2.1,310070,32.0,-80000.0,97338579,0.38,0.0125 142 | SI,SVN,705,Slovenia,Republic of Slovenia,Slovenia,103,1.6,20140,45.0,2000.0,2078938,0.55,0.0003 143 | SO,SOM,706,Somalia,Federal Republic of Somalia,Somalia,25,6.1,627340,17.0,-40000.0,15893222,0.47,0.002 144 | ZA,ZAF,710,South Africa,Republic of South Africa,South Africa,49,2.4,1213090,28.0,145405.0,59308690,0.67,0.0076 145 | ZW,ZWE,716,Zimbabwe,Republic of Zimbabwe,Zimbabwe,38,3.6,386850,19.0,-116858.0,14862924,0.38,0.0019 146 | ES,ESP,724,Spain,Kingdom of Spain,Spain,94,1.3,498800,45.0,40000.0,46754778,0.8,0.006 147 | SD,SDN,729,Sudan,Republic of the Sudan,Sudan,25,4.4,1765048,20.0,-50000.0,43849260,0.35,0.005600000000000001 148 | SR,SUR,740,Suriname,Republic of Suriname,Suriname,4,2.4,156000,29.0,-1000.0,586632,0.65,0.0001 149 | SZ,SWZ,748,Eswatini,Kingdom of Eswatini,Eswatini,67,3.0,17200,21.0,-8353.0,1160164,0.3,0.0001 150 | SE,SWE,752,Sweden,Kingdom of Sweden,Sweden,25,1.9,410340,41.0,40000.0,10099265,0.88,0.0013 151 | CH,CHE,756,Switzerland,Swiss Confederation,Switzerland,219,1.5,39516,43.0,52000.0,8654622,0.74,0.0011 152 | SY,SYR,760,Syrian Arab Republic,Syrian Arab Republic,Syria,95,2.8,183630,26.0,-427391.0,17500658,0.6,0.0022 153 | TH,THA,764,Thailand,Kingdom of Thailand,Thailand,137,1.5,510890,40.0,19444.0,69799978,0.51,0.009000000000000001 154 | TG,TGO,768,Togo,Togolese Republic,Togo,152,4.4,54390,19.0,-2000.0,8278724,0.43,0.0011 155 | TT,TTO,780,Trinidad and Tobago,Republic of Trinidad and Tobago,Trinidad and Tobago,273,1.7,5130,36.0,-800.0,1399488,0.52,0.0002 156 | AE,ARE,784,United Arab Emirates,United Arab Emirates,United Arab Emirates,118,1.4,83600,33.0,40000.0,9890402,0.86,0.0013 157 | TN,TUN,788,Tunisia,Republic of Tunisia,Tunisia,76,2.2,155360,33.0,-4000.0,11818619,0.7,0.0015 158 | TR,TUR,792,Turkey,Republic of Turkey,Turkey,110,2.1,769630,32.0,283922.0,84339067,0.76,0.0108 159 | UG,UGA,800,Uganda,Republic of Uganda,Uganda,229,5.0,199810,17.0,168694.0,45741007,0.26,0.0059 160 | UA,UKR,804,Ukraine,Ukraine,Ukraine,75,1.4,579320,41.0,10000.0,43733762,0.69,0.005600000000000001 161 | MK,MKD,807,North Macedonia,Republic of North Macedonia,North Macedonia,83,1.5,25220,39.0,-1000.0,2083374,0.59,0.0003 162 | EG,EGY,818,Egypt,Arab Republic of Egypt,Egypt,103,3.3,995450,25.0,-38033.0,102334404,0.43,0.0131 163 | GB,GBR,826,United Kingdom,United Kingdom of Great Britain and Northern Ireland,United Kingdom,281,1.8,241930,40.0,260650.0,67886011,0.83,0.0087 164 | TZ,TZA,834,"Tanzania, United Republic of",United Republic of Tanzania,Tanzania,67,4.9,885800,18.0,-40076.0,59734218,0.37,0.0077 165 | US,USA,840,United States,United States of America,US,36,1.8,9147420,38.0,954806.0,331002651,0.83,0.0425 166 | BF,BFA,854,Burkina Faso,Burkina Faso,Burkina Faso,76,5.2,273600,18.0,-25000.0,20903273,0.31,0.0027 167 | UY,URY,858,Uruguay,Eastern Republic of Uruguay,Uruguay,20,2.0,175020,36.0,-3000.0,3473730,0.96,0.0004 168 | UZ,UZB,860,Uzbekistan,Republic of Uzbekistan,Uzbekistan,79,2.4,425400,28.0,-8863.0,33469203,0.5,0.0043 169 | VE,VEN,862,"Venezuela, Bolivarian Republic of",Bolivarian Republic of Venezuela,Venezuela,32,2.3,882050,30.0,-653249.0,28435940,,0.0036 170 | ZM,ZMB,894,Zambia,Republic of Zambia,Zambia,25,4.7,743390,18.0,-8000.0,18383955,0.45,0.0024 171 | -------------------------------------------------------------------------------- /auxiliary_files/submission_example.csv: -------------------------------------------------------------------------------- 1 | ,date,region,country,prediction_confirmed,prediction_deaths 2 | 0,2020-04-19,RU-ALT,RUS,67,0 3 | 1,2020-04-20,RU-ALT,RUS,72,0 4 | 2,2020-04-21,RU-ALT,RUS,78,0 5 | 3,2020-04-22,RU-ALT,RUS,83,0 6 | 4,2020-04-23,RU-ALT,RUS,86,0 7 | 5,2020-04-24,RU-ALT,RUS,92,0 8 | 6,2020-04-25,RU-ALT,RUS,97,0 9 | 7,2020-04-26,RU-ALT,RUS,100,0 10 | 8,2020-04-27,RU-ALT,RUS,103,0 11 | 9,2020-04-28,RU-ALT,RUS,109,0 12 | 10,2020-04-29,RU-ALT,RUS,113,0 13 | 11,2020-04-30,RU-ALT,RUS,114,0 14 | 12,2020-05-01,RU-ALT,RUS,117,0 15 | 13,2020-05-02,RU-ALT,RUS,121,0 16 | 14,2020-04-19,RU-AMU,RUS,14,0 17 | 15,2020-04-20,RU-AMU,RUS,15,0 18 | 16,2020-04-21,RU-AMU,RUS,16,0 19 | 17,2020-04-22,RU-AMU,RUS,19,0 20 | 18,2020-04-23,RU-AMU,RUS,22,0 21 | 19,2020-04-24,RU-AMU,RUS,24,0 22 | 20,2020-04-25,RU-AMU,RUS,26,0 23 | 21,2020-04-26,RU-AMU,RUS,28,0 24 | 22,2020-04-27,RU-AMU,RUS,31,0 25 | 23,2020-04-28,RU-AMU,RUS,34,0 26 | 24,2020-04-29,RU-AMU,RUS,38,0 27 | 25,2020-04-30,RU-AMU,RUS,41,0 28 | 26,2020-05-01,RU-AMU,RUS,45,0 29 | 27,2020-05-02,RU-AMU,RUS,48,0 30 | 28,2020-04-19,RU-ARK,RUS,44,0 31 | 29,2020-04-20,RU-ARK,RUS,46,0 32 | 30,2020-04-21,RU-ARK,RUS,49,0 33 | 31,2020-04-22,RU-ARK,RUS,53,0 34 | 32,2020-04-23,RU-ARK,RUS,56,0 35 | 33,2020-04-24,RU-ARK,RUS,59,0 36 | 34,2020-04-25,RU-ARK,RUS,62,0 37 | 35,2020-04-26,RU-ARK,RUS,65,0 38 | 36,2020-04-27,RU-ARK,RUS,68,0 39 | 37,2020-04-28,RU-ARK,RUS,73,0 40 | 38,2020-04-29,RU-ARK,RUS,77,0 41 | 39,2020-04-30,RU-ARK,RUS,80,0 42 | 40,2020-05-01,RU-ARK,RUS,83,0 43 | 41,2020-05-02,RU-ARK,RUS,87,0 44 | 42,2020-04-19,RU-AST,RUS,120,3 45 | 43,2020-04-20,RU-AST,RUS,149,4 46 | 44,2020-04-21,RU-AST,RUS,185,5 47 | 45,2020-04-22,RU-AST,RUS,228,6 48 | 46,2020-04-23,RU-AST,RUS,284,8 49 | 47,2020-04-24,RU-AST,RUS,351,9 50 | 48,2020-04-25,RU-AST,RUS,434,12 51 | 49,2020-04-26,RU-AST,RUS,537,15 52 | 50,2020-04-27,RU-AST,RUS,664,18 53 | 51,2020-04-28,RU-AST,RUS,821,23 54 | 52,2020-04-29,RU-AST,RUS,1016,29 55 | 53,2020-04-30,RU-AST,RUS,1256,35 56 | 54,2020-05-01,RU-AST,RUS,1550,44 57 | 55,2020-05-02,RU-AST,RUS,1915,55 58 | 56,2020-04-19,RU-BEL,RUS,104,2 59 | 57,2020-04-20,RU-BEL,RUS,125,2 60 | 58,2020-04-21,RU-BEL,RUS,148,3 61 | 59,2020-04-22,RU-BEL,RUS,177,3 62 | 60,2020-04-23,RU-BEL,RUS,209,4 63 | 61,2020-04-24,RU-BEL,RUS,246,5 64 | 62,2020-04-25,RU-BEL,RUS,290,6 65 | 63,2020-04-26,RU-BEL,RUS,340,7 66 | 64,2020-04-27,RU-BEL,RUS,399,9 67 | 65,2020-04-28,RU-BEL,RUS,467,11 68 | 66,2020-04-29,RU-BEL,RUS,544,13 69 | 67,2020-04-30,RU-BEL,RUS,632,15 70 | 68,2020-05-01,RU-BEL,RUS,731,18 71 | 69,2020-05-02,RU-BEL,RUS,843,21 72 | 70,2020-04-19,RU-BRY,RUS,277,0 73 | 71,2020-04-20,RU-BRY,RUS,290,1 74 | 72,2020-04-21,RU-BRY,RUS,302,1 75 | 73,2020-04-22,RU-BRY,RUS,311,1 76 | 74,2020-04-23,RU-BRY,RUS,319,1 77 | 75,2020-04-24,RU-BRY,RUS,326,2 78 | 76,2020-04-25,RU-BRY,RUS,330,2 79 | 77,2020-04-26,RU-BRY,RUS,333,2 80 | 78,2020-04-27,RU-BRY,RUS,336,2 81 | 79,2020-04-28,RU-BRY,RUS,338,3 82 | 80,2020-04-29,RU-BRY,RUS,340,3 83 | 81,2020-04-30,RU-BRY,RUS,342,4 84 | 82,2020-05-01,RU-BRY,RUS,343,4 85 | 83,2020-05-02,RU-BRY,RUS,343,4 86 | 84,2020-04-19,RU-VLA,RUS,240,6 87 | 85,2020-04-20,RU-VLA,RUS,263,9 88 | 86,2020-04-21,RU-VLA,RUS,284,10 89 | 87,2020-04-22,RU-VLA,RUS,301,11 90 | 88,2020-04-23,RU-VLA,RUS,315,13 91 | 89,2020-04-24,RU-VLA,RUS,327,17 92 | 90,2020-04-25,RU-VLA,RUS,338,18 93 | 91,2020-04-26,RU-VLA,RUS,347,19 94 | 92,2020-04-27,RU-VLA,RUS,355,22 95 | 93,2020-04-28,RU-VLA,RUS,360,25 96 | 94,2020-04-29,RU-VLA,RUS,365,26 97 | 95,2020-04-30,RU-VLA,RUS,369,27 98 | 96,2020-05-01,RU-VLA,RUS,374,29 99 | 97,2020-05-02,RU-VLA,RUS,377,31 100 | 98,2020-04-19,RU-VGG,RUS,84,0 101 | 99,2020-04-20,RU-VGG,RUS,95,0 102 | 100,2020-04-21,RU-VGG,RUS,104,0 103 | 101,2020-04-22,RU-VGG,RUS,113,0 104 | 102,2020-04-23,RU-VGG,RUS,122,0 105 | 103,2020-04-24,RU-VGG,RUS,134,1 106 | 104,2020-04-25,RU-VGG,RUS,147,1 107 | 105,2020-04-26,RU-VGG,RUS,156,1 108 | 106,2020-04-27,RU-VGG,RUS,168,1 109 | 107,2020-04-28,RU-VGG,RUS,181,1 110 | 108,2020-04-29,RU-VGG,RUS,195,1 111 | 109,2020-04-30,RU-VGG,RUS,208,2 112 | 110,2020-05-01,RU-VGG,RUS,220,2 113 | 111,2020-05-02,RU-VGG,RUS,234,2 114 | 112,2020-04-19,RU-VLG,RUS,90,0 115 | 113,2020-04-20,RU-VLG,RUS,95,0 116 | 114,2020-04-21,RU-VLG,RUS,101,0 117 | 115,2020-04-22,RU-VLG,RUS,106,0 118 | 116,2020-04-23,RU-VLG,RUS,111,0 119 | 117,2020-04-24,RU-VLG,RUS,115,0 120 | 118,2020-04-25,RU-VLG,RUS,118,0 121 | 119,2020-04-26,RU-VLG,RUS,122,0 122 | 120,2020-04-27,RU-VLG,RUS,126,0 123 | 121,2020-04-28,RU-VLG,RUS,129,0 124 | 122,2020-04-29,RU-VLG,RUS,132,0 125 | 123,2020-04-30,RU-VLG,RUS,134,0 126 | 124,2020-05-01,RU-VLG,RUS,136,0 127 | 125,2020-05-02,RU-VLG,RUS,138,0 128 | 126,2020-04-19,RU-VOR,RUS,146,2 129 | 127,2020-04-20,RU-VOR,RUS,165,2 130 | 128,2020-04-21,RU-VOR,RUS,187,3 131 | 129,2020-04-22,RU-VOR,RUS,213,3 132 | 130,2020-04-23,RU-VOR,RUS,242,4 133 | 131,2020-04-24,RU-VOR,RUS,275,5 134 | 132,2020-04-25,RU-VOR,RUS,312,5 135 | 133,2020-04-26,RU-VOR,RUS,355,6 136 | 134,2020-04-27,RU-VOR,RUS,401,7 137 | 135,2020-04-28,RU-VOR,RUS,455,8 138 | 136,2020-04-29,RU-VOR,RUS,516,9 139 | 137,2020-04-30,RU-VOR,RUS,585,11 140 | 138,2020-05-01,RU-VOR,RUS,662,12 141 | 139,2020-05-02,RU-VOR,RUS,750,14 142 | 140,2020-04-19,RU-YEV,RUS,20,0 143 | 141,2020-04-20,RU-YEV,RUS,23,0 144 | 142,2020-04-21,RU-YEV,RUS,26,0 145 | 143,2020-04-22,RU-YEV,RUS,30,0 146 | 144,2020-04-23,RU-YEV,RUS,34,0 147 | 145,2020-04-24,RU-YEV,RUS,39,0 148 | 146,2020-04-25,RU-YEV,RUS,44,0 149 | 147,2020-04-26,RU-YEV,RUS,50,0 150 | 148,2020-04-27,RU-YEV,RUS,57,0 151 | 149,2020-04-28,RU-YEV,RUS,64,0 152 | 150,2020-04-29,RU-YEV,RUS,73,0 153 | 151,2020-04-30,RU-YEV,RUS,83,0 154 | 152,2020-05-01,RU-YEV,RUS,94,0 155 | 153,2020-05-02,RU-YEV,RUS,107,0 156 | 154,2020-04-19,RU-ZAB,RUS,30,0 157 | 155,2020-04-20,RU-ZAB,RUS,34,0 158 | 156,2020-04-21,RU-ZAB,RUS,39,0 159 | 157,2020-04-22,RU-ZAB,RUS,44,0 160 | 158,2020-04-23,RU-ZAB,RUS,49,0 161 | 159,2020-04-24,RU-ZAB,RUS,57,0 162 | 160,2020-04-25,RU-ZAB,RUS,63,0 163 | 161,2020-04-26,RU-ZAB,RUS,72,0 164 | 162,2020-04-27,RU-ZAB,RUS,80,0 165 | 163,2020-04-28,RU-ZAB,RUS,89,0 166 | 164,2020-04-29,RU-ZAB,RUS,99,0 167 | 165,2020-04-30,RU-ZAB,RUS,111,0 168 | 166,2020-05-01,RU-ZAB,RUS,122,0 169 | 167,2020-05-02,RU-ZAB,RUS,136,0 170 | 168,2020-04-19,RU-IVA,RUS,189,0 171 | 169,2020-04-20,RU-IVA,RUS,207,0 172 | 170,2020-04-21,RU-IVA,RUS,225,0 173 | 171,2020-04-22,RU-IVA,RUS,243,0 174 | 172,2020-04-23,RU-IVA,RUS,262,0 175 | 173,2020-04-24,RU-IVA,RUS,280,1 176 | 174,2020-04-25,RU-IVA,RUS,298,1 177 | 175,2020-04-26,RU-IVA,RUS,318,1 178 | 176,2020-04-27,RU-IVA,RUS,336,1 179 | 177,2020-04-28,RU-IVA,RUS,354,1 180 | 178,2020-04-29,RU-IVA,RUS,372,1 181 | 179,2020-04-30,RU-IVA,RUS,387,2 182 | 180,2020-05-01,RU-IVA,RUS,404,2 183 | 181,2020-05-02,RU-IVA,RUS,421,2 184 | 182,2020-04-19,RU-IRK,RUS,71,4 185 | 183,2020-04-20,RU-IRK,RUS,82,4 186 | 184,2020-04-21,RU-IRK,RUS,95,4 187 | 185,2020-04-22,RU-IRK,RUS,108,6 188 | 186,2020-04-23,RU-IRK,RUS,124,7 189 | 187,2020-04-24,RU-IRK,RUS,140,6 190 | 188,2020-04-25,RU-IRK,RUS,159,8 191 | 189,2020-04-26,RU-IRK,RUS,179,11 192 | 190,2020-04-27,RU-IRK,RUS,201,10 193 | 191,2020-04-28,RU-IRK,RUS,225,12 194 | 192,2020-04-29,RU-IRK,RUS,252,15 195 | 193,2020-04-30,RU-IRK,RUS,280,16 196 | 194,2020-05-01,RU-IRK,RUS,312,17 197 | 195,2020-05-02,RU-IRK,RUS,345,20 198 | 196,2020-04-19,RU-KB,RUS,114,0 199 | 197,2020-04-20,RU-KB,RUS,131,0 200 | 198,2020-04-21,RU-KB,RUS,150,0 201 | 199,2020-04-22,RU-KB,RUS,172,0 202 | 200,2020-04-23,RU-KB,RUS,197,0 203 | 201,2020-04-24,RU-KB,RUS,225,0 204 | 202,2020-04-25,RU-KB,RUS,257,0 205 | 203,2020-04-26,RU-KB,RUS,293,0 206 | 204,2020-04-27,RU-KB,RUS,334,0 207 | 205,2020-04-28,RU-KB,RUS,382,0 208 | 206,2020-04-29,RU-KB,RUS,436,0 209 | 207,2020-04-30,RU-KB,RUS,499,0 210 | 208,2020-05-01,RU-KB,RUS,569,0 211 | 209,2020-05-02,RU-KB,RUS,648,0 212 | 210,2020-04-19,RU-KGD,RUS,133,1 213 | 211,2020-04-20,RU-KGD,RUS,145,1 214 | 212,2020-04-21,RU-KGD,RUS,157,1 215 | 213,2020-04-22,RU-KGD,RUS,170,1 216 | 214,2020-04-23,RU-KGD,RUS,185,2 217 | 215,2020-04-24,RU-KGD,RUS,200,2 218 | 216,2020-04-25,RU-KGD,RUS,216,2 219 | 217,2020-04-26,RU-KGD,RUS,233,2 220 | 218,2020-04-27,RU-KGD,RUS,251,3 221 | 219,2020-04-28,RU-KGD,RUS,270,3 222 | 220,2020-04-29,RU-KGD,RUS,289,3 223 | 221,2020-04-30,RU-KGD,RUS,310,4 224 | 222,2020-05-01,RU-KGD,RUS,331,4 225 | 223,2020-05-02,RU-KGD,RUS,354,5 226 | 224,2020-04-19,RU-KLU,RUS,152,1 227 | 225,2020-04-20,RU-KLU,RUS,181,1 228 | 226,2020-04-21,RU-KLU,RUS,215,2 229 | 227,2020-04-22,RU-KLU,RUS,255,2 230 | 228,2020-04-23,RU-KLU,RUS,303,3 231 | 229,2020-04-24,RU-KLU,RUS,359,3 232 | 230,2020-04-25,RU-KLU,RUS,427,4 233 | 231,2020-04-26,RU-KLU,RUS,506,5 234 | 232,2020-04-27,RU-KLU,RUS,599,6 235 | 233,2020-04-28,RU-KLU,RUS,710,7 236 | 234,2020-04-29,RU-KLU,RUS,841,8 237 | 235,2020-04-30,RU-KLU,RUS,997,10 238 | 236,2020-05-01,RU-KLU,RUS,1180,12 239 | 237,2020-05-02,RU-KLU,RUS,1396,14 240 | 238,2020-04-19,RU-KAM,RUS,39,0 241 | 239,2020-04-20,RU-KAM,RUS,47,0 242 | 240,2020-04-21,RU-KAM,RUS,58,0 243 | 241,2020-04-22,RU-KAM,RUS,71,0 244 | 242,2020-04-23,RU-KAM,RUS,86,0 245 | 243,2020-04-24,RU-KAM,RUS,106,0 246 | 244,2020-04-25,RU-KAM,RUS,128,0 247 | 245,2020-04-26,RU-KAM,RUS,154,0 248 | 246,2020-04-27,RU-KAM,RUS,186,0 249 | 247,2020-04-28,RU-KAM,RUS,223,0 250 | 248,2020-04-29,RU-KAM,RUS,267,0 251 | 249,2020-04-30,RU-KAM,RUS,319,0 252 | 250,2020-05-01,RU-KAM,RUS,379,0 253 | 251,2020-05-02,RU-KAM,RUS,449,0 254 | 252,2020-04-19,RU-KC,RUS,67,0 255 | 253,2020-04-20,RU-KC,RUS,85,0 256 | 254,2020-04-21,RU-KC,RUS,108,0 257 | 255,2020-04-22,RU-KC,RUS,136,0 258 | 256,2020-04-23,RU-KC,RUS,171,0 259 | 257,2020-04-24,RU-KC,RUS,215,0 260 | 258,2020-04-25,RU-KC,RUS,270,0 261 | 259,2020-04-26,RU-KC,RUS,339,0 262 | 260,2020-04-27,RU-KC,RUS,425,0 263 | 261,2020-04-28,RU-KC,RUS,533,0 264 | 262,2020-04-29,RU-KC,RUS,667,0 265 | 263,2020-04-30,RU-KC,RUS,835,0 266 | 264,2020-05-01,RU-KC,RUS,1046,0 267 | 265,2020-05-02,RU-KC,RUS,1308,0 268 | 266,2020-04-19,RU-KEM,RUS,26,1 269 | 267,2020-04-20,RU-KEM,RUS,29,1 270 | 268,2020-04-21,RU-KEM,RUS,32,0 271 | 269,2020-04-22,RU-KEM,RUS,37,0 272 | 270,2020-04-23,RU-KEM,RUS,41,0 273 | 271,2020-04-24,RU-KEM,RUS,45,0 274 | 272,2020-04-25,RU-KEM,RUS,50,0 275 | 273,2020-04-26,RU-KEM,RUS,56,1 276 | 274,2020-04-27,RU-KEM,RUS,62,2 277 | 275,2020-04-28,RU-KEM,RUS,68,3 278 | 276,2020-04-29,RU-KEM,RUS,76,3 279 | 277,2020-04-30,RU-KEM,RUS,84,2 280 | 278,2020-05-01,RU-KEM,RUS,94,1 281 | 279,2020-05-02,RU-KEM,RUS,104,0 282 | 280,2020-04-19,RU-KIR,RUS,112,1 283 | 281,2020-04-20,RU-KIR,RUS,124,1 284 | 282,2020-04-21,RU-KIR,RUS,138,1 285 | 283,2020-04-22,RU-KIR,RUS,154,1 286 | 284,2020-04-23,RU-KIR,RUS,172,2 287 | 285,2020-04-24,RU-KIR,RUS,193,2 288 | 286,2020-04-25,RU-KIR,RUS,216,2 289 | 287,2020-04-26,RU-KIR,RUS,240,3 290 | 288,2020-04-27,RU-KIR,RUS,267,3 291 | 289,2020-04-28,RU-KIR,RUS,297,4 292 | 290,2020-04-29,RU-KIR,RUS,331,4 293 | 291,2020-04-30,RU-KIR,RUS,368,5 294 | 292,2020-05-01,RU-KIR,RUS,410,5 295 | 293,2020-05-02,RU-KIR,RUS,456,6 296 | 294,2020-04-19,RU-KOS,RUS,58,3 297 | 295,2020-04-20,RU-KOS,RUS,66,4 298 | 296,2020-04-21,RU-KOS,RUS,77,3 299 | 297,2020-04-22,RU-KOS,RUS,87,4 300 | 298,2020-04-23,RU-KOS,RUS,99,6 301 | 299,2020-04-24,RU-KOS,RUS,113,6 302 | 300,2020-04-25,RU-KOS,RUS,128,7 303 | 301,2020-04-26,RU-KOS,RUS,144,9 304 | 302,2020-04-27,RU-KOS,RUS,162,10 305 | 303,2020-04-28,RU-KOS,RUS,182,11 306 | 304,2020-04-29,RU-KOS,RUS,203,13 307 | 305,2020-04-30,RU-KOS,RUS,226,14 308 | 306,2020-05-01,RU-KOS,RUS,253,16 309 | 307,2020-05-02,RU-KOS,RUS,280,18 310 | 308,2020-04-19,RU-KDA,RUS,395,5 311 | 309,2020-04-20,RU-KDA,RUS,444,5 312 | 310,2020-04-21,RU-KDA,RUS,499,6 313 | 311,2020-04-22,RU-KDA,RUS,557,7 314 | 312,2020-04-23,RU-KDA,RUS,621,8 315 | 313,2020-04-24,RU-KDA,RUS,691,9 316 | 314,2020-04-25,RU-KDA,RUS,768,10 317 | 315,2020-04-26,RU-KDA,RUS,852,11 318 | 316,2020-04-27,RU-KDA,RUS,942,13 319 | 317,2020-04-28,RU-KDA,RUS,1040,15 320 | 318,2020-04-29,RU-KDA,RUS,1147,16 321 | 319,2020-04-30,RU-KDA,RUS,1264,18 322 | 320,2020-05-01,RU-KDA,RUS,1389,20 323 | 321,2020-05-02,RU-KDA,RUS,1524,23 324 | 322,2020-04-19,RU-KYA,RUS,316,0 325 | 323,2020-04-20,RU-KYA,RUS,372,0 326 | 324,2020-04-21,RU-KYA,RUS,435,0 327 | 325,2020-04-22,RU-KYA,RUS,507,0 328 | 326,2020-04-23,RU-KYA,RUS,591,0 329 | 327,2020-04-24,RU-KYA,RUS,689,0 330 | 328,2020-04-25,RU-KYA,RUS,801,0 331 | 329,2020-04-26,RU-KYA,RUS,930,0 332 | 330,2020-04-27,RU-KYA,RUS,1076,0 333 | 331,2020-04-28,RU-KYA,RUS,1243,0 334 | 332,2020-04-29,RU-KYA,RUS,1432,0 335 | 333,2020-04-30,RU-KYA,RUS,1647,0 336 | 334,2020-05-01,RU-KYA,RUS,1889,0 337 | 335,2020-05-02,RU-KYA,RUS,2162,0 338 | 336,2020-04-19,RU-KGN,RUS,11,0 339 | 337,2020-04-20,RU-KGN,RUS,12,0 340 | 338,2020-04-21,RU-KGN,RUS,13,0 341 | 339,2020-04-22,RU-KGN,RUS,15,0 342 | 340,2020-04-23,RU-KGN,RUS,16,0 343 | 341,2020-04-24,RU-KGN,RUS,19,0 344 | 342,2020-04-25,RU-KGN,RUS,20,0 345 | 343,2020-04-26,RU-KGN,RUS,22,0 346 | 344,2020-04-27,RU-KGN,RUS,24,0 347 | 345,2020-04-28,RU-KGN,RUS,26,0 348 | 346,2020-04-29,RU-KGN,RUS,28,0 349 | 347,2020-04-30,RU-KGN,RUS,30,0 350 | 348,2020-05-01,RU-KGN,RUS,32,0 351 | 349,2020-05-02,RU-KGN,RUS,36,0 352 | 350,2020-04-19,RU-KRS,RUS,236,2 353 | 351,2020-04-20,RU-KRS,RUS,299,3 354 | 352,2020-04-21,RU-KRS,RUS,380,3 355 | 353,2020-04-22,RU-KRS,RUS,483,5 356 | 354,2020-04-23,RU-KRS,RUS,615,6 357 | 355,2020-04-24,RU-KRS,RUS,783,8 358 | 356,2020-04-25,RU-KRS,RUS,994,10 359 | 357,2020-04-26,RU-KRS,RUS,1262,13 360 | 358,2020-04-27,RU-KRS,RUS,1603,17 361 | 359,2020-04-28,RU-KRS,RUS,2038,21 362 | 360,2020-04-29,RU-KRS,RUS,2589,27 363 | 361,2020-04-30,RU-KRS,RUS,3286,35 364 | 362,2020-05-01,RU-KRS,RUS,4167,45 365 | 363,2020-05-02,RU-KRS,RUS,5285,57 366 | 364,2020-04-19,RU-LEN,RUS,472,0 367 | 365,2020-04-20,RU-LEN,RUS,538,0 368 | 366,2020-04-21,RU-LEN,RUS,608,0 369 | 367,2020-04-22,RU-LEN,RUS,682,0 370 | 368,2020-04-23,RU-LEN,RUS,767,0 371 | 369,2020-04-24,RU-LEN,RUS,857,0 372 | 370,2020-04-25,RU-LEN,RUS,954,0 373 | 371,2020-04-26,RU-LEN,RUS,1060,0 374 | 372,2020-04-27,RU-LEN,RUS,1172,0 375 | 373,2020-04-28,RU-LEN,RUS,1293,0 376 | 374,2020-04-29,RU-LEN,RUS,1422,0 377 | 375,2020-04-30,RU-LEN,RUS,1559,0 378 | 376,2020-05-01,RU-LEN,RUS,1702,0 379 | 377,2020-05-02,RU-LEN,RUS,1857,0 380 | 378,2020-04-19,RU-LIP,RUS,146,0 381 | 379,2020-04-20,RU-LIP,RUS,162,0 382 | 380,2020-04-21,RU-LIP,RUS,180,0 383 | 381,2020-04-22,RU-LIP,RUS,200,0 384 | 382,2020-04-23,RU-LIP,RUS,221,0 385 | 383,2020-04-24,RU-LIP,RUS,244,0 386 | 384,2020-04-25,RU-LIP,RUS,270,0 387 | 385,2020-04-26,RU-LIP,RUS,296,0 388 | 386,2020-04-27,RU-LIP,RUS,325,0 389 | 387,2020-04-28,RU-LIP,RUS,356,0 390 | 388,2020-04-29,RU-LIP,RUS,390,0 391 | 389,2020-04-30,RU-LIP,RUS,426,0 392 | 390,2020-05-01,RU-LIP,RUS,464,0 393 | 391,2020-05-02,RU-LIP,RUS,505,0 394 | 392,2020-04-19,RU-MAG,RUS,28,0 395 | 393,2020-04-20,RU-MAG,RUS,33,0 396 | 394,2020-04-21,RU-MAG,RUS,40,0 397 | 395,2020-04-22,RU-MAG,RUS,47,0 398 | 396,2020-04-23,RU-MAG,RUS,57,0 399 | 397,2020-04-24,RU-MAG,RUS,68,0 400 | 398,2020-04-25,RU-MAG,RUS,81,0 401 | 399,2020-04-26,RU-MAG,RUS,97,0 402 | 400,2020-04-27,RU-MAG,RUS,115,0 403 | 401,2020-04-28,RU-MAG,RUS,137,0 404 | 402,2020-04-29,RU-MAG,RUS,165,0 405 | 403,2020-04-30,RU-MAG,RUS,196,0 406 | 404,2020-05-01,RU-MAG,RUS,234,0 407 | 405,2020-05-02,RU-MAG,RUS,278,0 408 | 406,2020-04-19,RU-MOW,RUS,24223,166 409 | 407,2020-04-20,RU-MOW,RUS,26926,187 410 | 408,2020-04-21,RU-MOW,RUS,29830,210 411 | 409,2020-04-22,RU-MOW,RUS,32969,235 412 | 410,2020-04-23,RU-MOW,RUS,36364,261 413 | 411,2020-04-24,RU-MOW,RUS,39992,291 414 | 412,2020-04-25,RU-MOW,RUS,43875,323 415 | 413,2020-04-26,RU-MOW,RUS,48039,357 416 | 414,2020-04-27,RU-MOW,RUS,52461,394 417 | 415,2020-04-28,RU-MOW,RUS,57155,434 418 | 416,2020-04-29,RU-MOW,RUS,62147,476 419 | 417,2020-04-30,RU-MOW,RUS,67418,522 420 | 418,2020-05-01,RU-MOW,RUS,72966,571 421 | 419,2020-05-02,RU-MOW,RUS,78820,622 422 | 420,2020-04-19,RU-MOS,RUS,5059,56 423 | 421,2020-04-20,RU-MOS,RUS,6003,66 424 | 422,2020-04-21,RU-MOS,RUS,7125,73 425 | 423,2020-04-22,RU-MOS,RUS,8442,93 426 | 424,2020-04-23,RU-MOS,RUS,10002,110 427 | 425,2020-04-24,RU-MOS,RUS,11844,126 428 | 426,2020-04-25,RU-MOS,RUS,14006,156 429 | 427,2020-04-26,RU-MOS,RUS,16552,183 430 | 428,2020-04-27,RU-MOS,RUS,19541,212 431 | 429,2020-04-28,RU-MOS,RUS,23027,258 432 | 430,2020-04-29,RU-MOS,RUS,27097,303 433 | 431,2020-04-30,RU-MOS,RUS,31825,353 434 | 432,2020-05-01,RU-MOS,RUS,37280,424 435 | 433,2020-05-02,RU-MOS,RUS,43562,497 436 | 434,2020-04-19,RU-MUR,RUS,420,2 437 | 435,2020-04-20,RU-MUR,RUS,471,2 438 | 436,2020-04-21,RU-MUR,RUS,517,3 439 | 437,2020-04-22,RU-MUR,RUS,558,4 440 | 438,2020-04-23,RU-MUR,RUS,594,4 441 | 439,2020-04-24,RU-MUR,RUS,624,5 442 | 440,2020-04-25,RU-MUR,RUS,648,6 443 | 441,2020-04-26,RU-MUR,RUS,668,7 444 | 442,2020-04-27,RU-MUR,RUS,684,7 445 | 443,2020-04-28,RU-MUR,RUS,696,8 446 | 444,2020-04-29,RU-MUR,RUS,707,9 447 | 445,2020-04-30,RU-MUR,RUS,714,10 448 | 446,2020-05-01,RU-MUR,RUS,720,10 449 | 447,2020-05-02,RU-MUR,RUS,725,11 450 | 448,2020-04-19,RU-NIZ,RUS,661,5 451 | 449,2020-04-20,RU-NIZ,RUS,780,6 452 | 450,2020-04-21,RU-NIZ,RUS,920,8 453 | 451,2020-04-22,RU-NIZ,RUS,1083,9 454 | 452,2020-04-23,RU-NIZ,RUS,1274,11 455 | 453,2020-04-24,RU-NIZ,RUS,1495,13 456 | 454,2020-04-25,RU-NIZ,RUS,1749,16 457 | 455,2020-04-26,RU-NIZ,RUS,2040,19 458 | 456,2020-04-27,RU-NIZ,RUS,2378,23 459 | 457,2020-04-28,RU-NIZ,RUS,2766,27 460 | 458,2020-04-29,RU-NIZ,RUS,3210,32 461 | 459,2020-04-30,RU-NIZ,RUS,3715,38 462 | 460,2020-05-01,RU-NIZ,RUS,4283,45 463 | 461,2020-05-02,RU-NIZ,RUS,4924,53 464 | 462,2020-04-19,RU-NGR,RUS,87,0 465 | 463,2020-04-20,RU-NGR,RUS,104,0 466 | 464,2020-04-21,RU-NGR,RUS,125,0 467 | 465,2020-04-22,RU-NGR,RUS,149,0 468 | 466,2020-04-23,RU-NGR,RUS,179,1 469 | 467,2020-04-24,RU-NGR,RUS,213,1 470 | 468,2020-04-25,RU-NGR,RUS,254,1 471 | 469,2020-04-26,RU-NGR,RUS,303,2 472 | 470,2020-04-27,RU-NGR,RUS,362,2 473 | 471,2020-04-28,RU-NGR,RUS,431,2 474 | 472,2020-04-29,RU-NGR,RUS,515,3 475 | 473,2020-04-30,RU-NGR,RUS,612,4 476 | 474,2020-05-01,RU-NGR,RUS,728,4 477 | 475,2020-05-02,RU-NGR,RUS,864,5 478 | 476,2020-04-19,RU-NVS,RUS,93,1 479 | 477,2020-04-20,RU-NVS,RUS,106,1 480 | 478,2020-04-21,RU-NVS,RUS,119,2 481 | 479,2020-04-22,RU-NVS,RUS,134,2 482 | 480,2020-04-23,RU-NVS,RUS,152,2 483 | 481,2020-04-24,RU-NVS,RUS,172,3 484 | 482,2020-04-25,RU-NVS,RUS,195,3 485 | 483,2020-04-26,RU-NVS,RUS,222,4 486 | 484,2020-04-27,RU-NVS,RUS,252,4 487 | 485,2020-04-28,RU-NVS,RUS,286,5 488 | 486,2020-04-29,RU-NVS,RUS,324,5 489 | 487,2020-04-30,RU-NVS,RUS,366,6 490 | 488,2020-05-01,RU-NVS,RUS,413,7 491 | 489,2020-05-02,RU-NVS,RUS,466,8 492 | 490,2020-04-19,RU-OMS,RUS,31,0 493 | 491,2020-04-20,RU-OMS,RUS,31,0 494 | 492,2020-04-21,RU-OMS,RUS,32,0 495 | 493,2020-04-22,RU-OMS,RUS,34,0 496 | 494,2020-04-23,RU-OMS,RUS,37,0 497 | 495,2020-04-24,RU-OMS,RUS,39,0 498 | 496,2020-04-25,RU-OMS,RUS,39,0 499 | 497,2020-04-26,RU-OMS,RUS,40,0 500 | 498,2020-04-27,RU-OMS,RUS,40,0 501 | 499,2020-04-28,RU-OMS,RUS,42,0 502 | 500,2020-04-29,RU-OMS,RUS,43,0 503 | 501,2020-04-30,RU-OMS,RUS,44,0 504 | 502,2020-05-01,RU-OMS,RUS,45,0 505 | 503,2020-05-02,RU-OMS,RUS,45,0 506 | 504,2020-04-19,RU-ORE,RUS,136,2 507 | 505,2020-04-20,RU-ORE,RUS,155,3 508 | 506,2020-04-21,RU-ORE,RUS,178,3 509 | 507,2020-04-22,RU-ORE,RUS,204,4 510 | 508,2020-04-23,RU-ORE,RUS,235,4 511 | 509,2020-04-24,RU-ORE,RUS,270,5 512 | 510,2020-04-25,RU-ORE,RUS,309,6 513 | 511,2020-04-26,RU-ORE,RUS,354,7 514 | 512,2020-04-27,RU-ORE,RUS,404,8 515 | 513,2020-04-28,RU-ORE,RUS,462,9 516 | 514,2020-04-29,RU-ORE,RUS,527,11 517 | 515,2020-04-30,RU-ORE,RUS,601,12 518 | 516,2020-05-01,RU-ORE,RUS,684,14 519 | 517,2020-05-02,RU-ORE,RUS,778,16 520 | 518,2020-04-19,RU-ORL,RUS,118,0 521 | 519,2020-04-20,RU-ORL,RUS,139,0 522 | 520,2020-04-21,RU-ORL,RUS,165,0 523 | 521,2020-04-22,RU-ORL,RUS,193,0 524 | 522,2020-04-23,RU-ORL,RUS,227,1 525 | 523,2020-04-24,RU-ORL,RUS,268,1 526 | 524,2020-04-25,RU-ORL,RUS,314,1 527 | 525,2020-04-26,RU-ORL,RUS,371,1 528 | 526,2020-04-27,RU-ORL,RUS,435,2 529 | 527,2020-04-28,RU-ORL,RUS,510,2 530 | 528,2020-04-29,RU-ORL,RUS,599,2 531 | 529,2020-04-30,RU-ORL,RUS,702,3 532 | 530,2020-05-01,RU-ORL,RUS,824,4 533 | 531,2020-05-02,RU-ORL,RUS,965,4 534 | 532,2020-04-19,RU-PNZ,RUS,147,2 535 | 533,2020-04-20,RU-PNZ,RUS,157,2 536 | 534,2020-04-21,RU-PNZ,RUS,169,2 537 | 535,2020-04-22,RU-PNZ,RUS,178,3 538 | 536,2020-04-23,RU-PNZ,RUS,188,3 539 | 537,2020-04-24,RU-PNZ,RUS,198,3 540 | 538,2020-04-25,RU-PNZ,RUS,206,3 541 | 539,2020-04-26,RU-PNZ,RUS,216,4 542 | 540,2020-04-27,RU-PNZ,RUS,225,4 543 | 541,2020-04-28,RU-PNZ,RUS,233,4 544 | 542,2020-04-29,RU-PNZ,RUS,241,4 545 | 543,2020-04-30,RU-PNZ,RUS,249,4 546 | 544,2020-05-01,RU-PNZ,RUS,256,5 547 | 545,2020-05-02,RU-PNZ,RUS,263,5 548 | 546,2020-04-19,RU-PER,RUS,188,5 549 | 547,2020-04-20,RU-PER,RUS,216,7 550 | 548,2020-04-21,RU-PER,RUS,250,8 551 | 549,2020-04-22,RU-PER,RUS,289,8 552 | 550,2020-04-23,RU-PER,RUS,333,9 553 | 551,2020-04-24,RU-PER,RUS,384,11 554 | 552,2020-04-25,RU-PER,RUS,443,13 555 | 553,2020-04-26,RU-PER,RUS,509,16 556 | 554,2020-04-27,RU-PER,RUS,587,19 557 | 555,2020-04-28,RU-PER,RUS,675,21 558 | 556,2020-04-29,RU-PER,RUS,775,24 559 | 557,2020-04-30,RU-PER,RUS,891,28 560 | 558,2020-05-01,RU-PER,RUS,1020,33 561 | 559,2020-05-02,RU-PER,RUS,1169,38 562 | 560,2020-04-19,RU-PRI,RUS,62,3 563 | 561,2020-04-20,RU-PRI,RUS,69,3 564 | 562,2020-04-21,RU-PRI,RUS,77,3 565 | 563,2020-04-22,RU-PRI,RUS,84,4 566 | 564,2020-04-23,RU-PRI,RUS,93,4 567 | 565,2020-04-24,RU-PRI,RUS,101,5 568 | 566,2020-04-25,RU-PRI,RUS,112,6 569 | 567,2020-04-26,RU-PRI,RUS,121,6 570 | 568,2020-04-27,RU-PRI,RUS,132,7 571 | 569,2020-04-28,RU-PRI,RUS,144,8 572 | 570,2020-04-29,RU-PRI,RUS,157,9 573 | 571,2020-04-30,RU-PRI,RUS,170,10 574 | 572,2020-05-01,RU-PRI,RUS,185,11 575 | 573,2020-05-02,RU-PRI,RUS,200,12 576 | 574,2020-04-19,RU-PSK,RUS,41,5 577 | 575,2020-04-20,RU-PSK,RUS,44,5 578 | 576,2020-04-21,RU-PSK,RUS,47,6 579 | 577,2020-04-22,RU-PSK,RUS,50,6 580 | 578,2020-04-23,RU-PSK,RUS,55,7 581 | 579,2020-04-24,RU-PSK,RUS,58,8 582 | 580,2020-04-25,RU-PSK,RUS,62,8 583 | 581,2020-04-26,RU-PSK,RUS,65,8 584 | 582,2020-04-27,RU-PSK,RUS,69,8 585 | 583,2020-04-28,RU-PSK,RUS,74,10 586 | 584,2020-04-29,RU-PSK,RUS,78,10 587 | 585,2020-04-30,RU-PSK,RUS,82,11 588 | 586,2020-05-01,RU-PSK,RUS,87,12 589 | 587,2020-05-02,RU-PSK,RUS,92,12 590 | 588,2020-04-19,RU-AD,RUS,101,1 591 | 589,2020-04-20,RU-AD,RUS,124,2 592 | 590,2020-04-21,RU-AD,RUS,151,2 593 | 591,2020-04-22,RU-AD,RUS,185,3 594 | 592,2020-04-23,RU-AD,RUS,225,4 595 | 593,2020-04-24,RU-AD,RUS,274,5 596 | 594,2020-04-25,RU-AD,RUS,334,6 597 | 595,2020-04-26,RU-AD,RUS,409,7 598 | 596,2020-04-27,RU-AD,RUS,498,9 599 | 597,2020-04-28,RU-AD,RUS,605,11 600 | 598,2020-04-29,RU-AD,RUS,736,14 601 | 599,2020-04-30,RU-AD,RUS,897,17 602 | 600,2020-05-01,RU-AD,RUS,1090,21 603 | 601,2020-05-02,RU-AD,RUS,1323,25 604 | 602,2020-04-19,RU-BA,RUS,302,7 605 | 603,2020-04-20,RU-BA,RUS,358,9 606 | 604,2020-04-21,RU-BA,RUS,422,10 607 | 605,2020-04-22,RU-BA,RUS,501,12 608 | 606,2020-04-23,RU-BA,RUS,594,15 609 | 607,2020-04-24,RU-BA,RUS,705,18 610 | 608,2020-04-25,RU-BA,RUS,838,21 611 | 609,2020-04-26,RU-BA,RUS,994,25 612 | 610,2020-04-27,RU-BA,RUS,1175,30 613 | 611,2020-04-28,RU-BA,RUS,1390,36 614 | 612,2020-04-29,RU-BA,RUS,1646,42 615 | 613,2020-04-30,RU-BA,RUS,1949,50 616 | 614,2020-05-01,RU-BA,RUS,2306,60 617 | 615,2020-05-02,RU-BA,RUS,2725,71 618 | 616,2020-04-19,RU-BU,RUS,118,2 619 | 617,2020-04-20,RU-BU,RUS,124,2 620 | 618,2020-04-21,RU-BU,RUS,127,2 621 | 619,2020-04-22,RU-BU,RUS,130,2 622 | 620,2020-04-23,RU-BU,RUS,133,2 623 | 621,2020-04-24,RU-BU,RUS,136,2 624 | 622,2020-04-25,RU-BU,RUS,137,3 625 | 623,2020-04-26,RU-BU,RUS,140,3 626 | 624,2020-04-27,RU-BU,RUS,143,3 627 | 625,2020-04-28,RU-BU,RUS,144,3 628 | 626,2020-04-29,RU-BU,RUS,145,3 629 | 627,2020-04-30,RU-BU,RUS,147,3 630 | 628,2020-05-01,RU-BU,RUS,147,3 631 | 629,2020-05-02,RU-BU,RUS,148,3 632 | 630,2020-04-19,RU-DA,RUS,284,8 633 | 631,2020-04-20,RU-DA,RUS,309,10 634 | 632,2020-04-21,RU-DA,RUS,333,12 635 | 633,2020-04-22,RU-DA,RUS,356,14 636 | 634,2020-04-23,RU-DA,RUS,375,17 637 | 635,2020-04-24,RU-DA,RUS,391,19 638 | 636,2020-04-25,RU-DA,RUS,404,22 639 | 637,2020-04-26,RU-DA,RUS,417,26 640 | 638,2020-04-27,RU-DA,RUS,427,29 641 | 639,2020-04-28,RU-DA,RUS,435,32 642 | 640,2020-04-29,RU-DA,RUS,442,36 643 | 641,2020-04-30,RU-DA,RUS,448,39 644 | 642,2020-05-01,RU-DA,RUS,452,43 645 | 643,2020-05-02,RU-DA,RUS,455,46 646 | 644,2020-04-19,RU-IN,RUS,290,4 647 | 645,2020-04-20,RU-IN,RUS,360,6 648 | 646,2020-04-21,RU-IN,RUS,440,8 649 | 647,2020-04-22,RU-IN,RUS,533,10 650 | 648,2020-04-23,RU-IN,RUS,637,13 651 | 649,2020-04-24,RU-IN,RUS,752,16 652 | 650,2020-04-25,RU-IN,RUS,878,20 653 | 651,2020-04-26,RU-IN,RUS,1017,25 654 | 652,2020-04-27,RU-IN,RUS,1167,30 655 | 653,2020-04-28,RU-IN,RUS,1327,36 656 | 654,2020-04-29,RU-IN,RUS,1495,42 657 | 655,2020-04-30,RU-IN,RUS,1673,49 658 | 656,2020-05-01,RU-IN,RUS,1858,57 659 | 657,2020-05-02,RU-IN,RUS,2048,66 660 | 658,2020-04-19,RU-KL,RUS,67,3 661 | 659,2020-04-20,RU-KL,RUS,73,3 662 | 660,2020-04-21,RU-KL,RUS,77,4 663 | 661,2020-04-22,RU-KL,RUS,80,4 664 | 662,2020-04-23,RU-KL,RUS,84,5 665 | 663,2020-04-24,RU-KL,RUS,87,6 666 | 664,2020-04-25,RU-KL,RUS,90,7 667 | 665,2020-04-26,RU-KL,RUS,93,7 668 | 666,2020-04-27,RU-KL,RUS,95,8 669 | 667,2020-04-28,RU-KL,RUS,97,9 670 | 668,2020-04-29,RU-KL,RUS,98,10 671 | 669,2020-04-30,RU-KL,RUS,100,10 672 | 670,2020-05-01,RU-KL,RUS,101,11 673 | 671,2020-05-02,RU-KL,RUS,101,12 674 | 672,2020-04-19,RU-KR,RUS,13,0 675 | 673,2020-04-20,RU-KR,RUS,15,0 676 | 674,2020-04-21,RU-KR,RUS,19,0 677 | 675,2020-04-22,RU-KR,RUS,22,0 678 | 676,2020-04-23,RU-KR,RUS,25,0 679 | 677,2020-04-24,RU-KR,RUS,30,0 680 | 678,2020-04-25,RU-KR,RUS,36,0 681 | 679,2020-04-26,RU-KR,RUS,42,0 682 | 680,2020-04-27,RU-KR,RUS,48,0 683 | 681,2020-04-28,RU-KR,RUS,57,0 684 | 682,2020-04-29,RU-KR,RUS,65,0 685 | 683,2020-04-30,RU-KR,RUS,77,0 686 | 684,2020-05-01,RU-KR,RUS,90,0 687 | 685,2020-05-02,RU-KR,RUS,104,0 688 | 686,2020-04-19,RU-KO,RUS,478,4 689 | 687,2020-04-20,RU-KO,RUS,503,4 690 | 688,2020-04-21,RU-KO,RUS,528,5 691 | 689,2020-04-22,RU-KO,RUS,552,5 692 | 690,2020-04-23,RU-KO,RUS,573,5 693 | 691,2020-04-24,RU-KO,RUS,593,6 694 | 692,2020-04-25,RU-KO,RUS,612,6 695 | 693,2020-04-26,RU-KO,RUS,629,6 696 | 694,2020-04-27,RU-KO,RUS,645,6 697 | 695,2020-04-28,RU-KO,RUS,660,7 698 | 696,2020-04-29,RU-KO,RUS,673,7 699 | 697,2020-04-30,RU-KO,RUS,685,7 700 | 698,2020-05-01,RU-KO,RUS,696,7 701 | 699,2020-05-02,RU-KO,RUS,705,8 702 | 700,2020-04-19,UA-43,RUS,44,0 703 | 701,2020-04-20,UA-43,RUS,45,0 704 | 702,2020-04-21,UA-43,RUS,47,0 705 | 703,2020-04-22,UA-43,RUS,49,0 706 | 704,2020-04-23,UA-43,RUS,51,0 707 | 705,2020-04-24,UA-43,RUS,53,0 708 | 706,2020-04-25,UA-43,RUS,54,0 709 | 707,2020-04-26,UA-43,RUS,55,0 710 | 708,2020-04-27,UA-43,RUS,56,0 711 | 709,2020-04-28,UA-43,RUS,58,0 712 | 710,2020-04-29,UA-43,RUS,60,0 713 | 711,2020-04-30,UA-43,RUS,62,0 714 | 712,2020-05-01,UA-43,RUS,63,0 715 | 713,2020-05-02,UA-43,RUS,64,0 716 | 714,2020-04-19,RU-ME,RUS,267,1 717 | 715,2020-04-20,RU-ME,RUS,314,1 718 | 716,2020-04-21,RU-ME,RUS,369,2 719 | 717,2020-04-22,RU-ME,RUS,432,2 720 | 718,2020-04-23,RU-ME,RUS,503,3 721 | 719,2020-04-24,RU-ME,RUS,583,3 722 | 720,2020-04-25,RU-ME,RUS,672,4 723 | 721,2020-04-26,RU-ME,RUS,772,5 724 | 722,2020-04-27,RU-ME,RUS,881,6 725 | 723,2020-04-28,RU-ME,RUS,1002,7 726 | 724,2020-04-29,RU-ME,RUS,1137,8 727 | 725,2020-04-30,RU-ME,RUS,1281,9 728 | 726,2020-05-01,RU-ME,RUS,1440,10 729 | 727,2020-05-02,RU-ME,RUS,1612,11 730 | 728,2020-04-19,RU-MO,RUS,191,1 731 | 729,2020-04-20,RU-MO,RUS,234,1 732 | 730,2020-04-21,RU-MO,RUS,284,1 733 | 731,2020-04-22,RU-MO,RUS,346,2 734 | 732,2020-04-23,RU-MO,RUS,421,2 735 | 733,2020-04-24,RU-MO,RUS,513,3 736 | 734,2020-04-25,RU-MO,RUS,624,3 737 | 735,2020-04-26,RU-MO,RUS,758,4 738 | 736,2020-04-27,RU-MO,RUS,923,5 739 | 737,2020-04-28,RU-MO,RUS,1122,6 740 | 738,2020-04-29,RU-MO,RUS,1364,8 741 | 739,2020-04-30,RU-MO,RUS,1656,10 742 | 740,2020-05-01,RU-MO,RUS,2010,12 743 | 741,2020-05-02,RU-MO,RUS,2438,15 744 | 742,2020-04-19,RU-SA,RUS,44,0 745 | 743,2020-04-20,RU-SA,RUS,46,0 746 | 744,2020-04-21,RU-SA,RUS,49,0 747 | 745,2020-04-22,RU-SA,RUS,53,0 748 | 746,2020-04-23,RU-SA,RUS,56,0 749 | 747,2020-04-24,RU-SA,RUS,59,0 750 | 748,2020-04-25,RU-SA,RUS,63,0 751 | 749,2020-04-26,RU-SA,RUS,67,0 752 | 750,2020-04-27,RU-SA,RUS,71,0 753 | 751,2020-04-28,RU-SA,RUS,76,0 754 | 752,2020-04-29,RU-SA,RUS,80,0 755 | 753,2020-04-30,RU-SA,RUS,84,0 756 | 754,2020-05-01,RU-SA,RUS,90,0 757 | 755,2020-05-02,RU-SA,RUS,95,0 758 | 756,2020-04-19,RU-SE,RUS,96,3 759 | 757,2020-04-20,RU-SE,RUS,107,3 760 | 758,2020-04-21,RU-SE,RUS,119,3 761 | 759,2020-04-22,RU-SE,RUS,131,5 762 | 760,2020-04-23,RU-SE,RUS,144,5 763 | 761,2020-04-24,RU-SE,RUS,156,6 764 | 762,2020-04-25,RU-SE,RUS,169,6 765 | 763,2020-04-26,RU-SE,RUS,183,7 766 | 764,2020-04-27,RU-SE,RUS,196,8 767 | 765,2020-04-28,RU-SE,RUS,209,9 768 | 766,2020-04-29,RU-SE,RUS,222,9 769 | 767,2020-04-30,RU-SE,RUS,235,11 770 | 768,2020-05-01,RU-SE,RUS,248,11 771 | 769,2020-05-02,RU-SE,RUS,260,11 772 | 770,2020-04-19,RU-TA,RUS,190,0 773 | 771,2020-04-20,RU-TA,RUS,216,0 774 | 772,2020-04-21,RU-TA,RUS,242,0 775 | 773,2020-04-22,RU-TA,RUS,272,0 776 | 774,2020-04-23,RU-TA,RUS,305,0 777 | 775,2020-04-24,RU-TA,RUS,342,0 778 | 776,2020-04-25,RU-TA,RUS,383,0 779 | 777,2020-04-26,RU-TA,RUS,429,0 780 | 778,2020-04-27,RU-TA,RUS,479,0 781 | 779,2020-04-28,RU-TA,RUS,533,0 782 | 780,2020-04-29,RU-TA,RUS,592,0 783 | 781,2020-04-30,RU-TA,RUS,658,0 784 | 782,2020-05-01,RU-TA,RUS,729,0 785 | 783,2020-05-02,RU-TA,RUS,806,0 786 | 784,2020-04-19,RU-TY,RUS,9,0 787 | 785,2020-04-20,RU-TY,RUS,10,0 788 | 786,2020-04-21,RU-TY,RUS,11,0 789 | 787,2020-04-22,RU-TY,RUS,13,0 790 | 788,2020-04-23,RU-TY,RUS,14,0 791 | 789,2020-04-24,RU-TY,RUS,15,0 792 | 790,2020-04-25,RU-TY,RUS,18,0 793 | 791,2020-04-26,RU-TY,RUS,20,0 794 | 792,2020-04-27,RU-TY,RUS,21,0 795 | 793,2020-04-28,RU-TY,RUS,23,0 796 | 794,2020-04-29,RU-TY,RUS,25,0 797 | 795,2020-04-30,RU-TY,RUS,28,0 798 | 796,2020-05-01,RU-TY,RUS,30,0 799 | 797,2020-05-02,RU-TY,RUS,33,0 800 | 798,2020-04-19,RU-KK,RUS,47,0 801 | 799,2020-04-20,RU-KK,RUS,56,0 802 | 800,2020-04-21,RU-KK,RUS,64,0 803 | 801,2020-04-22,RU-KK,RUS,76,0 804 | 802,2020-04-23,RU-KK,RUS,87,0 805 | 803,2020-04-24,RU-KK,RUS,102,0 806 | 804,2020-04-25,RU-KK,RUS,118,0 807 | 805,2020-04-26,RU-KK,RUS,137,0 808 | 806,2020-04-27,RU-KK,RUS,159,0 809 | 807,2020-04-28,RU-KK,RUS,184,0 810 | 808,2020-04-29,RU-KK,RUS,213,0 811 | 809,2020-04-30,RU-KK,RUS,244,0 812 | 810,2020-05-01,RU-KK,RUS,280,0 813 | 811,2020-05-02,RU-KK,RUS,322,0 814 | 812,2020-04-19,RU-CU,RUS,205,1 815 | 813,2020-04-20,RU-CU,RUS,253,1 816 | 814,2020-04-21,RU-CU,RUS,312,1 817 | 815,2020-04-22,RU-CU,RUS,385,2 818 | 816,2020-04-23,RU-CU,RUS,475,2 819 | 817,2020-04-24,RU-CU,RUS,586,3 820 | 818,2020-04-25,RU-CU,RUS,721,4 821 | 819,2020-04-26,RU-CU,RUS,890,5 822 | 820,2020-04-27,RU-CU,RUS,1097,6 823 | 821,2020-04-28,RU-CU,RUS,1351,7 824 | 822,2020-04-29,RU-CU,RUS,1659,9 825 | 823,2020-04-30,RU-CU,RUS,2040,11 826 | 824,2020-05-01,RU-CU,RUS,2505,14 827 | 825,2020-05-02,RU-CU,RUS,3074,17 828 | 826,2020-04-19,RU-ROS,RUS,262,0 829 | 827,2020-04-20,RU-ROS,RUS,327,0 830 | 828,2020-04-21,RU-ROS,RUS,410,0 831 | 829,2020-04-22,RU-ROS,RUS,509,0 832 | 830,2020-04-23,RU-ROS,RUS,632,0 833 | 831,2020-04-24,RU-ROS,RUS,787,0 834 | 832,2020-04-25,RU-ROS,RUS,981,0 835 | 833,2020-04-26,RU-ROS,RUS,1221,0 836 | 834,2020-04-27,RU-ROS,RUS,1514,0 837 | 835,2020-04-28,RU-ROS,RUS,1880,0 838 | 836,2020-04-29,RU-ROS,RUS,2334,0 839 | 837,2020-04-30,RU-ROS,RUS,2894,0 840 | 838,2020-05-01,RU-ROS,RUS,3580,0 841 | 839,2020-05-02,RU-ROS,RUS,4422,0 842 | 840,2020-04-19,RU-RYA,RUS,285,0 843 | 841,2020-04-20,RU-RYA,RUS,346,0 844 | 842,2020-04-21,RU-RYA,RUS,421,0 845 | 843,2020-04-22,RU-RYA,RUS,514,0 846 | 844,2020-04-23,RU-RYA,RUS,625,0 847 | 845,2020-04-24,RU-RYA,RUS,760,0 848 | 846,2020-04-25,RU-RYA,RUS,924,0 849 | 847,2020-04-26,RU-RYA,RUS,1124,0 850 | 848,2020-04-27,RU-RYA,RUS,1367,0 851 | 849,2020-04-28,RU-RYA,RUS,1661,0 852 | 850,2020-04-29,RU-RYA,RUS,2015,0 853 | 851,2020-04-30,RU-RYA,RUS,2443,0 854 | 852,2020-05-01,RU-RYA,RUS,2959,0 855 | 853,2020-05-02,RU-RYA,RUS,3581,0 856 | 854,2020-04-19,RU-SAM,RUS,60,0 857 | 855,2020-04-20,RU-SAM,RUS,65,0 858 | 856,2020-04-21,RU-SAM,RUS,69,0 859 | 857,2020-04-22,RU-SAM,RUS,76,0 860 | 858,2020-04-23,RU-SAM,RUS,82,0 861 | 859,2020-04-24,RU-SAM,RUS,90,0 862 | 860,2020-04-25,RU-SAM,RUS,98,0 863 | 861,2020-04-26,RU-SAM,RUS,107,0 864 | 862,2020-04-27,RU-SAM,RUS,116,0 865 | 863,2020-04-28,RU-SAM,RUS,126,0 866 | 864,2020-04-29,RU-SAM,RUS,136,0 867 | 865,2020-04-30,RU-SAM,RUS,147,0 868 | 866,2020-05-01,RU-SAM,RUS,157,0 869 | 867,2020-05-02,RU-SAM,RUS,168,0 870 | 868,2020-04-19,RU-SPE,RUS,1753,9 871 | 869,2020-04-20,RU-SPE,RUS,1984,11 872 | 870,2020-04-21,RU-SPE,RUS,2244,12 873 | 871,2020-04-22,RU-SPE,RUS,2535,14 874 | 872,2020-04-23,RU-SPE,RUS,2857,16 875 | 873,2020-04-24,RU-SPE,RUS,3211,18 876 | 874,2020-04-25,RU-SPE,RUS,3594,21 877 | 875,2020-04-26,RU-SPE,RUS,4002,24 878 | 876,2020-04-27,RU-SPE,RUS,4437,27 879 | 877,2020-04-28,RU-SPE,RUS,4898,31 880 | 878,2020-04-29,RU-SPE,RUS,5382,35 881 | 879,2020-04-30,RU-SPE,RUS,5888,40 882 | 880,2020-05-01,RU-SPE,RUS,6409,45 883 | 881,2020-05-02,RU-SPE,RUS,6939,51 884 | 882,2020-04-19,RU-SAR,RUS,109,0 885 | 883,2020-04-20,RU-SAR,RUS,124,0 886 | 884,2020-04-21,RU-SAR,RUS,134,0 887 | 885,2020-04-22,RU-SAR,RUS,149,0 888 | 886,2020-04-23,RU-SAR,RUS,166,0 889 | 887,2020-04-24,RU-SAR,RUS,180,0 890 | 888,2020-04-25,RU-SAR,RUS,198,0 891 | 889,2020-04-26,RU-SAR,RUS,217,0 892 | 890,2020-04-27,RU-SAR,RUS,234,0 893 | 891,2020-04-28,RU-SAR,RUS,254,0 894 | 892,2020-04-29,RU-SAR,RUS,274,0 895 | 893,2020-04-30,RU-SAR,RUS,294,0 896 | 894,2020-05-01,RU-SAR,RUS,318,0 897 | 895,2020-05-02,RU-SAR,RUS,340,0 898 | 896,2020-04-19,RU-SAK,RUS,20,0 899 | 897,2020-04-20,RU-SAK,RUS,21,0 900 | 898,2020-04-21,RU-SAK,RUS,23,0 901 | 899,2020-04-22,RU-SAK,RUS,24,0 902 | 900,2020-04-23,RU-SAK,RUS,26,0 903 | 901,2020-04-24,RU-SAK,RUS,28,0 904 | 902,2020-04-25,RU-SAK,RUS,30,0 905 | 903,2020-04-26,RU-SAK,RUS,32,0 906 | 904,2020-04-27,RU-SAK,RUS,34,0 907 | 905,2020-04-28,RU-SAK,RUS,38,0 908 | 906,2020-04-29,RU-SAK,RUS,40,0 909 | 907,2020-04-30,RU-SAK,RUS,43,0 910 | 908,2020-05-01,RU-SAK,RUS,46,0 911 | 909,2020-05-02,RU-SAK,RUS,49,0 912 | 910,2020-04-19,RU-SVE,RUS,142,0 913 | 911,2020-04-20,RU-SVE,RUS,151,0 914 | 912,2020-04-21,RU-SVE,RUS,159,0 915 | 913,2020-04-22,RU-SVE,RUS,166,0 916 | 914,2020-04-23,RU-SVE,RUS,171,0 917 | 915,2020-04-24,RU-SVE,RUS,175,0 918 | 916,2020-04-25,RU-SVE,RUS,181,0 919 | 917,2020-04-26,RU-SVE,RUS,185,1 920 | 918,2020-04-27,RU-SVE,RUS,189,1 921 | 919,2020-04-28,RU-SVE,RUS,193,1 922 | 920,2020-04-29,RU-SVE,RUS,198,1 923 | 921,2020-04-30,RU-SVE,RUS,201,1 924 | 922,2020-05-01,RU-SVE,RUS,205,1 925 | 923,2020-05-02,RU-SVE,RUS,208,1 926 | 924,2020-04-19,UA-40,RUS,11,0 927 | 925,2020-04-20,UA-40,RUS,11,0 928 | 926,2020-04-21,UA-40,RUS,12,0 929 | 927,2020-04-22,UA-40,RUS,12,0 930 | 928,2020-04-23,UA-40,RUS,13,0 931 | 929,2020-04-24,UA-40,RUS,13,0 932 | 930,2020-04-25,UA-40,RUS,14,0 933 | 931,2020-04-26,UA-40,RUS,14,0 934 | 932,2020-04-27,UA-40,RUS,15,0 935 | 933,2020-04-28,UA-40,RUS,16,0 936 | 934,2020-04-29,UA-40,RUS,16,0 937 | 935,2020-04-30,UA-40,RUS,18,0 938 | 936,2020-05-01,UA-40,RUS,19,0 939 | 937,2020-05-02,UA-40,RUS,20,0 940 | 938,2020-04-19,RU-SMO,RUS,191,2 941 | 939,2020-04-20,RU-SMO,RUS,242,3 942 | 940,2020-04-21,RU-SMO,RUS,307,4 943 | 941,2020-04-22,RU-SMO,RUS,389,5 944 | 942,2020-04-23,RU-SMO,RUS,492,7 945 | 943,2020-04-24,RU-SMO,RUS,624,8 946 | 944,2020-04-25,RU-SMO,RUS,790,11 947 | 945,2020-04-26,RU-SMO,RUS,999,14 948 | 946,2020-04-27,RU-SMO,RUS,1263,18 949 | 947,2020-04-28,RU-SMO,RUS,1597,22 950 | 948,2020-04-29,RU-SMO,RUS,2019,29 951 | 949,2020-04-30,RU-SMO,RUS,2548,36 952 | 950,2020-05-01,RU-SMO,RUS,3210,46 953 | 951,2020-05-02,RU-SMO,RUS,4041,58 954 | 952,2020-04-19,RU-STA,RUS,239,3 955 | 953,2020-04-20,RU-STA,RUS,278,3 956 | 954,2020-04-21,RU-STA,RUS,323,4 957 | 955,2020-04-22,RU-STA,RUS,373,5 958 | 956,2020-04-23,RU-STA,RUS,429,6 959 | 957,2020-04-24,RU-STA,RUS,492,7 960 | 958,2020-04-25,RU-STA,RUS,564,8 961 | 959,2020-04-26,RU-STA,RUS,647,9 962 | 960,2020-04-27,RU-STA,RUS,738,11 963 | 961,2020-04-28,RU-STA,RUS,839,13 964 | 962,2020-04-29,RU-STA,RUS,954,15 965 | 963,2020-04-30,RU-STA,RUS,1082,17 966 | 964,2020-05-01,RU-STA,RUS,1225,20 967 | 965,2020-05-02,RU-STA,RUS,1382,23 968 | 966,2020-04-19,RU-TAM,RUS,183,0 969 | 967,2020-04-20,RU-TAM,RUS,217,0 970 | 968,2020-04-21,RU-TAM,RUS,255,0 971 | 969,2020-04-22,RU-TAM,RUS,299,0 972 | 970,2020-04-23,RU-TAM,RUS,352,0 973 | 971,2020-04-24,RU-TAM,RUS,415,0 974 | 972,2020-04-25,RU-TAM,RUS,488,0 975 | 973,2020-04-26,RU-TAM,RUS,574,0 976 | 974,2020-04-27,RU-TAM,RUS,676,0 977 | 975,2020-04-28,RU-TAM,RUS,793,0 978 | 976,2020-04-29,RU-TAM,RUS,931,0 979 | 977,2020-04-30,RU-TAM,RUS,1093,0 980 | 978,2020-05-01,RU-TAM,RUS,1283,0 981 | 979,2020-05-02,RU-TAM,RUS,1505,0 982 | 980,2020-04-19,RU-TVE,RUS,228,0 983 | 981,2020-04-20,RU-TVE,RUS,271,0 984 | 982,2020-04-21,RU-TVE,RUS,322,0 985 | 983,2020-04-22,RU-TVE,RUS,381,0 986 | 984,2020-04-23,RU-TVE,RUS,452,0 987 | 985,2020-04-24,RU-TVE,RUS,537,0 988 | 986,2020-04-25,RU-TVE,RUS,638,0 989 | 987,2020-04-26,RU-TVE,RUS,756,0 990 | 988,2020-04-27,RU-TVE,RUS,896,0 991 | 989,2020-04-28,RU-TVE,RUS,1062,0 992 | 990,2020-04-29,RU-TVE,RUS,1258,0 993 | 991,2020-04-30,RU-TVE,RUS,1490,0 994 | 992,2020-05-01,RU-TVE,RUS,1763,0 995 | 993,2020-05-02,RU-TVE,RUS,2085,0 996 | 994,2020-04-19,RU-TOM,RUS,23,0 997 | 995,2020-04-20,RU-TOM,RUS,26,0 998 | 996,2020-04-21,RU-TOM,RUS,28,0 999 | 997,2020-04-22,RU-TOM,RUS,31,0 1000 | 998,2020-04-23,RU-TOM,RUS,36,0 1001 | 999,2020-04-24,RU-TOM,RUS,40,0 1002 | 1000,2020-04-25,RU-TOM,RUS,44,0 1003 | 1001,2020-04-26,RU-TOM,RUS,48,0 1004 | 1002,2020-04-27,RU-TOM,RUS,53,0 1005 | 1003,2020-04-28,RU-TOM,RUS,58,0 1006 | 1004,2020-04-29,RU-TOM,RUS,63,0 1007 | 1005,2020-04-30,RU-TOM,RUS,69,0 1008 | 1006,2020-05-01,RU-TOM,RUS,76,0 1009 | 1007,2020-05-02,RU-TOM,RUS,83,0 1010 | 1008,2020-04-19,RU-TUL,RUS,265,0 1011 | 1009,2020-04-20,RU-TUL,RUS,306,0 1012 | 1010,2020-04-21,RU-TUL,RUS,352,0 1013 | 1011,2020-04-22,RU-TUL,RUS,405,0 1014 | 1012,2020-04-23,RU-TUL,RUS,468,0 1015 | 1013,2020-04-24,RU-TUL,RUS,540,0 1016 | 1014,2020-04-25,RU-TUL,RUS,623,0 1017 | 1015,2020-04-26,RU-TUL,RUS,719,0 1018 | 1016,2020-04-27,RU-TUL,RUS,829,0 1019 | 1017,2020-04-28,RU-TUL,RUS,956,0 1020 | 1018,2020-04-29,RU-TUL,RUS,1101,0 1021 | 1019,2020-04-30,RU-TUL,RUS,1268,0 1022 | 1020,2020-05-01,RU-TUL,RUS,1459,0 1023 | 1021,2020-05-02,RU-TUL,RUS,1679,0 1024 | 1022,2020-04-19,RU-TYU,RUS,184,1 1025 | 1023,2020-04-20,RU-TYU,RUS,219,2 1026 | 1024,2020-04-21,RU-TYU,RUS,260,2 1027 | 1025,2020-04-22,RU-TYU,RUS,308,3 1028 | 1026,2020-04-23,RU-TYU,RUS,362,3 1029 | 1027,2020-04-24,RU-TYU,RUS,425,4 1030 | 1028,2020-04-25,RU-TYU,RUS,498,5 1031 | 1029,2020-04-26,RU-TYU,RUS,585,6 1032 | 1030,2020-04-27,RU-TYU,RUS,690,7 1033 | 1031,2020-04-28,RU-TYU,RUS,815,8 1034 | 1032,2020-04-29,RU-TYU,RUS,960,10 1035 | 1033,2020-04-30,RU-TYU,RUS,1127,12 1036 | 1034,2020-05-01,RU-TYU,RUS,1322,14 1037 | 1035,2020-05-02,RU-TYU,RUS,1550,17 1038 | 1036,2020-04-19,RU-UD,RUS,61,1 1039 | 1037,2020-04-20,RU-UD,RUS,69,2 1040 | 1038,2020-04-21,RU-UD,RUS,80,2 1041 | 1039,2020-04-22,RU-UD,RUS,93,2 1042 | 1040,2020-04-23,RU-UD,RUS,107,3 1043 | 1041,2020-04-24,RU-UD,RUS,122,3 1044 | 1042,2020-04-25,RU-UD,RUS,139,4 1045 | 1043,2020-04-26,RU-UD,RUS,160,4 1046 | 1044,2020-04-27,RU-UD,RUS,183,5 1047 | 1045,2020-04-28,RU-UD,RUS,209,6 1048 | 1046,2020-04-29,RU-UD,RUS,239,7 1049 | 1047,2020-04-30,RU-UD,RUS,274,8 1050 | 1048,2020-05-01,RU-UD,RUS,313,9 1051 | 1049,2020-05-02,RU-UD,RUS,358,11 1052 | 1050,2020-04-19,RU-ULY,RUS,210,1 1053 | 1051,2020-04-20,RU-ULY,RUS,260,2 1054 | 1052,2020-04-21,RU-ULY,RUS,322,2 1055 | 1053,2020-04-22,RU-ULY,RUS,397,3 1056 | 1054,2020-04-23,RU-ULY,RUS,490,4 1057 | 1055,2020-04-24,RU-ULY,RUS,607,4 1058 | 1056,2020-04-25,RU-ULY,RUS,751,6 1059 | 1057,2020-04-26,RU-ULY,RUS,927,7 1060 | 1058,2020-04-27,RU-ULY,RUS,1143,9 1061 | 1059,2020-04-28,RU-ULY,RUS,1408,11 1062 | 1060,2020-04-29,RU-ULY,RUS,1737,14 1063 | 1061,2020-04-30,RU-ULY,RUS,2141,17 1064 | 1062,2020-05-01,RU-ULY,RUS,2635,21 1065 | 1063,2020-05-02,RU-ULY,RUS,3235,27 1066 | 1064,2020-04-19,RU-KHA,RUS,144,4 1067 | 1065,2020-04-20,RU-KHA,RUS,166,5 1068 | 1066,2020-04-21,RU-KHA,RUS,192,6 1069 | 1067,2020-04-22,RU-KHA,RUS,222,6 1070 | 1068,2020-04-23,RU-KHA,RUS,256,7 1071 | 1069,2020-04-24,RU-KHA,RUS,295,9 1072 | 1070,2020-04-25,RU-KHA,RUS,340,11 1073 | 1071,2020-04-26,RU-KHA,RUS,391,12 1074 | 1072,2020-04-27,RU-KHA,RUS,450,14 1075 | 1073,2020-04-28,RU-KHA,RUS,519,16 1076 | 1074,2020-04-29,RU-KHA,RUS,597,19 1077 | 1075,2020-04-30,RU-KHA,RUS,686,22 1078 | 1076,2020-05-01,RU-KHA,RUS,789,26 1079 | 1077,2020-05-02,RU-KHA,RUS,906,30 1080 | 1078,2020-04-19,RU-KHM,RUS,179,0 1081 | 1079,2020-04-20,RU-KHM,RUS,209,0 1082 | 1080,2020-04-21,RU-KHM,RUS,244,0 1083 | 1081,2020-04-22,RU-KHM,RUS,285,0 1084 | 1082,2020-04-23,RU-KHM,RUS,329,0 1085 | 1083,2020-04-24,RU-KHM,RUS,380,0 1086 | 1084,2020-04-25,RU-KHM,RUS,438,0 1087 | 1085,2020-04-26,RU-KHM,RUS,505,0 1088 | 1086,2020-04-27,RU-KHM,RUS,579,0 1089 | 1087,2020-04-28,RU-KHM,RUS,663,0 1090 | 1088,2020-04-29,RU-KHM,RUS,755,0 1091 | 1089,2020-04-30,RU-KHM,RUS,859,0 1092 | 1090,2020-05-01,RU-KHM,RUS,976,0 1093 | 1091,2020-05-02,RU-KHM,RUS,1105,0 1094 | 1092,2020-04-19,RU-CHE,RUS,81,0 1095 | 1093,2020-04-20,RU-CHE,RUS,92,0 1096 | 1094,2020-04-21,RU-CHE,RUS,100,0 1097 | 1095,2020-04-22,RU-CHE,RUS,111,0 1098 | 1096,2020-04-23,RU-CHE,RUS,121,0 1099 | 1097,2020-04-24,RU-CHE,RUS,135,0 1100 | 1098,2020-04-25,RU-CHE,RUS,151,0 1101 | 1099,2020-04-26,RU-CHE,RUS,167,0 1102 | 1100,2020-04-27,RU-CHE,RUS,183,0 1103 | 1101,2020-04-28,RU-CHE,RUS,199,0 1104 | 1102,2020-04-29,RU-CHE,RUS,217,0 1105 | 1103,2020-04-30,RU-CHE,RUS,237,0 1106 | 1104,2020-05-01,RU-CHE,RUS,259,0 1107 | 1105,2020-05-02,RU-CHE,RUS,281,0 1108 | 1106,2020-04-19,RU-CE,RUS,195,8 1109 | 1107,2020-04-20,RU-CE,RUS,235,9 1110 | 1108,2020-04-21,RU-CE,RUS,280,12 1111 | 1109,2020-04-22,RU-CE,RUS,334,15 1112 | 1110,2020-04-23,RU-CE,RUS,397,18 1113 | 1111,2020-04-24,RU-CE,RUS,471,21 1114 | 1112,2020-04-25,RU-CE,RUS,556,26 1115 | 1113,2020-04-26,RU-CE,RUS,654,32 1116 | 1114,2020-04-27,RU-CE,RUS,767,38 1117 | 1115,2020-04-28,RU-CE,RUS,896,45 1118 | 1116,2020-04-29,RU-CE,RUS,1044,53 1119 | 1117,2020-04-30,RU-CE,RUS,1210,64 1120 | 1118,2020-05-01,RU-CE,RUS,1399,76 1121 | 1119,2020-05-02,RU-CE,RUS,1611,89 1122 | 1120,2020-04-19,RU-YAN,RUS,104,1 1123 | 1121,2020-04-20,RU-YAN,RUS,107,1 1124 | 1122,2020-04-21,RU-YAN,RUS,108,1 1125 | 1123,2020-04-22,RU-YAN,RUS,109,1 1126 | 1124,2020-04-23,RU-YAN,RUS,110,2 1127 | 1125,2020-04-24,RU-YAN,RUS,110,1 1128 | 1126,2020-04-25,RU-YAN,RUS,111,0 1129 | 1127,2020-04-26,RU-YAN,RUS,111,1 1130 | 1128,2020-04-27,RU-YAN,RUS,111,1 1131 | 1129,2020-04-28,RU-YAN,RUS,111,1 1132 | 1130,2020-04-29,RU-YAN,RUS,111,1 1133 | 1131,2020-04-30,RU-YAN,RUS,112,1 1134 | 1132,2020-05-01,RU-YAN,RUS,112,1 1135 | 1133,2020-05-02,RU-YAN,RUS,112,1 1136 | 1134,2020-04-19,RU-YAR,RUS,110,0 1137 | 1135,2020-04-20,RU-YAR,RUS,131,0 1138 | 1136,2020-04-21,RU-YAR,RUS,157,0 1139 | 1137,2020-04-22,RU-YAR,RUS,190,0 1140 | 1138,2020-04-23,RU-YAR,RUS,231,0 1141 | 1139,2020-04-24,RU-YAR,RUS,278,0 1142 | 1140,2020-04-25,RU-YAR,RUS,334,0 1143 | 1141,2020-04-26,RU-YAR,RUS,402,0 1144 | 1142,2020-04-27,RU-YAR,RUS,483,0 1145 | 1143,2020-04-28,RU-YAR,RUS,581,0 1146 | 1144,2020-04-29,RU-YAR,RUS,700,0 1147 | 1145,2020-04-30,RU-YAR,RUS,841,0 1148 | 1146,2020-05-01,RU-YAR,RUS,1009,0 1149 | 1147,2020-05-02,RU-YAR,RUS,1208,0 1150 | --------------------------------------------------------------------------------