├── .gitignore ├── LICENSE ├── README.rst ├── data ├── directory_info ├── time_series_covid19_confirmed_global.csv ├── time_series_covid19_deaths_global.csv └── tweets_template.csv ├── logs └── directory_info ├── media ├── Twitter_trend.png └── causal_graph.png ├── requirements.txt └── source ├── causal_inference.ipynb ├── configs.py ├── data_utils.py ├── eval_utils.py ├── feature_extraction.py ├── inference.py ├── sentiment.py ├── train.py └── train_utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Python 2 | *.py[cod] 3 | 4 | # Packages 5 | *.egg 6 | *.egg-info 7 | 8 | # Notebook checkpoints 9 | .ipynb_checkpoints/ 10 | 11 | # Misc 12 | .DS_Store 13 | 14 | # logs 15 | *.json 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Oguzhan Gencoglu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Implementation of `Causal Modeling of Twitter Activity during COVID-19 `_ - Gencoglu O. & Gruber M. (2020) 2 | ==================== 3 | This repository provides the full implementation. Requires *python 3.7*. 4 | 5 | Main Idea 6 | ==================== 7 | **Distinguishing events that "correlate" with public attention and sentiment change from events that "cause" public attention and sentiment change during COVID-19 pandemic** 8 | 9 | .. raw:: html 10 | 11 | 12 | 13 | Quick Glance at Findings 14 | =================== 15 | 16 | .. image:: https://github.com/ogencoglu/causal_twitter_modeling_covid19/blob/master/media/causal_graph.png 17 | :width: 400 18 | 19 | Reproduction of Results 20 | ==================== 21 | 1 - Get the data 22 | -------------- 23 | See *directory_info* in the *data* directory for the expected files. Template of *tweets.csv* is provided. 24 | 25 | 2 - Run *causal_inference.ipynb* 26 | ------------------------------- 27 | See *source* directory. 28 | 29 | Relevant configurations are defined in *configs.py*, e.g.: 30 | 31 | --start_date '2020-01-22' 32 | --end_date '2020-03-18' 33 | --sentiment_model 'distilbert-base-uncased-finetuned-sst-2-english' 34 | --percentiles [75] 35 | 36 | *source* directory tree: 37 | 38 | .. code-block:: bash 39 | 40 | ├── causal_inference.ipynb 41 | ├── configs.py 42 | ├── data_utils.py 43 | ├── eval_utils.py 44 | ├── feature_extraction.py 45 | ├── inference.py 46 | ├── sentiment.py 47 | ├── train.py 48 | └── train_utils.py 49 | 50 | `Cite `_ 51 | ==================== 52 | 53 | .. code-block:: 54 | 55 | @article{gencoglu2020causal, 56 | title={Causal Modeling of Twitter Activity during COVID-19}, 57 | author={Gencoglu, Oguzhan and Gruber, Mathias}, 58 | journal={Computation}, 59 | volume={8}, 60 | number={4}, 61 | pages={85}, 62 | year={2020}, 63 | doi={10.3390/computation8040085} 64 | } 65 | 66 | or 67 | 68 | Gencoglu, Oguzhan, and Gruber, Mathias. "Causal Modeling of Twitter Activity during COVID-19." *Computation*. 2020; 8(4):85. 69 | -------------------------------------------------------------------------------- /data/directory_info: -------------------------------------------------------------------------------- 1 | Directory containing data. The following files would be needed for full reproducibility in the following structure: 2 | 3 | ├── directory_info 4 | ├── time_series_covid19_confirmed_global.csv 5 | ├── time_series_covid19_deaths_global.csv 6 | └── tweets.csv 7 | -------------------------------------------------------------------------------- /data/time_series_covid19_confirmed_global.csv: -------------------------------------------------------------------------------- 1 | Province/State,Country/Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,3/11/20,3/12/20,3/13/20,3/14/20,3/15/20,3/16/20,3/17/20,3/18/20,3/19/20,3/20/20,3/21/20,3/22/20,3/23/20,3/24/20,3/25/20,3/26/20,3/27/20 2 | ,Afghanistan,33.0,65.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,5,7,7,7,11,16,21,22,22,22,24,24,40,40,74,84,94,110 3 | ,Albania,41.1533,20.1683,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,10,12,23,33,38,42,51,55,59,64,70,76,89,104,123,146,174,186 4 | ,Algeria,28.0339,1.6596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,3,5,12,12,17,17,19,20,20,20,24,26,37,48,54,60,74,87,90,139,201,230,264,302,367,409 5 | ,Andorra,42.5063,1.5218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,39,39,53,75,88,113,133,164,188,224,267 6 | ,Angola,-11.2027,17.8739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3,4,4 7 | ,Antigua and Barbuda,17.0608,-61.7964,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,3,3,7,7 8 | ,Argentina,-38.4161,-63.6167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,8,12,12,17,19,19,31,34,45,56,68,79,97,128,158,266,301,387,387,502,589 9 | ,Armenia,40.0691,45.0382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,4,8,18,26,52,78,84,115,136,160,194,235,249,265,290,329 10 | Australian Capital Territory,Australia,-35.4735,149.0124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,6,9,19,32,39,39,53,62 11 | New South Wales,Australia,-33.8688,151.2093,0,0,0,0,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,13,22,22,26,28,38,48,55,65,65,92,112,134,171,210,267,307,353,436,669,669,818,1029,1219,1405 12 | Northern Territory,Australia,-12.4634,130.8456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,3,5,5,6,6,12,12 13 | Queensland,Australia,-28.0167,153.4,0,0,0,0,0,0,0,1,3,2,3,2,2,3,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,9,9,11,11,13,13,13,15,15,18,20,20,35,46,61,68,78,94,144,184,221,259,319,397,443,493,555 14 | South Australia,Australia,-34.9285,138.6007,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,5,5,7,7,7,7,7,9,9,16,19,20,29,29,37,42,50,67,100,134,170,170,235,257 15 | Tasmania,Australia,-41.4545,145.9707,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,3,3,5,5,6,7,7,10,10,10,16,22,28,28,36,47,47 16 | Victoria,Australia,-37.8136,144.9631,0,0,0,0,1,1,1,1,2,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,7,9,9,10,10,10,11,11,15,18,21,21,36,49,57,71,94,121,121,121,229,355,355,411,466,520,574 17 | Western Australia,Australia,-31.9505,115.8605,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3,3,3,3,4,6,9,9,14,17,17,28,31,35,52,64,90,120,140,175,175,231,231 18 | ,Austria,47.5162,14.5501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,3,9,14,18,21,29,41,55,79,104,131,182,246,302,504,655,860,1018,1332,1646,2013,2388,2814,3582,4474,5283,5588,6909,7657 19 | ,Azerbaijan,40.1431,47.5769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,6,6,9,9,9,11,11,11,15,15,23,28,28,28,44,44,53,65,72,87,93,122,165 20 | ,Bahamas,25.0343,-77.3963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,4,4,4,5,5,9,10 21 | ,Bahrain,26.0275,50.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,23,33,33,36,41,47,49,49,52,55,60,85,85,95,110,195,195,195,210,214,214,228,256,278,285,305,334,377,392,419,458,466 22 | ,Bangladesh,23.685,90.3563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,5,8,10,14,17,20,25,27,33,39,39,44,48 23 | ,Barbados,13.1939,-59.5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,5,5,6,14,17,18,18,18,24 24 | ,Belarus,53.7098,27.9534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,6,6,6,6,6,6,9,9,12,27,27,27,36,36,51,51,69,76,76,81,81,86,86,94 25 | ,Belgium,50.8333,4.0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,8,13,23,50,109,169,200,239,267,314,314,559,689,886,1058,1243,1486,1795,2257,2815,3401,3743,4269,4937,6235,7284 26 | ,Benin,9.3077,2.3158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,5,6,6,6,6 27 | ,Bhutan,27.5142,90.4336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3 28 | ,Bolivia,-16.2902,-63.5887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,10,10,11,11,12,12,15,19,24,27,29,32,43,61 29 | ,Bosnia and Herzegovina,43.9159,17.6791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,3,3,5,7,11,13,18,24,25,26,38,63,89,93,126,136,166,176,191,237 30 | ,Brazil,-14.235,-51.9253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,4,4,13,13,20,25,31,38,52,151,151,162,200,321,372,621,793,1021,1546,1924,2247,2554,2985,3417 31 | ,Brunei,4.5353,114.7277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,11,11,37,40,50,54,56,68,75,78,83,88,91,104,109,114,115 32 | ,Bulgaria,42.7339,25.4858,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,7,7,23,41,51,52,67,92,94,127,163,187,201,218,242,264,293 33 | ,Burkina Faso,12.2383,-1.5616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,3,15,15,20,33,40,64,75,99,114,146,152,180 34 | ,Cabo Verde,16.5388,-23.0418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,4,4,5 35 | ,Cambodia,11.55,104.9167,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,5,7,7,7,33,35,37,51,53,84,87,91,96,96,99 36 | ,Cameroon,3.848,11.5021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2,2,4,10,10,13,20,27,40,56,66,75,75,91 37 | Alberta,Canada,53.9333,-116.5765,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,7,7,19,19,29,29,39,56,74,97,119,146,195,259,301,359,358,486,542 38 | British Columbia,Canada,49.2827,-123.1207,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,4,4,4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,9,12,13,21,21,27,32,32,39,46,64,64,73,103,103,186,231,271,424,424,472,617,617,725,725 39 | Grand Princess,Canada,37.6489,-122.6655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,8,9,9,10,10,13,13,13,13,13,13 40 | Manitoba,Canada,53.7609,-98.8139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,7,8,15,17,17,18,20,20,21,35,36,39 41 | New Brunswick,Canada,46.5653,-66.4619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,6,8,11,11,11,17,17,17,18,18,33,45 42 | Newfoundland and Labrador,Canada,53.1355,-57.6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,4,6,9,24,35,35,82,102 43 | Nova Scotia,Canada,44.682,-63.7443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,7,12,14,15,21,28,41,51,68,73,90 44 | Ontario,Canada,51.2538,-85.3232,0,0,0,0,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,6,6,11,15,18,20,20,22,25,28,29,34,36,41,42,74,79,104,177,185,221,257,308,377,425,503,588,688,858,994 45 | Prince Edward Island,Canada,46.5107,-63.4168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,3,3,3,5,5,9 46 | Quebec,Canada,52.9399,-73.5491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,3,4,4,4,8,9,17,17,24,50,74,94,121,139,181,219,628,1013,1342,1632,2024 47 | Saskatchewan,Canada,52.9399,-106.4509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,7,7,8,16,20,26,52,66,72,72,95,95 48 | ,Central African Republic,6.6111,20.9394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,3,3,3,3,3,3,3,3 49 | ,Chad,15.4542,18.7322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,3,3,3,3 50 | ,Chile,-35.6751,-71.543,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,4,4,4,8,8,13,23,23,43,61,74,155,201,238,238,434,537,632,746,922,1142,1306,1610 51 | Anhui,China,31.8257,117.2264,1,9,15,39,60,70,106,152,200,237,297,340,408,480,530,591,665,733,779,830,860,889,910,934,950,962,973,982,986,987,988,989,989,989,989,989,989,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990,990 52 | Beijing,China,40.1824,116.4142,14,22,36,41,68,80,91,111,114,139,168,191,212,228,253,274,297,315,326,337,342,352,366,372,375,380,381,387,393,395,396,399,399,399,400,400,410,410,411,413,414,414,418,418,422,426,428,428,429,435,435,436,437,442,452,456,469,480,491,504,522,537,558,561,566,569 53 | Chongqing,China,30.0572,107.874,6,9,27,57,75,110,132,147,182,211,247,300,337,366,389,411,426,428,468,486,505,518,529,537,544,551,553,555,560,567,572,573,575,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,577,578,578,578,578,578 54 | Fujian,China,26.0789,117.9874,1,5,10,18,35,59,80,84,101,120,144,159,179,194,205,215,224,239,250,261,267,272,279,281,285,287,290,292,293,293,293,293,293,293,294,294,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,299,303,313,313,318,322,328,331 55 | Gansu,China,37.8099,101.0583,0,2,2,4,7,14,19,24,26,29,40,51,55,57,62,62,67,79,83,83,86,87,90,90,90,90,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,102,119,120,124,124,125,127,127,127,129,133,133,133,133,134,134,134,136,136,136,136,136,136 56 | Guangdong,China,23.3417,113.4244,26,32,53,78,111,151,207,277,354,436,535,632,725,813,895,970,1034,1095,1131,1159,1177,1219,1241,1261,1294,1316,1322,1328,1331,1332,1333,1339,1342,1345,1347,1347,1347,1348,1349,1349,1350,1350,1350,1351,1352,1352,1352,1352,1353,1356,1356,1356,1356,1360,1361,1364,1370,1378,1395,1400,1413,1415,1428,1433,1448,1456 57 | Guangxi,China,23.8298,108.7881,2,5,23,23,36,46,51,58,78,87,100,111,127,139,150,168,172,183,195,210,215,222,222,226,235,237,238,242,244,245,246,249,249,251,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,253,253,253,254,254,254,254,254,254,254,254 58 | Guizhou,China,26.8154,106.8748,1,3,3,4,5,7,9,9,12,29,29,38,46,58,64,71,81,89,99,109,127,133,135,140,143,144,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,147,146,146,146,146,146,146,146,146,146,146 59 | Hainan,China,19.1959,109.7453,4,5,8,19,22,33,40,43,46,52,62,64,72,80,99,106,117,124,131,138,144,157,157,159,162,162,163,163,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168 60 | Hebei,China,39.549,116.1306,1,1,2,8,13,18,33,48,65,82,96,104,113,126,135,157,172,195,206,218,239,251,265,283,291,300,301,306,306,307,308,309,311,311,311,312,317,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,319,319,319,319,319,319 61 | Heilongjiang,China,47.862,127.7615,0,2,4,9,15,21,33,38,44,59,80,95,121,155,190,227,277,295,307,331,360,378,395,419,425,445,457,464,470,476,479,479,480,480,480,480,480,480,480,480,480,480,480,481,481,481,481,481,481,482,482,482,482,482,482,482,482,483,484,484,484,484,484,484,484,484 62 | Henan,China,33.882,113.614,5,5,9,32,83,128,168,206,278,352,422,493,566,675,764,851,914,981,1033,1073,1105,1135,1169,1184,1212,1231,1246,1257,1262,1265,1267,1270,1271,1271,1271,1271,1272,1272,1272,1272,1272,1272,1272,1272,1272,1272,1272,1272,1272,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1274,1274,1274,1274,1275,1275 63 | Hong Kong,China,22.3,114.2,0,2,2,5,8,8,8,10,10,12,13,15,15,17,21,24,25,26,29,38,49,50,53,56,56,57,60,62,63,68,68,69,74,79,84,91,92,94,95,96,100,100,105,105,107,108,114,115,120,126,129,134,140,145,155,162,181,208,256,273,317,356,386,410,453,519 64 | Hubei,China,30.9756,112.2707,444,444,549,761,1058,1423,3554,3554,4903,5806,7153,11177,13522,16678,19665,22112,24953,27100,29631,31728,33366,33366,48206,54406,56249,58182,59989,61682,62031,62442,62662,64084,64084,64287,64786,65187,65596,65914,66337,66907,67103,67217,67332,67466,67592,67666,67707,67743,67760,67773,67781,67786,67790,67794,67798,67799,67800,67800,67800,67800,67800,67800,67801,67801,67801,67801 65 | Hunan,China,27.6104,111.7088,4,9,24,43,69,100,143,221,277,332,389,463,521,593,661,711,772,803,838,879,912,946,968,988,1001,1004,1006,1007,1008,1010,1011,1013,1016,1016,1016,1016,1017,1017,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018,1018 66 | Inner Mongolia,China,44.0935,113.9448,0,0,1,7,7,11,15,16,19,20,23,27,34,35,42,46,50,52,54,58,58,60,61,65,68,70,72,73,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,77,89,92 67 | Jiangsu,China,32.9711,119.455,1,5,9,18,33,47,70,99,129,168,202,236,271,308,341,373,408,439,468,492,515,543,570,593,604,617,626,629,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,633,633,636,638,640,641 68 | Jiangxi,China,27.614,115.7221,2,7,18,18,36,72,109,109,162,240,286,333,391,476,548,600,661,698,740,771,804,844,872,900,913,925,930,933,934,934,934,934,934,934,934,934,934,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,936,936,936,936,936,936 69 | Jilin,China,43.6661,126.1923,0,1,3,4,4,6,8,9,14,14,17,23,31,42,54,59,65,69,78,80,81,83,84,86,88,89,89,89,90,91,91,91,91,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,94,95,95 70 | Liaoning,China,41.2956,122.6085,2,3,4,17,21,27,34,39,41,48,64,70,74,81,89,94,99,105,107,108,111,116,117,119,119,121,121,121,121,121,121,121,121,121,121,121,121,121,121,122,122,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,126,126,127,127,127,127,128,128 71 | Macau,China,22.1667,113.55,1,2,2,2,5,6,7,7,7,7,7,8,8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,12,15,17,17,18,24,24,25,30,31,33 72 | Ningxia,China,37.2692,106.1655,1,1,2,3,4,7,11,12,17,21,26,28,31,34,34,40,43,45,45,49,53,58,64,67,70,70,70,70,71,71,71,71,71,71,71,71,72,72,73,73,74,74,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75 73 | Qinghai,China,35.7452,95.9956,0,0,0,1,1,6,6,6,8,8,9,11,13,15,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18 74 | Shaanxi,China,35.1917,108.8701,0,3,5,15,22,35,46,56,63,87,101,116,128,142,165,173,184,195,208,213,219,225,229,230,232,236,240,240,242,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,246,246,246,247,248,248,248,249,250,253,253 75 | Shandong,China,36.3427,118.1498,2,6,15,27,46,75,95,130,158,184,206,230,259,275,307,347,386,416,444,466,487,497,509,523,532,537,541,543,544,546,749,750,754,755,756,756,756,756,756,758,758,758,758,758,758,758,758,758,758,760,760,760,760,760,760,761,761,761,762,764,767,768,768,769,771,772 76 | Shanghai,China,31.202,121.4491,9,16,20,33,40,53,66,96,112,135,169,182,203,219,243,257,277,286,293,299,303,311,315,318,326,328,333,333,333,334,334,335,335,335,336,337,337,337,337,337,337,338,338,339,342,342,342,342,344,344,344,346,353,353,355,358,361,363,371,380,404,404,414,433,451,468 77 | Shanxi,China,37.5777,112.2922,1,1,1,6,9,13,27,27,35,39,47,66,74,81,81,96,104,115,119,119,124,126,126,127,128,129,130,131,131,132,132,132,132,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,134,134,134,135,135 78 | Sichuan,China,30.6171,102.7103,5,8,15,28,44,69,90,108,142,177,207,231,254,282,301,321,344,364,386,405,417,436,451,463,470,481,495,508,514,520,525,526,526,527,529,531,534,538,538,538,538,538,538,539,539,539,539,539,539,539,539,539,539,539,539,540,540,540,541,542,543,543,545,547,547,548 79 | Tianjin,China,39.3054,117.323,4,4,8,10,14,23,24,27,31,32,41,48,60,67,69,79,81,88,91,95,106,112,119,120,122,124,125,128,130,131,132,135,135,135,135,135,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,137,137,137,137,141,145,145,151,155 80 | Tibet,China,31.6927,88.0924,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 81 | Xinjiang,China,41.1129,85.2401,0,2,2,3,4,5,10,13,14,17,18,21,24,29,32,36,39,42,45,49,55,59,63,65,70,71,75,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76 82 | Yunnan,China,24.974,101.487,1,2,5,11,16,26,44,55,70,83,93,105,117,122,128,133,138,138,141,149,153,154,156,162,168,171,171,172,172,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,176,176,176,176,176,176,176,176,176,176,178,180 83 | Zhejiang,China,29.1832,120.0934,10,27,43,62,104,128,173,296,428,538,599,661,724,829,895,954,1006,1048,1075,1092,1117,1131,1145,1155,1162,1167,1171,1172,1174,1175,1203,1205,1205,1205,1205,1205,1205,1205,1205,1205,1206,1213,1213,1215,1215,1215,1215,1215,1215,1215,1215,1215,1227,1231,1231,1232,1232,1233,1234,1236,1238,1238,1240,1241,1243,1247 84 | ,Colombia,4.5709,-74.2973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,9,9,13,22,34,54,65,93,102,128,196,231,277,378,470,491,539 85 | ,Congo (Brazzaville),-4.0383,21.7587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,3,4,4,4,4,4 86 | ,Congo (Kinshasa),-4.0383,21.7587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,3,4,14,18,23,30,36,45,48,51,51 87 | ,Costa Rica,9.7489,-83.7534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,9,9,13,22,23,26,27,35,41,50,69,89,117,134,158,177,201,231,263 88 | ,Cote d'Ivoire,7.54,-5.5471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,5,6,9,9,14,14,25,73,80,96,101 89 | ,Croatia,45.1,15.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,5,6,7,7,9,10,10,11,12,12,12,14,19,19,32,38,49,57,65,81,105,128,206,254,315,382,442,495,586 90 | ,Diamond Princess,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,64,135,135,175,175,218,285,355,454,542,621,634,634,634,691,691,691,705,705,705,705,705,705,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,712,712,712,712,712,712,712,712,712,712 91 | ,Cuba,22.0,-80.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,4,4,4,5,7,11,16,21,35,40,48,57,67,80 92 | ,Cyprus,35.1264,33.4299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,6,6,14,26,26,33,46,49,67,67,84,95,116,124,132,146,162 93 | ,Czechia,49.8175,15.473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,5,8,12,18,19,31,31,41,91,94,141,189,253,298,396,464,694,833,995,1120,1236,1394,1654,1925,2279 94 | Faroe Islands,Denmark,61.8926,-6.9118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,3,9,11,18,47,58,72,80,92,115,118,122,132,140,144 95 | Greenland,Denmark,71.7069,-42.6043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,4,4,5,6,6,10 96 | ,Denmark,56.2639,9.5018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,4,4,6,10,10,23,23,35,90,262,442,615,801,827,864,914,977,1057,1151,1255,1326,1395,1450,1591,1724,1877,2046 97 | ,Djibouti,11.8251,42.5903,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,3,3,11,11,12 98 | ,Dominican Republic,18.7357,-70.1627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,5,5,5,5,5,5,11,11,11,21,21,34,72,112,202,245,312,392,488,581 99 | ,Ecuador,-1.8312,-78.1834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,7,10,13,13,13,14,15,15,17,17,17,28,28,37,58,111,199,367,506,789,981,1082,1173,1403,1595 100 | ,Egypt,26.0,30.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,15,15,49,55,59,60,67,80,109,110,150,196,196,256,285,294,327,366,402,456,495,536 101 | ,El Salvador,13.7942,-88.8965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,5,9,13,13 102 | ,Equatorial Guinea,1.5,10.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4,6,6,6,6,9,9,9,12,12 103 | ,Eritrea,15.1794,39.7823,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,6,6 104 | ,Estonia,58.5953,25.0136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,3,10,10,10,10,12,16,16,79,115,171,205,225,258,267,283,306,326,352,369,404,538,575 105 | ,Eswatini,-26.5225,31.4659,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,4,4,4,4,6,9 106 | ,Ethiopia,9.145,40.4897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,5,5,6,6,9,9,11,11,12,12,12,16 107 | ,Fiji,-17.7134,178.065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,4,5,5,5 108 | ,Finland,64.0,26.0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,6,6,6,6,12,15,15,23,30,40,59,59,155,225,244,277,321,336,400,450,523,626,700,792,880,958,1041 109 | French Guiana,France,3.9339,-53.1258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,7,11,11,11,11,15,18,18,20,23,28,28,28 110 | French Polynesia,France,-17.6797,149.4068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,6,11,15,18,18,25,25,30,30 111 | Guadeloupe,France,16.25,-61.5833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,6,18,27,33,45,53,58,62,62,73,73,73 112 | Mayotte,France,-12.8275,45.1662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,6,7,11,24,36,36,36,50 113 | New Caledonia,France,-20.9043,165.618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,4,8,10,14,14,15 114 | Reunion,France,-21.1351,55.2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,6,7,9,9,12,14,28,45,64,71,94,111,135,145 115 | Saint Barthelemy,France,17.9,-62.8333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,5 116 | St Martin,France,18.0708,-63.0501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,3,4,4,4,5,8,8,11,11,11 117 | Martinique,France,14.6415,-61.0242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,3,3,3,9,9,15,16,19,23,32,32,44,53,57,66,66,81 118 | ,France,46.2276,2.2137,0,0,2,3,3,3,4,5,5,5,6,6,6,6,6,6,6,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,14,18,38,57,100,130,191,204,285,377,653,949,1126,1209,1784,2281,2281,3661,4469,4499,6633,7652,9043,10871,12612,14282,16018,19856,22304,25233,29155,32964 119 | ,Gabon,-0.8037,11.6094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,3,4,5,5,6,6,7,7 120 | ,Gambia,13.4432,-15.3101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,3,3,3,3 121 | ,Georgia,42.3154,43.3569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,3,4,4,4,13,15,15,24,24,25,30,33,33,34,38,40,43,49,54,61,70,75,79,83 122 | ,Germany,51.0,9.0,0,0,0,0,0,1,4,4,4,5,8,10,12,12,12,12,13,13,14,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,27,46,48,79,130,159,196,262,482,670,799,1040,1176,1457,1908,2078,3675,4585,5795,7272,9257,12327,15320,19848,22213,24873,29056,32986,37323,43938,50871 123 | ,Ghana,7.9465,-1.0232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,7,7,11,16,19,23,27,53,93,132,137 124 | ,Greece,39.0742,21.8243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,4,7,7,7,9,31,45,46,73,73,89,99,99,190,228,331,331,387,418,418,495,530,624,695,743,821,892,966 125 | ,Guatemala,15.7835,-90.2308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,6,6,9,12,17,19,20,21,24,25,28 126 | ,Guinea,9.9456,-9.6966,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,4,4,4,4,8 127 | ,Guyana,5.0,-58.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4,4,7,7,7,7,7,19,20,5,5,5,5 128 | ,Haiti,18.9712,-72.2852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,6,7,8,8,8 129 | ,Holy See,41.9029,12.4534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4 130 | ,Honduras,15.2,-86.2419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,3,6,8,9,12,24,24,26,30,30,36,52,68 131 | ,Hungary,47.1625,19.5033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,4,7,9,9,13,13,19,30,32,39,50,58,73,85,103,131,167,187,226,261,300 132 | ,Iceland,64.9631,-19.0208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,6,11,26,34,43,50,50,58,69,85,103,134,156,171,180,220,250,330,409,473,568,588,648,737,802,890 133 | ,India,21.0,78.0,0,0,0,0,0,0,0,0,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,28,30,31,34,39,43,56,62,73,82,102,113,119,142,156,194,244,330,396,499,536,657,727,887 134 | ,Indonesia,-0.7893,113.9213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,4,4,6,19,27,34,34,69,96,117,134,172,227,311,369,450,514,579,686,790,893,1046 135 | ,Iran,32.0,53.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,18,28,43,61,95,139,245,388,593,978,1501,2336,2922,3513,4747,5823,6566,7161,8042,9000,10075,11364,12729,13938,14991,16169,17361,18407,19644,20610,21638,23049,24811,27017,29406,32332 136 | ,Iraq,33.0,44.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,7,7,13,19,26,32,35,35,40,54,60,60,71,71,71,101,110,116,124,154,164,192,208,214,233,266,316,346,382,458 137 | ,Ireland,53.1424,-7.6921,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,6,6,18,18,19,21,34,43,43,90,129,129,169,223,292,557,683,785,906,1125,1329,1564,1819,2121 138 | ,Israel,31.0,35.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,3,4,7,10,10,12,15,20,37,43,61,61,75,79,100,126,155,213,218,250,304,427,529,712,883,1071,1238,2369,2693,3035 139 | ,Italy,43.0,12.0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,20,62,155,229,322,453,655,888,1128,1694,2036,2502,3089,3858,4636,5883,7375,9172,10149,12462,12462,17660,21157,24747,27980,31506,35713,41035,47021,53578,59138,63927,69176,74386,80589,86498 140 | ,Jamaica,18.1096,-77.2975,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,8,10,10,12,13,15,16,16,19,19,21,26,26,26 141 | ,Japan,36.0,138.0,2,2,2,2,4,4,7,7,11,15,20,20,20,22,22,22,25,25,26,26,26,28,28,29,43,59,66,74,84,94,105,122,147,159,170,189,214,228,241,256,274,293,331,360,420,461,502,511,581,639,639,701,773,839,839,878,889,924,963,1007,1101,1128,1193,1307,1387,1468 142 | ,Jordan,31.24,36.51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,8,17,34,52,69,85,85,112,127,154,172,212,235 143 | ,Kazakhstan,48.0196,66.9237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,6,9,10,33,35,44,49,53,60,62,72,81,111,150 144 | ,Kenya,-0.0236,37.9062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,3,7,7,7,15,16,25,28,31,31 145 | ,"Korea, South",36.0,128.0,1,1,2,2,3,4,4,4,4,11,12,15,15,16,19,23,24,24,25,27,28,28,28,28,28,29,30,31,31,104,204,433,602,833,977,1261,1766,2337,3150,3736,4335,5186,5621,6088,6593,7041,7314,7478,7513,7755,7869,7979,8086,8162,8236,8320,8413,8565,8652,8799,8961,8961,9037,9137,9241,9332 146 | ,Kuwait,29.5,47.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,11,26,43,45,45,45,56,56,56,58,58,61,64,64,69,72,80,80,104,112,123,130,142,148,159,176,188,189,191,195,208,225 147 | ,Kyrgyzstan,41.2044,74.7661,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,6,14,14,16,42,44,44,58 148 | ,Latvia,56.8796,24.6032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,6,8,10,10,17,26,30,34,49,71,86,111,124,139,180,197,221,244,280 149 | ,Lebanon,33.8547,35.8623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,4,10,13,13,13,16,22,22,32,32,41,61,61,77,93,110,110,120,133,157,163,187,248,267,318,333,368,391 150 | ,Liberia,6.4281,-9.4295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3 151 | ,Liechtenstein,47.14,9.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,4,4,4,7,28,28,28,37,37,51,51,51,56,56 152 | ,Lithuania,55.1694,23.8813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,3,3,6,8,12,17,25,27,36,49,83,143,179,209,274,299,358 153 | ,Luxembourg,49.8153,6.1296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,3,3,5,7,19,34,51,59,77,140,203,335,484,670,798,875,1099,1333,1453,1605 154 | ,Madagascar,-18.7669,46.8691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,12,17,19,23,26 155 | ,Malaysia,2.5,112.5,0,0,0,3,4,4,4,7,8,8,8,8,8,10,12,12,12,16,16,18,18,18,19,19,22,22,22,22,22,22,22,22,22,22,22,22,23,23,25,29,29,36,50,50,83,93,99,117,129,149,149,197,238,428,566,673,790,900,1030,1183,1306,1518,1624,1796,2031,2161 156 | ,Maldives,3.2028,73.2207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,6,8,8,9,10,13,13,13,13,13,13,13,13,13,13,13,13,16 157 | ,Malta,35.9375,14.3754,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,5,6,6,12,18,21,30,38,38,53,64,73,90,107,110,129,134,139 158 | ,Mauritania,21.0079,10.9408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,3,3 159 | ,Mauritius,-20.2,57.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,12,14,28,36,42,48,81,94 160 | ,Mexico,23.6345,-102.5528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,5,5,5,5,5,6,6,7,7,7,8,12,12,26,41,53,82,93,118,164,203,251,316,367,405,475,585 161 | ,Moldova,47.4116,28.3699,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,6,12,23,23,30,30,49,66,80,94,109,125,149,177,199 162 | ,Monaco,43.7333,7.4167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,7,7,7,7,11,11,23,23,23,31,33,42 163 | ,Mongolia,46.8625,103.8467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,5,6,6,6,10,10,10,10,10,11,11 164 | ,Montenegro,42.5,19.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,14,14,21,27,47,52,69,82 165 | ,Morocco,31.7917,-7.0926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,3,5,6,7,17,28,29,38,49,63,77,96,115,143,170,225,275,345 166 | ,Namibia,-22.9576,18.4904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3,3,3,3,4,7,7,8,8 167 | ,Nepal,28.1667,84.25,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,4 168 | Aruba,Netherlands,12.5186,-70.0358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,3,4,4,5,5,9,9,12,17,28,33 169 | Curacao,Netherlands,12.1696,-68.99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,3,3,3,3,4,6,6,6,8 170 | Sint Maarten,Netherlands,18.0425,-63.0548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,3 171 | ,Netherlands,52.1326,5.2913,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,10,18,24,38,82,128,188,265,321,382,503,503,804,959,1135,1413,1705,2051,2460,2994,3631,4204,4749,5560,6412,7431,8603 172 | ,New Zealand,-40.9006,174.886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,3,3,4,5,5,5,5,5,5,5,6,8,8,12,20,28,39,52,102,102,155,205,283,368 173 | ,Nicaragua,12.8654,-85.2072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 174 | ,Niger,17.6078,8.0817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,7,10,10 175 | ,Nigeria,9.082,8.6753,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,8,8,12,22,30,40,44,51,65,70 176 | ,North Macedonia,41.6086,21.7453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,3,3,3,3,7,7,7,14,14,14,18,26,35,48,67,85,115,136,148,177,201,219 177 | ,Norway,60.472,8.4689,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,15,19,25,32,56,87,108,147,176,205,400,598,702,996,1090,1221,1333,1463,1550,1746,1914,2118,2385,2621,2863,3084,3369,3755 178 | ,Oman,21.0,57.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,4,4,6,6,6,12,15,16,16,16,16,16,18,18,18,19,19,22,22,24,39,48,48,52,55,66,84,99,109,131 179 | ,Pakistan,30.3753,69.3451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,4,4,4,5,5,5,6,6,6,6,16,19,20,28,31,53,136,236,299,454,501,730,776,875,972,1063,1201,1373 180 | ,Panama,8.538,-80.7821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,11,27,36,43,55,69,86,109,137,200,313,345,345,443,558,674 181 | ,Papua New Guinea,-6.315,143.9555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 182 | ,Paraguay,-23.4425,-58.4438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,5,5,6,6,6,8,9,11,11,13,18,22,22,27,37,41,52 183 | ,Peru,-9.19,-75.0152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,7,11,11,15,28,38,43,86,117,145,234,234,318,363,395,416,480,580,635 184 | ,Philippines,13.0,122.0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,6,10,20,33,49,52,64,111,140,142,187,202,217,230,307,380,462,552,636,707,803 185 | ,Poland,51.9194,19.1451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,5,11,16,22,31,49,68,103,119,177,238,251,355,425,536,634,749,901,1051,1221,1389 186 | ,Portugal,39.3999,-8.2245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,5,8,13,20,30,30,41,59,59,112,169,245,331,448,448,785,1020,1280,1600,2060,2362,2995,3544,4268 187 | ,Qatar,25.3548,51.1839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,7,8,8,8,8,15,18,24,262,262,320,337,401,439,439,452,460,470,481,494,501,526,537,549,562 188 | ,Romania,45.9432,24.9668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,3,3,4,6,9,9,15,15,25,45,49,89,123,131,158,184,260,277,308,367,433,576,794,906,1029,1292 189 | ,Russia,60.0,90.0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,4,13,13,17,17,20,20,28,45,59,63,90,114,147,199,253,306,367,438,495,658,840,1036 190 | ,Rwanda,-1.9403,29.8739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,7,8,8,17,17,19,36,40,41,50,54 191 | ,Saint Lucia,13.9094,-60.9789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,3,3,3,3,3 192 | ,Saint Vincent and the Grenadines,12.9843,-61.2872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 193 | ,San Marino,43.9424,12.4578,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,8,10,16,21,21,23,36,36,51,62,69,80,80,101,109,109,119,119,144,144,175,187,187,208,208,223 194 | ,Saudi Arabia,24.0,45.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,5,5,5,11,15,20,21,45,86,103,103,118,171,171,274,344,392,511,562,767,900,1012,1104 195 | ,Senegal,14.4974,-14.4524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,4,4,4,4,4,4,4,4,10,10,24,24,26,31,31,38,47,67,79,86,99,105,119 196 | ,Serbia,44.0165,21.0059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,5,12,19,35,46,48,55,65,83,103,135,171,222,249,303,384,384,457 197 | ,Seychelles,-4.6796,55.492,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,4,4,6,7,7,7,7,7,7,7,7 198 | ,Singapore,1.2833,103.8333,0,1,3,3,4,5,7,7,10,13,16,18,18,24,28,28,30,33,40,45,47,50,58,67,72,75,77,81,84,84,85,85,89,89,91,93,93,93,102,106,108,110,110,117,130,138,150,150,160,178,178,200,212,226,243,266,313,345,385,432,455,509,558,631,683,732 199 | ,Slovakia,48.669,19.699,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,7,10,16,32,44,54,63,72,105,123,137,178,185,186,204,216,226,269 200 | ,Slovenia,46.1512,14.9955,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,7,7,16,16,31,57,89,141,181,219,253,275,275,286,341,383,414,442,480,528,562,632 201 | ,Somalia,5.1521,46.1996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,3 202 | ,South Africa,-30.5595,22.9375,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,7,13,17,24,38,51,62,62,116,150,202,240,274,402,554,709,927,1170 203 | ,Spain,40.0,-4.0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,13,15,32,45,84,120,165,222,259,400,500,673,1073,1695,2277,2277,5232,6391,7798,9942,11748,13910,17963,20410,25374,28768,35136,39885,49515,57786,65719 204 | ,Sri Lanka,7.0,81.0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,6,10,18,28,44,51,60,73,77,82,97,102,102,106,106 205 | ,Sudan,12.8628,30.2176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3 206 | ,Suriname,3.9193,-56.0278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,4,4,5,5,7,8,8,8 207 | ,Sweden,63.0,16.0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,7,7,12,14,15,21,35,94,101,161,203,248,355,500,599,814,961,1022,1103,1190,1279,1439,1639,1763,1934,2046,2286,2526,2840,3069 208 | ,Switzerland,46.8182,8.2275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,8,8,18,27,42,56,90,114,214,268,337,374,491,652,652,1139,1359,2200,2200,2700,3028,4075,5294,6575,7474,8795,9877,10897,11811,12928 209 | ,Taiwan*,23.7,121.0,1,1,3,3,4,5,8,8,9,10,10,10,10,11,11,16,16,17,18,18,18,18,18,18,18,20,22,22,23,24,26,26,28,30,31,32,32,34,39,40,41,42,42,44,45,45,45,45,47,48,49,50,53,59,67,77,100,108,135,153,169,195,215,235,252,267 210 | ,Tanzania,-6.369,34.8888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,6,6,6,12,12,12,12,13,13 211 | ,Thailand,15.0,101.0,2,3,5,7,8,8,14,14,14,19,19,19,19,25,25,25,25,32,32,32,33,33,33,33,33,34,35,35,35,35,35,35,35,35,37,40,40,41,42,42,43,43,43,47,48,50,50,50,53,59,70,75,82,114,147,177,212,272,322,411,599,721,827,934,1045,1136 212 | ,Togo,8.6195,0.8248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,16,16,18,20,23,23,25 213 | ,Trinidad and Tobago,10.6918,-61.2225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,5,7,9,9,49,50,51,57,60,65,66 214 | ,Tunisia,34.0,9.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,5,7,7,16,18,18,20,24,29,39,54,60,75,89,114,173,197,227 215 | ,Turkey,38.9637,35.2433,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,5,6,18,47,98,192,359,670,1236,1529,1872,2433,3629,5698 216 | ,Uganda,1.0,32.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,14,14,23 217 | ,Ukraine,48.3794,31.1656,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,3,3,7,14,14,16,29,47,73,73,97,145,196,310 218 | ,United Arab Emirates,24.0,54.0,0,0,0,0,0,0,0,4,4,4,4,5,5,5,5,5,5,7,7,8,8,8,8,8,8,9,9,9,9,9,9,13,13,13,13,13,13,19,21,21,21,27,27,29,29,45,45,45,74,74,85,85,85,98,98,98,113,140,140,153,153,198,248,333,333,405 219 | Bermuda,United Kingdom,32.3078,-64.7505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,7,15,17 220 | Cayman Islands,United Kingdom,19.3133,-81.2546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,3,3,3,3,5,6,8,8,8 221 | Channel Islands,United Kingdom,49.3723,-2.3644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,3,6,6,6,11,14,32,32,36,36,46,66,88 222 | Gibraltar,United Kingdom,36.1408,-5.3536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,3,8,10,10,10,15,15,15,26,35,55 223 | Isle of Man,United Kingdom,54.2361,-4.5481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,13,23,23,25,29 224 | Montserrat,United Kingdom,16.7425,-62.1874,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,5,5 225 | ,United Kingdom,55.3781,-3.4360000000000004,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,3,3,3,8,8,9,9,9,9,9,9,9,9,9,9,9,9,13,13,13,15,20,23,36,40,51,85,115,163,206,273,321,382,456,456,798,1140,1140,1543,1950,2626,2689,3983,5018,5683,6650,8077,9529,11658,14543 226 | ,Uruguay,-32.5228,-55.7658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,8,29,50,79,94,110,158,162,162,189,217,238 227 | ,US,37.0902,-95.7129,1,1,2,2,5,5,5,5,5,7,8,8,11,11,11,11,11,11,11,11,12,12,13,13,13,13,13,13,13,13,15,15,15,51,51,57,58,60,68,74,98,118,149,217,262,402,518,583,959,1281,1663,2179,2727,3499,4632,6421,7783,13677,19100,25489,33276,43847,53740,65778,83836,101657 228 | ,Uzbekistan,41.3775,64.5853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,10,15,23,33,43,43,46,50,60,75,88 229 | ,Venezuela,6.4238,-66.5897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,10,17,33,36,42,42,70,70,77,84,91,107,107 230 | ,Vietnam,16.0,108.0,0,2,2,2,2,2,2,2,2,2,6,6,8,8,8,10,10,13,13,14,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,30,30,31,38,39,47,53,56,61,66,75,85,91,94,113,123,134,141,153,163 231 | ,Zambia,-15.4167,28.2833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,3,3,3,12,16,22 232 | ,Zimbabwe,-20.0,30.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,3,3,5 233 | Diamond Princess,Canada,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 234 | ,Dominica,15.415,-61.371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,7,11,11 235 | ,Grenada,12.1165,-61.679,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,7,7 236 | ,Mozambique,-18.665695,35.529562,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,5,7,7 237 | ,Syria,34.802075,38.99681500000001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,5,5,5 238 | ,Timor-Leste,-8.874217,125.727539,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 239 | ,Belize,13.1939,-59.5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2 240 | Recovered,Canada,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 241 | ,Laos,19.85627,102.495496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,6,6 242 | ,Libya,26.3351,17.228331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 243 | ,West Bank and Gaza,31.9522,35.2332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,7,16,16,19,26,30,30,31,35,38,38,39,41,44,47,48,52,59,59,59,84,91 244 | ,Guinea-Bissau,11.8037,-15.1804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2 245 | ,Mali,17.570692,-3.996166000000001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,11 246 | ,Saint Kitts and Nevis,17.357822,-62.782998,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2 247 | Northwest Territories,Canada,64.8255,-124.8457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 248 | Yukon,Canada,64.2823,-135.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3 249 | ,Kosovo,42.602636,20.902977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,86 250 | ,Burma,21.9162,95.956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8 251 | -------------------------------------------------------------------------------- /data/time_series_covid19_deaths_global.csv: -------------------------------------------------------------------------------- 1 | Province/State,Country/Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20,1/26/20,1/27/20,1/28/20,1/29/20,1/30/20,1/31/20,2/1/20,2/2/20,2/3/20,2/4/20,2/5/20,2/6/20,2/7/20,2/8/20,2/9/20,2/10/20,2/11/20,2/12/20,2/13/20,2/14/20,2/15/20,2/16/20,2/17/20,2/18/20,2/19/20,2/20/20,2/21/20,2/22/20,2/23/20,2/24/20,2/25/20,2/26/20,2/27/20,2/28/20,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,3/11/20,3/12/20,3/13/20,3/14/20,3/15/20,3/16/20,3/17/20,3/18/20,3/19/20,3/20/20,3/21/20,3/22/20,3/23/20,3/24/20,3/25/20,3/26/20,3/27/20 2 | ,Afghanistan,33.0,65.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,4,4 3 | ,Albania,41.1533,20.1683,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,4,5,5,6,8 4 | ,Algeria,28.0339,1.6596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,4,4,7,9,11,15,17,17,19,21,25,26 5 | ,Andorra,42.5063,1.5218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3 6 | ,Angola,-11.2027,17.8739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 7 | ,Antigua and Barbuda,17.0608,-61.7964,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 8 | ,Argentina,-38.4161,-63.6167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,3,3,4,4,4,6,8,9,13 9 | ,Armenia,40.0691,45.0382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 10 | Australian Capital Territory,Australia,-35.4735,149.0124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 11 | New South Wales,Australia,-33.8688,151.2093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,4,5,5,6,6,6,6,7,7,7,7 12 | Northern Territory,Australia,-12.4634,130.8456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 13 | Queensland,Australia,-28.0167,153.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 14 | South Australia,Australia,-34.9285,138.6007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15 | Tasmania,Australia,-41.4545,145.9707,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 16 | Victoria,Australia,-37.8136,144.9631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3 17 | Western Australia,Australia,-31.9505,115.8605,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2 18 | ,Austria,47.5162,14.5501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,4,6,6,8,16,21,28,30,49,58 19 | ,Azerbaijan,40.1431,47.5769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3 20 | ,Bahamas,25.0343,-77.3963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 21 | ,Bahrain,26.0275,50.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,3,4,4,4 22 | ,Bangladesh,23.685,90.3563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,5 23 | ,Barbados,13.1939,-59.5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 24 | ,Belarus,53.7098,27.9534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25 | ,Belgium,50.8333,4.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,4,4,5,10,14,21,37,67,75,88,122,178,220,289 26 | ,Benin,9.3077,2.3158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27 | ,Bhutan,27.5142,90.4336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 28 | ,Bolivia,-16.2902,-63.5887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 29 | ,Bosnia and Herzegovina,43.9159,17.6791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,3,4 30 | ,Brazil,-14.235,-51.9253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,6,11,15,25,34,46,59,77,92 31 | ,Brunei,4.5353,114.7277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 32 | ,Bulgaria,42.7339,25.4858,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3 33 | ,Burkina Faso,12.2383,-1.5616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,4,4,4,4,7,9 34 | ,Cabo Verde,16.5388,-23.0418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 35 | ,Cambodia,11.55,104.9167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 36 | ,Cameroon,3.848,11.5021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2 37 | Alberta,Canada,53.9333,-116.5765,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2 38 | British Columbia,Canada,49.2827,-123.1207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,4,4,7,7,8,10,10,13,13,13,14,14 39 | Grand Princess,Canada,37.6489,-122.6655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 40 | Manitoba,Canada,53.7609,-98.8139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 41 | New Brunswick,Canada,46.5653,-66.4619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 42 | Newfoundland and Labrador,Canada,53.1355,-57.6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 43 | Nova Scotia,Canada,44.682,-63.7443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 44 | Ontario,Canada,51.2538,-85.3232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,5,6,7,8,13,18 45 | Prince Edward Island,Canada,46.5107,-63.4168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 46 | Quebec,Canada,52.9399,-73.5491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,5,4,4,4,6,8,18 47 | Saskatchewan,Canada,52.9399,-106.4509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 48 | ,Central African Republic,6.6111,20.9394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 49 | ,Chad,15.4542,18.7322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 50 | ,Chile,-35.6751,-71.543,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,5 51 | Anhui,China,31.8257,117.2264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,4,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 52 | Beijing,China,40.1824,116.4142,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,5,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 53 | Chongqing,China,30.0572,107.874,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,3,3,4,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 54 | Fujian,China,26.0789,117.9874,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 55 | Gansu,China,37.8099,101.0583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 56 | Guangdong,China,23.3417,113.4244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,4,4,5,5,5,5,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 57 | Guangxi,China,23.8298,108.7881,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 58 | Guizhou,China,26.8154,106.8748,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 59 | Hainan,China,19.1959,109.7453,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 60 | Hebei,China,39.549,116.1306,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,4,4,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 61 | Heilongjiang,China,47.862,127.7615,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,5,6,7,8,8,9,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 62 | Henan,China,33.882,113.614,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,3,4,6,6,7,8,10,11,13,13,16,19,19,19,19,19,19,19,19,19,20,20,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22 63 | Hong Kong,China,22.3,114.2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 64 | Hubei,China,30.9756,112.2707,17,17,24,40,52,76,125,125,162,204,249,350,414,479,549,618,699,780,871,974,1068,1068,1310,1457,1596,1696,1789,1921,2029,2144,2144,2346,2346,2495,2563,2615,2641,2682,2727,2761,2803,2835,2871,2902,2931,2959,2986,3008,3024,3046,3056,3062,3075,3085,3099,3111,3122,3130,3133,3139,3153,3153,3160,3163,3169,3174 65 | Hunan,China,27.6104,111.7088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 66 | Inner Mongolia,China,44.0935,113.9448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 67 | Jiangsu,China,32.9711,119.455,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68 | Jiangxi,China,27.614,115.7221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 69 | Jilin,China,43.6661,126.1923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 70 | Liaoning,China,41.2956,122.6085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2 71 | Macau,China,22.1667,113.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72 | Ningxia,China,37.2692,106.1655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 73 | Qinghai,China,35.7452,95.9956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74 | Shaanxi,China,35.1917,108.8701,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3 75 | Shandong,China,36.3427,118.1498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,3,3,4,4,4,4,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 76 | Shanghai,China,31.202,121.4491,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,5,5,5 77 | Shanxi,China,37.5777,112.2922,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 78 | Sichuan,China,30.6171,102.7103,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 79 | Tianjin,China,39.3054,117.323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 80 | Tibet,China,31.6927,88.0924,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 81 | Xinjiang,China,41.1129,85.2401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 82 | Yunnan,China,24.974,101.487,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 83 | Zhejiang,China,29.1832,120.0934,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 84 | ,Colombia,4.5709,-74.2973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,4,6,6 85 | ,Congo (Brazzaville),-4.0383,21.7587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 86 | ,Congo (Kinshasa),-4.0383,21.7587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3 87 | ,Costa Rica,9.7489,-83.7534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2 88 | ,Cote d'Ivoire,7.54,-5.5471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 89 | ,Croatia,45.1,15.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,3,3 90 | ,Diamond Princess,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,3,3,3,4,4,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,8,8,8,10,10,10,10 91 | ,Cuba,22.0,-80.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2 92 | ,Cyprus,35.1264,33.4299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,5 93 | ,Czechia,49.8175,15.473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,6,9,9 94 | Faroe Islands,Denmark,61.8926,-6.9118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 95 | Greenland,Denmark,71.7069,-42.6043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 96 | ,Denmark,56.2639,9.5018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,4,6,9,13,13,24,32,34,41,52 97 | ,Djibouti,11.8251,42.5903,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 98 | ,Dominican Republic,18.7357,-70.1627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,3,3,6,10,10,20 99 | ,Ecuador,-1.8312,-78.1834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,3,5,7,14,18,27,28,34,36 100 | ,Egypt,26.0,30.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,4,6,6,8,10,14,19,20,21,24,30 101 | ,El Salvador,13.7942,-88.8965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 102 | ,Equatorial Guinea,1.5,10.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103 | ,Eritrea,15.1794,39.7823,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 104 | ,Estonia,58.5953,25.0136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 105 | ,Eswatini,-26.5225,31.4659,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 106 | ,Ethiopia,9.145,40.4897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107 | ,Fiji,-17.7134,178.065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 108 | ,Finland,64.0,26.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,5,7 109 | French Guiana,France,3.9339,-53.1258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 110 | French Polynesia,France,-17.6797,149.4068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111 | Guadeloupe,France,16.25,-61.5833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 112 | Mayotte,France,-12.8275,45.1662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 113 | New Caledonia,France,-20.9043,165.618,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 114 | Reunion,France,-21.1351,55.2471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 115 | Saint Barthelemy,France,17.9,-62.8333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 116 | St Martin,France,18.0708,-63.0501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 117 | Martinique,France,14.6415,-61.0242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 118 | ,France,46.2276,2.2137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,3,4,4,6,9,11,19,19,33,48,48,79,91,91,148,148,148,243,450,562,674,860,1100,1331,1696,1995 119 | ,Gabon,-0.8037,11.6094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 120 | ,Gambia,13.4432,-15.3101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 121 | ,Georgia,42.3154,43.3569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 122 | ,Germany,51.0,9.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,3,7,9,11,17,24,28,44,67,84,94,123,157,206,267,342 123 | ,Ghana,7.9465,-1.0232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,4,4,4 124 | ,Greece,39.0742,21.8243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,4,4,5,5,6,6,13,15,17,20,22,26,28 125 | ,Guatemala,15.7835,-90.2308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 126 | ,Guinea,9.9456,-9.6966,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 127 | ,Guyana,5.0,-58.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 128 | ,Haiti,18.9712,-72.2852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 129 | ,Holy See,41.9029,12.4534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 130 | ,Honduras,15.2,-86.2419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 131 | ,Hungary,47.1625,19.5033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,3,4,6,7,9,10,10,10 132 | ,Iceland,64.9631,-19.0208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,1,1,1,0,1,1,1,2,2,2,2 133 | ,India,21.0,78.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,3,3,4,5,4,7,10,10,12,20,20 134 | ,Indonesia,-0.7893,113.9213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,4,5,5,5,5,19,25,32,38,48,49,55,58,78,87 135 | ,Iran,32.0,53.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,5,8,12,16,19,26,34,43,54,66,77,92,107,124,145,194,237,291,354,429,514,611,724,853,988,1135,1284,1433,1556,1685,1812,1934,2077,2234,2378 136 | ,Iraq,33.0,44.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,3,4,6,6,7,7,8,9,10,10,10,11,12,13,17,17,20,23,27,29,36,40 137 | ,Ireland,53.1424,-7.6921,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,3,3,3,4,6,7,9,19,22 138 | ,Israel,31.0,35.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,5,8,12 139 | ,Italy,43.0,12.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,7,10,12,17,21,29,34,52,79,107,148,197,233,366,463,631,827,827,1266,1441,1809,2158,2503,2978,3405,4032,4825,5476,6077,6820,7503,8215,9134 140 | ,Jamaica,18.1096,-77.2975,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1 141 | ,Japan,36.0,138.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4,4,5,6,6,6,6,6,6,6,6,10,10,15,16,19,22,22,27,29,29,29,33,35,41,42,43,45,47,49 142 | ,Jordan,31.24,36.51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 143 | ,Kazakhstan,48.0196,66.9237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,1 144 | ,Kenya,-0.0236,37.9062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 145 | ,"Korea, South",36.0,128.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,6,8,10,12,13,13,16,17,28,28,35,35,42,44,50,53,54,60,66,66,72,75,75,81,84,91,94,102,111,111,120,126,131,139 146 | ,Kuwait,29.5,47.75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 147 | ,Kyrgyzstan,41.2044,74.7661,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 148 | ,Latvia,56.8796,24.6032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 149 | ,Lebanon,33.8547,35.8623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,3,3,3,3,4,4,4,4,4,4,6,6,8 150 | ,Liberia,6.4281,-9.4295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 151 | ,Liechtenstein,47.14,9.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 152 | ,Lithuania,55.1694,23.8813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,4,4,5 153 | ,Luxembourg,49.8153,6.1296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,4,4,8,8,8,8,8,9,15 154 | ,Madagascar,-18.7669,46.8691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 155 | ,Malaysia,2.5,112.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,3,4,10,14,16,20,23,26 156 | ,Maldives,3.2028,73.2207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 157 | ,Malta,35.9375,14.3754,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 158 | ,Mauritania,21.0079,10.9408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 159 | ,Mauritius,-20.2,57.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,2 160 | ,Mexico,23.6345,-102.5528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,8 161 | ,Moldova,47.4116,28.3699,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2 162 | ,Monaco,43.7333,7.4167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 163 | ,Mongolia,46.8625,103.8467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 164 | ,Montenegro,42.5,19.3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 165 | ,Morocco,31.7917,-7.0926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,3,3,4,4,5,6,11,23 166 | ,Namibia,-22.9576,18.4904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 167 | ,Nepal,28.1667,84.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 168 | Aruba,Netherlands,12.5186,-70.0358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 169 | Curacao,Netherlands,12.1696,-68.99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1 170 | Sint Maarten,Netherlands,18.0425,-63.0548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 171 | ,Netherlands,52.1326,5.2913,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,3,4,5,5,10,12,20,24,43,58,76,106,136,179,213,276,356,434,546 172 | ,New Zealand,-40.9006,174.886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 173 | ,Nicaragua,12.8654,-85.2072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 174 | ,Niger,17.6078,8.0817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 175 | ,Nigeria,9.082,8.6753,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 176 | ,North Macedonia,41.6086,21.7453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,3,3 177 | ,Norway,60.472,8.4689,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,6,7,7,7,7,10,12,14,14,19 178 | ,Oman,21.0,57.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 179 | ,Pakistan,30.3753,69.3451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,5,6,7,8,9,11 180 | ,Panama,8.538,-80.7821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,3,6,6,8,8,9 181 | ,Papua New Guinea,-6.315,143.9555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 182 | ,Paraguay,-23.4425,-58.4438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,3,3 183 | ,Peru,-9.19,-75.0152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,5,5,7,9,9,11 184 | ,Philippines,13.0,122.0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,5,8,11,12,12,19,17,18,19,25,33,35,38,45,54 185 | ,Poland,51.9194,19.1451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,3,4,5,5,5,5,5,7,8,10,14,16,16 186 | ,Portugal,39.3999,-8.2245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,6,12,14,23,33,43,60,76 187 | ,Qatar,25.3548,51.1839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 188 | ,Romania,45.9432,24.9668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,7,11,17,23,26 189 | ,Russia,60.0,90.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,3,3,4 190 | ,Rwanda,-1.9403,29.8739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 191 | ,Saint Lucia,13.9094,-60.9789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 192 | ,Saint Vincent and the Grenadines,12.9843,-61.2872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 193 | ,San Marino,43.9424,12.4578,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,3,5,5,5,7,7,11,11,14,20,20,20,21,21,21,21 194 | ,Saudi Arabia,24.0,45.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,3 195 | ,Senegal,14.4974,-14.4524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 196 | ,Serbia,44.0165,21.0059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,4,1,1 197 | ,Seychelles,-4.6796,55.492,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 198 | ,Singapore,1.2833,103.8333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2 199 | ,Slovakia,48.669,19.699,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0 200 | ,Slovenia,46.1512,14.9955,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,3,4,5,6,9 201 | ,Somalia,5.1521,46.1996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 202 | ,South Africa,-30.5595,22.9375,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 203 | ,Spain,40.0,-4.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,10,17,28,35,54,55,133,195,289,342,533,623,830,1043,1375,1772,2311,2808,3647,4365,5138 204 | ,Sri Lanka,7.0,81.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 205 | ,Sudan,12.8628,30.2176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 206 | ,Suriname,3.9193,-56.0278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 207 | ,Sweden,63.0,16.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,6,7,10,11,16,20,21,25,36,62,77,105 208 | ,Switzerland,46.8182,8.2275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,4,11,13,14,14,27,28,41,54,75,98,120,122,153,191,231 209 | ,Taiwan*,23.7,121.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2 210 | ,Tanzania,-6.369,34.8888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 211 | ,Thailand,15.0,101.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,5 212 | ,Togo,8.6195,0.8248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 213 | ,Trinidad and Tobago,10.6918,-61.2225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2 214 | ,Tunisia,34.0,9.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,3,4,5,6,6 215 | ,Turkey,38.9637,35.2433,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,4,9,30,37,44,59,75,92 216 | ,Uganda,1.0,32.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 217 | ,Ukraine,48.3794,31.1656,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,3,3,3,3,3,5,5,5 218 | ,United Arab Emirates,24.0,54.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2 219 | Bermuda,United Kingdom,32.3078,-64.7505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 220 | Cayman Islands,United Kingdom,19.3133,-81.2546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 221 | Channel Islands,United Kingdom,49.3723,-2.3644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 222 | Gibraltar,United Kingdom,36.1408,-5.3536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 223 | Isle of Man,United Kingdom,54.2361,-4.5481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 224 | Montserrat,United Kingdom,16.7425,-62.1874,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 225 | ,United Kingdom,55.3781,-3.4360000000000004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,6,8,8,8,21,21,55,55,71,137,177,233,281,335,422,465,578,759 226 | ,Uruguay,-32.5228,-55.7658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 227 | ,US,37.0902,-95.7129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,6,7,11,12,14,17,21,22,28,36,40,47,54,63,85,108,118,200,244,307,417,557,706,942,1209,1581 228 | ,Uzbekistan,41.3775,64.5853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 229 | ,Venezuela,6.4238,-66.5897,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 230 | ,Vietnam,16.0,108.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 231 | ,Zambia,-15.4167,28.2833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 232 | ,Zimbabwe,-20.0,30.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1 233 | Diamond Princess,Canada,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 234 | ,Dominica,15.415,-61.371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 235 | ,Grenada,12.1165,-61.679,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 236 | ,Mozambique,-18.665695,35.529562,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 237 | ,Syria,34.802075,38.99681500000001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 238 | ,Timor-Leste,-8.874217,125.727539,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 239 | ,Belize,13.1939,-59.5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 240 | Recovered,Canada,0.0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 241 | ,Laos,19.85627,102.495496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 242 | ,Libya,26.3351,17.228331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 243 | ,West Bank and Gaza,31.9522,35.2332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 244 | ,Guinea-Bissau,11.8037,-15.1804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 245 | ,Mali,17.570692,-3.996166000000001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 246 | ,Saint Kitts and Nevis,17.357822,-62.782998,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 247 | Northwest Territories,Canada,64.8255,-124.8457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 248 | Yukon,Canada,64.2823,-135.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 249 | ,Kosovo,42.602636,20.902977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 250 | ,Burma,21.9162,95.956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 251 | -------------------------------------------------------------------------------- /data/tweets_template.csv: -------------------------------------------------------------------------------- 1 | date,username,to,replies,retweets,favorites,text,geo,mentions,hashtags,id,permalink,lat,long 2 | -------------------------------------------------------------------------------- /logs/directory_info: -------------------------------------------------------------------------------- 1 | Directory containing logs. 2 | -------------------------------------------------------------------------------- /media/Twitter_trend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogencoglu/causal_twitter_modeling_covid19/ee5649b806d83175ccfcd6150cdd5f130026362e/media/Twitter_trend.png -------------------------------------------------------------------------------- /media/causal_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogencoglu/causal_twitter_modeling_covid19/ee5649b806d83175ccfcd6150cdd5f130026362e/media/causal_graph.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | networkx==2.2 # this needs to be less than 2.4 2 | causalnex==0.6.0 3 | pandas==0.24.0 4 | numpy==1.18.1 5 | scikit-learn==0.22.2 6 | pgmpy==0.1.10 7 | reverse-geocoder==1.5.1 8 | transformers==2.5.1 9 | langdetect==1.0.8 10 | pandarallel==1.4.6 11 | tqdm==4.43.0 12 | -------------------------------------------------------------------------------- /source/causal_inference.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%load_ext autoreload\n", 10 | "%autoreload 2\n", 11 | "\n", 12 | "from os.path import join\n", 13 | "from os.path import abspath\n", 14 | "import itertools\n", 15 | "\n", 16 | "import numpy as np\n", 17 | "import pandas as pd\n", 18 | "from causalnex.structure.notears import from_pandas\n", 19 | "from causalnex.plots import plot_structure\n", 20 | "from causalnex.network import BayesianNetwork\n", 21 | "from causalnex.evaluation import classification_report, roc_auc\n", 22 | "from sklearn.model_selection import KFold\n", 23 | "\n", 24 | "from data_utils import read_tweets, read_covid, reformat_dataframe, add_missing_countries\n", 25 | "from sentiment import add_lang, add_sentiment\n", 26 | "from train_utils import discretize_df\n", 27 | "from train import train_bn\n", 28 | "from feature_extraction import get_feature_matrix\n", 29 | "from inference import marginal_probs\n", 30 | "from eval_utils import save_logs\n", 31 | "from configs import config as cf" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "## 1 - Read official COVID-19 (https://github.com/CSSEGISandData/COVID-19) and collected tweet data " 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/html": [ 49 | "
\n", 50 | "\n", 63 | "\n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | "
2020-01-222020-01-232020-01-242020-01-252020-01-262020-01-272020-01-282020-01-292020-01-302020-01-31...2020-03-092020-03-102020-03-112020-03-122020-03-132020-03-142020-03-152020-03-162020-03-172020-03-18
Country
Afghanistan0000000000...34567811162022
Albania0000000000...14815233138444955
Algeria0000000000...19202021232937465463
Andorra0000000000...111111111427
Angola0000000000...0000000000
\n", 237 | "

5 rows × 57 columns

\n", 238 | "
" 239 | ], 240 | "text/plain": [ 241 | " 2020-01-22 2020-01-23 2020-01-24 2020-01-25 2020-01-26 \\\n", 242 | "Country \n", 243 | "Afghanistan 0 0 0 0 0 \n", 244 | "Albania 0 0 0 0 0 \n", 245 | "Algeria 0 0 0 0 0 \n", 246 | "Andorra 0 0 0 0 0 \n", 247 | "Angola 0 0 0 0 0 \n", 248 | "\n", 249 | " 2020-01-27 2020-01-28 2020-01-29 2020-01-30 2020-01-31 ... \\\n", 250 | "Country ... \n", 251 | "Afghanistan 0 0 0 0 0 ... \n", 252 | "Albania 0 0 0 0 0 ... \n", 253 | "Algeria 0 0 0 0 0 ... \n", 254 | "Andorra 0 0 0 0 0 ... \n", 255 | "Angola 0 0 0 0 0 ... \n", 256 | "\n", 257 | " 2020-03-09 2020-03-10 2020-03-11 2020-03-12 2020-03-13 \\\n", 258 | "Country \n", 259 | "Afghanistan 3 4 5 6 7 \n", 260 | "Albania 1 4 8 15 23 \n", 261 | "Algeria 19 20 20 21 23 \n", 262 | "Andorra 1 1 1 1 1 \n", 263 | "Angola 0 0 0 0 0 \n", 264 | "\n", 265 | " 2020-03-14 2020-03-15 2020-03-16 2020-03-17 2020-03-18 \n", 266 | "Country \n", 267 | "Afghanistan 8 11 16 20 22 \n", 268 | "Albania 31 38 44 49 55 \n", 269 | "Algeria 29 37 46 54 63 \n", 270 | "Andorra 1 1 1 14 27 \n", 271 | "Angola 0 0 0 0 0 \n", 272 | "\n", 273 | "[5 rows x 57 columns]" 274 | ] 275 | }, 276 | "execution_count": 2, 277 | "metadata": {}, 278 | "output_type": "execute_result" 279 | } 280 | ], 281 | "source": [ 282 | "infected = reformat_dataframe(read_covid(cf.INFECTED_PATH))\n", 283 | "deaths = reformat_dataframe(read_covid(cf.DEATHS_PATH))\n", 284 | "infected.head(5)" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 3, 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "name": "stdout", 294 | "output_type": "stream", 295 | "text": [ 296 | "Tweets dataframe shape=(954902, 19)\n", 297 | "439210 tweets do not have country information!\n", 298 | "Loading formatted geocoded file...\n", 299 | "7605 tweets that do not have country information will be discarded!\n" 300 | ] 301 | } 302 | ], 303 | "source": [ 304 | "tweets = read_tweets(cf.TWEETS_PATH)\n", 305 | "add_missing_countries(tweets) # add country info if missing (inplace)\n", 306 | "tweets = add_lang(tweets)\n", 307 | "tweets = add_sentiment(tweets)" 308 | ] 309 | }, 310 | { 311 | "cell_type": "markdown", 312 | "metadata": {}, 313 | "source": [ 314 | "### Groupby days" 315 | ] 316 | }, 317 | { 318 | "cell_type": "code", 319 | "execution_count": 4, 320 | "metadata": {}, 321 | "outputs": [ 322 | { 323 | "name": "stderr", 324 | "output_type": "stream", 325 | "text": [ 326 | " 0%| | 0/12 [00:00\n", 377 | "\n", 390 | "\n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | "
infectedtwitter_activitysentimentinfected_newinfected_perc_changerestrictionover_65twitter_usagesingle_householddeathsdeaths_newdeaths_perc_change
52130.28413054.0540545.97021722.52252320.900322019.81310.743.90.0000000.000000.000000
53145.18364556.6528078.62061014.89951511.436170019.81310.743.90.1732500.17325100.000000
54152.63340368.780319-15.0132487.4497575.131265019.81310.743.90.3465000.17325100.000000
55163.54816466.181566-4.62146510.9147617.150965019.81310.743.90.5197510.1732550.000000
56177.58142865.8350668.32364214.0332648.580508019.81310.743.90.6930010.1732533.333333
\n", 486 | "" 487 | ], 488 | "text/plain": [ 489 | " infected twitter_activity sentiment infected_new \\\n", 490 | "52 130.284130 54.054054 5.970217 22.522523 \n", 491 | "53 145.183645 56.652807 8.620610 14.899515 \n", 492 | "54 152.633403 68.780319 -15.013248 7.449757 \n", 493 | "55 163.548164 66.181566 -4.621465 10.914761 \n", 494 | "56 177.581428 65.835066 8.323642 14.033264 \n", 495 | "\n", 496 | " infected_perc_change restriction over_65 twitter_usage \\\n", 497 | "52 20.900322 0 19.813 10.7 \n", 498 | "53 11.436170 0 19.813 10.7 \n", 499 | "54 5.131265 0 19.813 10.7 \n", 500 | "55 7.150965 0 19.813 10.7 \n", 501 | "56 8.580508 0 19.813 10.7 \n", 502 | "\n", 503 | " single_household deaths deaths_new deaths_perc_change \n", 504 | "52 43.9 0.000000 0.00000 0.000000 \n", 505 | "53 43.9 0.173250 0.17325 100.000000 \n", 506 | "54 43.9 0.346500 0.17325 100.000000 \n", 507 | "55 43.9 0.519751 0.17325 50.000000 \n", 508 | "56 43.9 0.693001 0.17325 33.333333 " 509 | ] 510 | }, 511 | "execution_count": 5, 512 | "metadata": {}, 513 | "output_type": "execute_result" 514 | } 515 | ], 516 | "source": [ 517 | "features.tail()" 518 | ] 519 | }, 520 | { 521 | "cell_type": "markdown", 522 | "metadata": {}, 523 | "source": [ 524 | "## 2 - Structure Learning with NOTEARS" 525 | ] 526 | }, 527 | { 528 | "cell_type": "code", 529 | "execution_count": 14, 530 | "metadata": {}, 531 | "outputs": [], 532 | "source": [ 533 | "# Apply NOTEARS algorithm\n", 534 | "graph = from_pandas(features, \n", 535 | " max_iter=200,\n", 536 | " tabu_child_nodes=cf.tabu_child_nodes,\n", 537 | " tabu_parent_nodes=cf.tabu_parent_nodes,\n", 538 | " tabu_edges=cf.tabu_edges,\n", 539 | " w_threshold=cf.edge_threshold)\n", 540 | "\n", 541 | "plot = plot_structure(graph)\n", 542 | "plot.draw(abspath(join(cf.LOGS_DIR, 'structure_graph.png')))" 543 | ] 544 | }, 545 | { 546 | "cell_type": "markdown", 547 | "metadata": {}, 548 | "source": [ 549 | "## 3 - Causal Inference" 550 | ] 551 | }, 552 | { 553 | "cell_type": "markdown", 554 | "metadata": {}, 555 | "source": [ 556 | "### Leave-One-Country-Out Cross Validation - Fitting the Conditional Distribution of the Bayesian Network" 557 | ] 558 | }, 559 | { 560 | "cell_type": "code", 561 | "execution_count": 17, 562 | "metadata": {}, 563 | "outputs": [ 564 | { 565 | "name": "stdout", 566 | "output_type": "stream", 567 | "text": [ 568 | "Country as test = Italy, AUC = 0.976\n", 569 | "Country as test = Spain, AUC = 0.766\n", 570 | "Country as test = Germany, AUC = 0.992\n", 571 | "Country as test = France, AUC = 0.776\n", 572 | "Country as test = Switzerland, AUC = 0.789\n", 573 | "Country as test = United Kingdom, AUC = 0.684\n", 574 | "Country as test = Netherlands, AUC = 0.746\n", 575 | "Country as test = Norway, AUC = 0.907\n", 576 | "Country as test = Austria, AUC = 0.798\n", 577 | "Country as test = Belgium, AUC = 0.728\n", 578 | "Country as test = Sweden, AUC = 0.998\n", 579 | "Country as test = Denmark, AUC = 0.831\n", 580 | "\tMean AUC = 0.833\n" 581 | ] 582 | } 583 | ], 584 | "source": [ 585 | "# map features to to \"high\" or \"low\"\n", 586 | "fit_feats = discretize_df(features)\n", 587 | "\n", 588 | "# LOCO\n", 589 | "auc_scores = []\n", 590 | "countries = []\n", 591 | "for train_country_ind, test_country_ind in KFold(n_splits=cf.n_countries).split(range(cf.n_countries)):\n", 592 | " train_indices = cf.splits[train_country_ind]\n", 593 | " test_indices = cf.splits[test_country_ind]\n", 594 | " train_indices = list(itertools.chain.from_iterable(train_indices))\n", 595 | " test_indices = list(itertools.chain.from_iterable(test_indices))\n", 596 | " train = fit_feats.iloc[train_indices]\n", 597 | " test = fit_feats.iloc[test_indices]\n", 598 | " \n", 599 | " bn = train_bn(train, graph)\n", 600 | " _, auc = roc_auc(bn, test, 'twitter_activity')\n", 601 | " auc_scores.append(auc)\n", 602 | " countries.append(cf.countries[test_country_ind[0]])\n", 603 | " print('Country as test = {}, AUC = {:.3f}'.format(cf.countries[test_country_ind[0]], auc))\n", 604 | "print('\\tMean AUC = {:.3f}'.format(np.mean(auc_scores)))\n", 605 | "save_logs(countries, auc_scores, 'aucs')" 606 | ] 607 | }, 608 | { 609 | "cell_type": "markdown", 610 | "metadata": {}, 611 | "source": [ 612 | "### Inspect Marginal Likelihoods After Observations" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 19, 618 | "metadata": {}, 619 | "outputs": [ 620 | { 621 | "data": { 622 | "text/html": [ 623 | "
\n", 624 | "\n", 641 | "\n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | "
deaths_newhighlow
infected_newhighlowhighlow
restriction01010101
twitter_usagehighlowhighlowhighlowhighlowhighlowhighlowhighlowhighlow
twitter_activity
high0.8571430.1250.80.4444440.50.250.50.50.8947370.3888890.8181820.8333330.2258060.1196010.50.5
low0.1428570.8750.20.5555560.50.750.50.50.1052630.6111110.1818180.1666670.7741940.8803990.50.5
\n", 746 | "
" 747 | ], 748 | "text/plain": [ 749 | "deaths_new high \\\n", 750 | "infected_new high low \n", 751 | "restriction 0 1 0 1 \n", 752 | "twitter_usage high low high low high low high low \n", 753 | "twitter_activity \n", 754 | "high 0.857143 0.125 0.8 0.444444 0.5 0.25 0.5 0.5 \n", 755 | "low 0.142857 0.875 0.2 0.555556 0.5 0.75 0.5 0.5 \n", 756 | "\n", 757 | "deaths_new low \\\n", 758 | "infected_new high low \n", 759 | "restriction 0 1 0 \n", 760 | "twitter_usage high low high low high low \n", 761 | "twitter_activity \n", 762 | "high 0.894737 0.388889 0.818182 0.833333 0.225806 0.119601 \n", 763 | "low 0.105263 0.611111 0.181818 0.166667 0.774194 0.880399 \n", 764 | "\n", 765 | "deaths_new \n", 766 | "infected_new \n", 767 | "restriction 1 \n", 768 | "twitter_usage high low \n", 769 | "twitter_activity \n", 770 | "high 0.5 0.5 \n", 771 | "low 0.5 0.5 " 772 | ] 773 | }, 774 | "execution_count": 19, 775 | "metadata": {}, 776 | "output_type": "execute_result" 777 | } 778 | ], 779 | "source": [ 780 | "bn = BayesianNetwork(graph)\n", 781 | "bn = bn.fit_node_states(fit_feats)\n", 782 | "bn = bn.fit_cpds(fit_feats, method='BayesianEstimator', bayes_prior='K2')\n", 783 | "bn.cpds['twitter_activity']" 784 | ] 785 | }, 786 | { 787 | "cell_type": "markdown", 788 | "metadata": {}, 789 | "source": [ 790 | "#### Expected Marginal Likelihoods" 791 | ] 792 | }, 793 | { 794 | "cell_type": "markdown", 795 | "metadata": {}, 796 | "source": [ 797 | "##### Lower daily infections/deaths increases the probability of percentage increase being low. This is expected simply due to mathematical definition of percentage." 798 | ] 799 | }, 800 | { 801 | "cell_type": "code", 802 | "execution_count": 20, 803 | "metadata": {}, 804 | "outputs": [ 805 | { 806 | "name": "stdout", 807 | "output_type": "stream", 808 | "text": [ 809 | "Marginal probabilities of \"deaths_perc_change\" | {'deaths_new': 'high'} = {'high': 0.4446071052335914, 'low': 0.5553928947664085}\n", 810 | "Marginal probabilities of \"deaths_perc_change\" | {'deaths_new': 'low'} = {'high': 0.05965902319764994, 'low': 0.9403409768023501}\n" 811 | ] 812 | } 813 | ], 814 | "source": [ 815 | "_ = marginal_probs(bn, 'deaths_perc_change', {'deaths_new': 'high'})\n", 816 | "_ = marginal_probs(bn, 'deaths_perc_change', {'deaths_new': 'low'})" 817 | ] 818 | }, 819 | { 820 | "cell_type": "markdown", 821 | "metadata": {}, 822 | "source": [ 823 | "#### Insightful Marginal Likelihoods That Support Domain/Expert Knowledge and Literature" 824 | ] 825 | }, 826 | { 827 | "cell_type": "code", 828 | "execution_count": 21, 829 | "metadata": {}, 830 | "outputs": [ 831 | { 832 | "name": "stdout", 833 | "output_type": "stream", 834 | "text": [ 835 | "Marginal probabilities of \"infected\" | {'over_65': 'high'} = {'high': 0.1882654368732316, 'low': 0.8117345631267684}\n", 836 | "Marginal probabilities of \"infected\" | {'over_65': 'low'} = {'high': 0.15213984204244294, 'low': 0.8478601579575571}\n" 837 | ] 838 | } 839 | ], 840 | "source": [ 841 | "_ = marginal_probs(bn, 'infected', {'over_65': 'high'})\n", 842 | "_ = marginal_probs(bn, 'infected', {'over_65': 'low'})" 843 | ] 844 | }, 845 | { 846 | "cell_type": "code", 847 | "execution_count": 22, 848 | "metadata": {}, 849 | "outputs": [ 850 | { 851 | "name": "stdout", 852 | "output_type": "stream", 853 | "text": [ 854 | "Marginal probabilities of \"deaths_perc_change\" | {'over_65': 'high'} = {'high': 0.08110649658975573, 'low': 0.9188935034102442}\n", 855 | "Marginal probabilities of \"deaths_perc_change\" | {'over_65': 'low'} = {'high': 0.07511992628516961, 'low': 0.9248800737148305}\n" 856 | ] 857 | } 858 | ], 859 | "source": [ 860 | "_ = marginal_probs(bn, 'deaths_perc_change', {'over_65': 'high'})\n", 861 | "_ = marginal_probs(bn, 'deaths_perc_change', {'over_65': 'low'})" 862 | ] 863 | }, 864 | { 865 | "cell_type": "code", 866 | "execution_count": 23, 867 | "metadata": {}, 868 | "outputs": [ 869 | { 870 | "name": "stdout", 871 | "output_type": "stream", 872 | "text": [ 873 | "Marginal probabilities of \"deaths_perc_change\" | {'single_household': 'high'} = {'high': 0.06778127725480429, 'low': 0.9322187227451956}\n", 874 | "Marginal probabilities of \"deaths_perc_change\" | {'single_household': 'low'} = {'high': 0.09137034138746945, 'low': 0.9086296586125305}\n" 875 | ] 876 | } 877 | ], 878 | "source": [ 879 | "_ = marginal_probs(bn, 'deaths_perc_change', {'single_household': 'high'})\n", 880 | "_ = marginal_probs(bn, 'deaths_perc_change', {'single_household': 'low'})" 881 | ] 882 | }, 883 | { 884 | "cell_type": "code", 885 | "execution_count": 24, 886 | "metadata": {}, 887 | "outputs": [ 888 | { 889 | "name": "stdout", 890 | "output_type": "stream", 891 | "text": [ 892 | "Marginal probabilities of \"infected\" | {'single_household': 'high', 'over_65': 'low'} = {'high': 0.17826086956521736, 'low': 0.8217391304347825}\n", 893 | "Marginal probabilities of \"infected\" | {'single_household': 'low', 'over_65': 'high'} = {'high': 0.2413793103448276, 'low': 0.7586206896551724}\n" 894 | ] 895 | } 896 | ], 897 | "source": [ 898 | "_ = marginal_probs(bn, 'infected', {'single_household': 'high', 'over_65': 'low'})\n", 899 | "_ = marginal_probs(bn, 'infected', {'single_household': 'low', 'over_65': 'high'})" 900 | ] 901 | }, 902 | { 903 | "cell_type": "markdown", 904 | "metadata": {}, 905 | "source": [ 906 | "#### Insightful Marginal Likelihoods About Twitter Activity" 907 | ] 908 | }, 909 | { 910 | "cell_type": "code", 911 | "execution_count": 25, 912 | "metadata": {}, 913 | "outputs": [ 914 | { 915 | "name": "stdout", 916 | "output_type": "stream", 917 | "text": [ 918 | "Marginal probabilities of \"twitter_activity\" | {'deaths_new': 'high', 'infected_new': 'high'} = {'high': 0.495659794530057, 'low': 0.5043402054699431}\n", 919 | "Marginal probabilities of \"twitter_activity\" | {'deaths_new': 'low', 'infected_new': 'low'} = {'high': 0.1841544830189222, 'low': 0.8158455169810779}\n" 920 | ] 921 | } 922 | ], 923 | "source": [ 924 | "_ = marginal_probs(bn, 'twitter_activity', {'deaths_new': 'high', 'infected_new': 'high'})\n", 925 | "_ = marginal_probs(bn, 'twitter_activity', {'deaths_new': 'low', 'infected_new': 'low'})" 926 | ] 927 | }, 928 | { 929 | "cell_type": "code", 930 | "execution_count": 26, 931 | "metadata": {}, 932 | "outputs": [ 933 | { 934 | "name": "stdout", 935 | "output_type": "stream", 936 | "text": [ 937 | "Marginal probabilities of \"twitter_activity\" | {'deaths_new': 'high', 'infected_new': 'high', 'twitter_usage': 'high', 'restriction': 1} = {'high': 0.8, 'low': 0.2}\n", 938 | "Marginal probabilities of \"twitter_activity\" | {'deaths_new': 'low', 'infected_new': 'low', 'twitter_usage': 'low', 'restriction': 0} = {'high': 0.11960132890365449, 'low': 0.8803986710963455}\n" 939 | ] 940 | } 941 | ], 942 | "source": [ 943 | "_ = marginal_probs(bn, 'twitter_activity', {'deaths_new': 'high', 'infected_new': 'high', 'twitter_usage': 'high', 'restriction': 1})\n", 944 | "_ = marginal_probs(bn, 'twitter_activity', {'deaths_new': 'low', 'infected_new': 'low', 'twitter_usage': 'low', 'restriction': 0})" 945 | ] 946 | }, 947 | { 948 | "cell_type": "code", 949 | "execution_count": 27, 950 | "metadata": {}, 951 | "outputs": [ 952 | { 953 | "name": "stdout", 954 | "output_type": "stream", 955 | "text": [ 956 | "Marginal probabilities of \"twitter_activity\" | {'restriction': 1} = {'high': 0.535037907228066, 'low': 0.46496209277193384}\n", 957 | "Marginal probabilities of \"twitter_activity\" | {'restriction': 0} = {'high': 0.23228723227692152, 'low': 0.7677127677230785}\n" 958 | ] 959 | } 960 | ], 961 | "source": [ 962 | "_ = marginal_probs(bn, 'twitter_activity', {'restriction': 1})\n", 963 | "_ = marginal_probs(bn, 'twitter_activity', {'restriction': 0})" 964 | ] 965 | }, 966 | { 967 | "cell_type": "code", 968 | "execution_count": 28, 969 | "metadata": {}, 970 | "outputs": [ 971 | { 972 | "name": "stdout", 973 | "output_type": "stream", 974 | "text": [ 975 | "Marginal probabilities of \"twitter_activity\" | {'twitter_usage': 'high'} = {'high': 0.3189333421537977, 'low': 0.6810666578462024}\n", 976 | "Marginal probabilities of \"twitter_activity\" | {'twitter_usage': 'low'} = {'high': 0.16682484309633536, 'low': 0.8331751569036646}\n" 977 | ] 978 | } 979 | ], 980 | "source": [ 981 | "_ = marginal_probs(bn, 'twitter_activity', {'twitter_usage': 'high'})\n", 982 | "_ = marginal_probs(bn, 'twitter_activity', {'twitter_usage': 'low'})" 983 | ] 984 | }, 985 | { 986 | "cell_type": "markdown", 987 | "metadata": {}, 988 | "source": [ 989 | "#### Insightful Marginal Likelihoods About Overall Sentiment" 990 | ] 991 | }, 992 | { 993 | "cell_type": "code", 994 | "execution_count": 29, 995 | "metadata": {}, 996 | "outputs": [ 997 | { 998 | "name": "stdout", 999 | "output_type": "stream", 1000 | "text": [ 1001 | "Marginal probabilities of \"sentiment\" | {'deaths': 'high'} = {'neg': 0.34426542253093173, 'pos': 0.6557345774690683}\n", 1002 | "Marginal probabilities of \"sentiment\" | {'deaths': 'low'} = {'neg': 0.2904481188092652, 'pos': 0.7095518811907349}\n" 1003 | ] 1004 | } 1005 | ], 1006 | "source": [ 1007 | "_ = marginal_probs(bn, 'sentiment', {'deaths': 'high'})\n", 1008 | "_ = marginal_probs(bn, 'sentiment', {'deaths': 'low'})" 1009 | ] 1010 | }, 1011 | { 1012 | "cell_type": "code", 1013 | "execution_count": 31, 1014 | "metadata": {}, 1015 | "outputs": [ 1016 | { 1017 | "name": "stdout", 1018 | "output_type": "stream", 1019 | "text": [ 1020 | "Marginal probabilities of \"sentiment\" | {'deaths_new': 'high'} = {'neg': 0.6241951146107049, 'pos': 0.375804885389295}\n", 1021 | "Marginal probabilities of \"sentiment\" | {'deaths_new': 'low'} = {'neg': 0.27732727932837664, 'pos': 0.7226727206716234}\n" 1022 | ] 1023 | } 1024 | ], 1025 | "source": [ 1026 | "_ = marginal_probs(bn, 'sentiment', {'deaths_new': 'high'})\n", 1027 | "_ = marginal_probs(bn, 'sentiment', {'deaths_new': 'low'})" 1028 | ] 1029 | }, 1030 | { 1031 | "cell_type": "code", 1032 | "execution_count": 32, 1033 | "metadata": {}, 1034 | "outputs": [ 1035 | { 1036 | "name": "stdout", 1037 | "output_type": "stream", 1038 | "text": [ 1039 | "Marginal probabilities of \"sentiment\" | {'deaths_new': 'high', 'deaths': 'high'} = {'neg': 0.3226579510355828, 'pos': 0.6773420489644172}\n", 1040 | "Marginal probabilities of \"sentiment\" | {'deaths_new': 'low', 'deaths': 'low'} = {'neg': 0.2732286391567292, 'pos': 0.7267713608432709}\n" 1041 | ] 1042 | } 1043 | ], 1044 | "source": [ 1045 | "_ = marginal_probs(bn, 'sentiment', {'deaths_new': 'high', 'deaths': 'high'})\n", 1046 | "_ = marginal_probs(bn, 'sentiment', {'deaths_new': 'low', 'deaths': 'low'})" 1047 | ] 1048 | }, 1049 | { 1050 | "cell_type": "code", 1051 | "execution_count": 33, 1052 | "metadata": {}, 1053 | "outputs": [ 1054 | { 1055 | "name": "stdout", 1056 | "output_type": "stream", 1057 | "text": [ 1058 | "Marginal probabilities of \"sentiment\" | {'restriction': 1} = {'neg': 0.5014243502052969, 'pos': 0.49857564979470315}\n", 1059 | "Marginal probabilities of \"sentiment\" | {'restriction': 0} = {'neg': 0.2859699394915012, 'pos': 0.7140300605084988}\n" 1060 | ] 1061 | } 1062 | ], 1063 | "source": [ 1064 | "_ = marginal_probs(bn, 'sentiment', {'restriction': 1})\n", 1065 | "_ = marginal_probs(bn, 'sentiment', {'restriction': 0})" 1066 | ] 1067 | } 1068 | ], 1069 | "metadata": { 1070 | "kernelspec": { 1071 | "display_name": "Python 3", 1072 | "language": "python", 1073 | "name": "python3" 1074 | }, 1075 | "language_info": { 1076 | "codemirror_mode": { 1077 | "name": "ipython", 1078 | "version": 3 1079 | }, 1080 | "file_extension": ".py", 1081 | "mimetype": "text/x-python", 1082 | "name": "python", 1083 | "nbconvert_exporter": "python", 1084 | "pygments_lexer": "ipython3", 1085 | "version": "3.7.6" 1086 | } 1087 | }, 1088 | "nbformat": 4, 1089 | "nbformat_minor": 4 1090 | } 1091 | -------------------------------------------------------------------------------- /source/configs.py: -------------------------------------------------------------------------------- 1 | ''' 2 | configs & settings are defined in this file 3 | ''' 4 | 5 | 6 | from os.path import join 7 | from os.path import abspath 8 | from os.path import dirname 9 | from os import pardir 10 | from datetime import datetime 11 | 12 | import numpy as np 13 | 14 | 15 | class Config(object): 16 | 17 | # directory paths 18 | CURRENT_DIR = abspath(dirname(__file__)) 19 | ROOT_DIR = abspath(join(CURRENT_DIR, pardir)) 20 | DATA_DIR = abspath(join(ROOT_DIR, 'data')) 21 | LOGS_DIR = abspath(join(ROOT_DIR, 'logs')) 22 | 23 | # data file paths 24 | TWEETS_PATH = abspath(join(DATA_DIR, 'tweets.csv')) 25 | INFECTED_PATH = abspath(join(DATA_DIR, 26 | 'time_series_covid19_confirmed_global.csv')) 27 | DEATHS_PATH = abspath(join(DATA_DIR, 28 | 'time_series_covid19_deaths_global.csv')) 29 | 30 | # time window of the analysis 31 | start_date = '2020-01-22' # inclusive 32 | end_date = '2020-03-18' # inclusive 33 | date_diff = datetime.strptime( 34 | end_date, '%Y-%m-%d') - datetime.strptime(start_date, '%Y-%m-%d') 35 | n_days = date_diff.days + 1 36 | 37 | tweet_column_shortener_dict = { 38 | 'lat': 'Lat', 39 | 'long': 'Long', 40 | 'Country/Region': 'Location' 41 | } 42 | 43 | countries = ['Italy', 'Spain', 'Germany', 'France', 'Switzerland', 44 | 'United Kingdom', 'Netherlands', 'Norway', 'Austria', 45 | 'Belgium', 'Sweden', 'Denmark'] 46 | 47 | n_countries = len(countries) 48 | 49 | # sentiment detection 50 | sentiment_tokenizer_model = 'distilbert-base-uncased' 51 | sentiment_model = 'distilbert-base-uncased-finetuned-sst-2-english' 52 | 53 | # country stats 54 | population = { 55 | 'Austria': 8.955, 56 | 'Belgium': 11.539, 57 | 'Czechia': 10.689, 58 | 'Denmark': 5.772, 59 | 'Finland': 5.532, 60 | 'France': 65.130, 61 | 'Germany': 83.517, 62 | 'Greece': 10.473, 63 | 'Italy': 60.550, 64 | 'Netherlands': 17.097, 65 | 'Norway': 5.379, 66 | 'Portugal': 10.226, 67 | 'Spain': 46.737, 68 | 'Sweden': 10.036, 69 | 'Switzerland': 8.591, 70 | 'United Kingdom': 67.530, 71 | } # pop/km2 - source: wikipedia 72 | # https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations) 73 | population_cutoffs = [np.median([i[1] for i in population.items()])] 74 | 75 | over_65 = { 76 | 'Austria': 19.002, 77 | 'Belgium': 18.789, 78 | 'Czechia': 19.421, 79 | 'Denmark': 19.813, 80 | 'Finland': 21.721, 81 | 'France': 20.035, 82 | 'Germany': 21.462, 83 | 'Greece': 21.655, 84 | 'Italy': 22.752, 85 | 'Netherlands': 19.196, 86 | 'Norway': 17.049, 87 | 'Portugal': 21.954, 88 | 'Spain': 19.379, 89 | 'Sweden': 20.096, 90 | 'Switzerland': 18.623, 91 | 'United Kingdom': 18.396, 92 | } # percentage 93 | # https://data.worldbank.org/indicator/sp.pop.65up.to.zs?end=2018&start=1960 94 | over_65_cutoffs = [np.median([i[1] for i in over_65.items()])] 95 | 96 | twitter_usage = { 97 | 'Austria': 7.2, 98 | 'Belgium': 8.7, 99 | 'Czechia': 17.2, 100 | 'Denmark': 10.7, 101 | 'Finland': 16.7, 102 | 'France': 10.5, 103 | 'Germany': 9.8, 104 | 'Greece': 2.12, 105 | 'Italy': 7.7, 106 | 'Netherlands': 10.6, 107 | 'Norway': 14.6, 108 | 'Portugal': 5.35, 109 | 'Spain': 4.6, 110 | 'Sweden': 9.6, 111 | 'Switzerland': 12.0, 112 | 'United Kingdom': 37.1, 113 | } # % people in February 2020 - source: 114 | # https://gs.statcounter.com/social-media-stats/all/united-kingdom 115 | twitter_usage_cutoffs = [np.median([i[1] for i in twitter_usage.items()])] 116 | 117 | single_household = { 118 | 'Austria': 37.2, 119 | 'Belgium': 35.0, 120 | 'Czechia': 28.7, 121 | 'Denmark': 43.9, 122 | 'Finland': 44.7, 123 | 'France': 36.2, 124 | 'Germany': 41.7, 125 | 'Greece': 25.7, 126 | 'Italy': 32.6, 127 | 'Netherlands': 38.3, 128 | 'Norway': 45.8, 129 | 'Portugal': 23.1, 130 | 'Spain': 25.5, 131 | 'Sweden': 42.5, 132 | 'Switzerland': 38.1, 133 | 'United Kingdom': 30.5, 134 | } # % single person households - source: 135 | # https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=ilc_lvph02&lang=en 136 | single_household_cutoffs = [ 137 | np.median([i[1] for i in single_household.items()])] 138 | 139 | cut_offs = { 140 | 'twitter_usage': twitter_usage_cutoffs, 141 | 'over_65': over_65_cutoffs, 142 | 'single_household': single_household_cutoffs 143 | } 144 | 145 | country_abbr = { 146 | 'CN': 'Mainland China', 147 | 'US': 'US', 148 | 'GB': 'United Kingdom', 149 | 'FR': 'France', 150 | 'PS': 'Palestine', 151 | 'CA': 'Canada', 152 | 'GH': 'Ghana', 153 | 'GU': 'Guam', 154 | 'GY': 'Guyana', 155 | 'GP': 'Guadeloupe', 156 | 'AG': 'Guadeloupe', 157 | 'LC': 'Saint Lucia', 158 | 'BJ': 'Benin', 159 | 'AU': 'Australia', 160 | 'VI': 'Virgin Islands', 161 | 'ZM': 'Zambia', 162 | 'TT': 'Trinidad and Tobago', 163 | 'KE': 'Kenya', 164 | 'CO': 'Colombia', 165 | 'PR': 'Puerto Rico', 166 | 'ET': 'Ethiopia', 167 | 'SO': 'Somalia', 168 | 'BS': 'Bahamas', 169 | 'NA': 'Namibia', 170 | 'KY': 'Cayman Islands', 171 | 'SZ': 'Swaziland', 172 | 'ME': 'Montenegro', 173 | 'CU': 'Cuba', 174 | 'UY': 'Uruguay', 175 | 'CW': 'Curacao', 176 | 'GT': 'Guatemala', 177 | 'XK': 'Kosovo', 178 | 'SD': 'Sudan', 179 | 'LR': 'Liberia', 180 | } 181 | 182 | restrictions = { 183 | 'Austria': '2020-03-16', 184 | 'Belgium': '2020-03-18', 185 | 'Czechia': '2020-03-16', 186 | 'Denmark': '2020-03-11', 187 | 'Finland': '2020-03-27', 188 | 'France': '2020-03-17', 189 | 'Germany': '2020-03-20', 190 | 'Greece': '2020-03-23', 191 | 'Italy': '2020-03-09', 192 | 'Netherlands': '2020-03-16', 193 | 'Norway': '2020-03-12', 194 | 'Portugal': '2020-03-19', 195 | 'Spain': '2020-03-14', 196 | 'United Kingdom': '2020-03-24', 197 | } 198 | # source : 199 | # https://en.wikipedia.org/wiki 200 | # /National_responses_to_the_2019%E2%80%9320_coronavirus_pandemic 201 | 202 | # training related 203 | n_observations = n_days * n_countries 204 | splits = np.array(np.array_split(np.arange(n_observations), n_countries)) 205 | 206 | # discrete labels 207 | percentiles = [75] 208 | n_levels = len(percentiles) + 1 209 | label_dict_two_cat = {0: 'low', 1: 'high'} 210 | 211 | numerical_columns = ['infected', 'infected_new', 'infected_perc_change', 212 | 'deaths', 'deaths_new', 'deaths_perc_change', 213 | 'twitter_activity'] 214 | 215 | stat_numerical_columns = [ 216 | 'over_65', 217 | 'twitter_usage', 218 | 'single_household' 219 | ] 220 | 221 | tabu_child_nodes = stat_numerical_columns + ['restriction'] 222 | tabu_parent_nodes = ['twitter_activity', 'sentiment'] 223 | tabu_edges = [ 224 | ('twitter_usage', 'infected'), 225 | ('twitter_usage', 'infected_new'), 226 | ('twitter_usage', 'infected_perc_change'), 227 | ('twitter_usage', 'deaths'), 228 | ('twitter_usage', 'deaths_new'), 229 | ('twitter_usage', 'deaths_perc_change'), 230 | 231 | ('restriction', 'infected'), 232 | ('restriction', 'infected_new'), 233 | ('restriction', 'infected_perc_change'), 234 | ('restriction', 'deaths'), 235 | ('restriction', 'deaths_new'), 236 | ('restriction', 'deaths_perc_change'), 237 | 238 | ('over_65', 'twitter_activity'), 239 | ('over_65', 'sentiment'), 240 | ('single_household', 'twitter_activity'), 241 | ('single_household', 'sentiment'), 242 | ('twitter_usage', 'sentiment'), 243 | ] 244 | 245 | edge_threshold = 0.3 246 | 247 | 248 | config = Config() 249 | -------------------------------------------------------------------------------- /source/data_utils.py: -------------------------------------------------------------------------------- 1 | ''' 2 | utility functions related to data 3 | ''' 4 | 5 | import numpy as np 6 | import pandas as pd 7 | 8 | import reverse_geocoder as rg 9 | 10 | from configs import config as cf 11 | 12 | 13 | def reformat_date(date_to_be_formatted): 14 | '''transform column to YYYY-MM-DD''' 15 | 16 | date_split = date_to_be_formatted.split('/') 17 | date_padded_split = [str(item).zfill(2) for item in date_split] 18 | date_formatted = '20{}-{}-{}'.format(date_padded_split[2], 19 | date_padded_split[0], 20 | date_padded_split[1]) 21 | 22 | return(date_formatted) 23 | 24 | 25 | def reformat_dataframe(dataframe_to_be_formatted): 26 | ''' 27 | Groupby (sum) Country & drop 'Province/State', 'Lat', 'Long' 28 | ''' 29 | 30 | # shorten colum name 31 | dataframe_to_be_formatted = dataframe_to_be_formatted.rename( 32 | columns={'Country/Region': 'Country'}, inplace=False 33 | ) 34 | 35 | # drop some columns 36 | dataframe_to_be_formatted = dataframe_to_be_formatted.drop( 37 | columns=['Province/State', 'Lat', 'Long'], axis=0, inplace=False 38 | ) 39 | dataframe_formatted = dataframe_to_be_formatted.groupby(['Country']).sum() 40 | 41 | # change column name format 42 | for column in dataframe_formatted: 43 | dataframe_formatted = dataframe_formatted.rename( 44 | columns={column: reformat_date(column)} 45 | ) 46 | 47 | # rolling window of 2 48 | dataframe_formatted = dataframe_formatted.rolling( 49 | window=3, 50 | win_type=None, 51 | axis=1 52 | ).mean().round( 53 | ).fillna( 54 | value=0 55 | ).astype(int) 56 | 57 | # filter with dates 58 | dataframe_formatted = dataframe_formatted.iloc[ 59 | :, dataframe_formatted.columns <= cf.end_date] 60 | dataframe_formatted = dataframe_formatted.iloc[ 61 | :, dataframe_formatted.columns >= cf.start_date] 62 | 63 | return(dataframe_formatted) 64 | 65 | 66 | def read_covid(data_path, columns='all'): 67 | ''' 68 | read official covid data 69 | ''' 70 | if columns == 'all': 71 | covid = pd.read_csv(data_path) 72 | else: 73 | covid = pd.read_csv(data_path, usecols=columns) 74 | # remove incorrect entry of lat and long zeros 75 | covid = covid[~np.logical_and(covid.Long == 0, covid.Long == 0)] 76 | 77 | return covid 78 | 79 | 80 | def read_tweets(tweets_path): 81 | ''' 82 | read tweets data 83 | ''' 84 | 85 | tweets = pd.read_csv(tweets_path) 86 | tweets.drop_duplicates(inplace=True, subset='id') 87 | 88 | # shorten date and filter with date limits (see configs) 89 | tweets['date'] = tweets['date'].str[0:10] 90 | tweets = tweets[tweets['date'] >= cf.start_date] 91 | tweets = tweets[tweets['date'] <= cf.end_date] 92 | 93 | # format some columns 94 | tweets.rename(columns=cf.tweet_column_shortener_dict, inplace=True) 95 | tweets[['Lat', 'Long']] = np.round(tweets[['Lat', 'Long']], 4) 96 | 97 | # create a new string column called 'Lat_Long' (below is faster than apply) 98 | tweets['Lat_Long'] = tweets.Lat.astype(str).str.cat( 99 | tweets.Long.astype(str), sep='_') 100 | 101 | # add country to tweets data by latitude and longtitude mapping 102 | infected = pd.read_csv(cf.INFECTED_PATH, 103 | usecols=['Lat', 'Long', 'Country/Region']) 104 | 105 | # format some columns 106 | infected.rename(columns={'Country/Region': 'Location'}, inplace=True) 107 | infected[['Lat', 'Long']] = np.round(infected[['Lat', 'Long']], 4) 108 | 109 | # create a new string column called 'Lat_Long' 110 | infected['Lat_Long'] = infected.Lat.astype(str).str.cat( 111 | infected.Long.astype(str), sep='_') 112 | infected.drop(['Lat', 'Long'], axis=1, inplace=True) 113 | 114 | # map location from Lat and Long 115 | tweets['Location'] = tweets['Lat_Long'].map(dict(zip(infected['Lat_Long'], 116 | infected['Location']))) 117 | 118 | print('Tweets dataframe shape={}'.format(tweets.shape)) 119 | return tweets 120 | 121 | 122 | def add_missing_countries(tweets_df): 123 | ''' 124 | Note: this functions work 'inplace' 125 | ''' 126 | 127 | print('{} tweets do not have country information!'.format( 128 | tweets_df['Location'].isna().sum())) 129 | 130 | # get tweets without a country info 131 | no_country = tweets_df[tweets_df['Location'].isna()][ 132 | ['Lat', 'Long']].drop_duplicates() 133 | 134 | # extract coordinates 135 | coordinates = list(no_country.itertuples(index=False, name=None)) 136 | 137 | # map coordinates with countries using an external package 138 | results = rg.search(coordinates) 139 | no_country['found_countries'] = [i['cc'] for i in results] 140 | no_country['found_countries'] = no_country[ 141 | 'found_countries'].map(cf.country_abbr) 142 | no_country['Lat_Long'] = no_country[['Lat', 'Long']].apply( 143 | lambda x: '_'.join(x.map(str)), axis=1) 144 | 145 | # add mapped countries to the original tweets data 146 | tweets_df.loc[tweets_df['Location'].isna(), 'Location'] = list(tweets_df[ 147 | tweets_df['Location'].isna()]['Lat_Long' 148 | ].map( 149 | dict(zip( 150 | no_country['Lat_Long'], no_country['found_countries'] 151 | )))) 152 | tweets_df.drop(['Lat_Long'], axis=1, inplace=True) 153 | 154 | print('{} tweets that do not have country information will be discarded!' 155 | .format(tweets_df['Location'].isna().sum())) 156 | tweets_df = tweets_df[~tweets_df['Location'].isna()] 157 | 158 | return None 159 | -------------------------------------------------------------------------------- /source/eval_utils.py: -------------------------------------------------------------------------------- 1 | ''' 2 | utility functions related to evaluation 3 | ''' 4 | 5 | import json 6 | 7 | from configs import config as cf 8 | 9 | 10 | def save_logs(countries, metrics, dict_name): 11 | ''' 12 | [metrics] : list 13 | [dict_name] : str 14 | ''' 15 | 16 | logs_dict = {'countries': countries, 'metrics': metrics} 17 | logs_json = json.dumps(logs_dict) 18 | f = open('{}/{}.json'.format(cf.LOGS_DIR, dict_name), 'w') 19 | f.write(logs_json) 20 | f.close() 21 | 22 | return None 23 | 24 | 25 | def load_logs(dict_name, return_dict=False): 26 | ''' 27 | [dict_name] : str 28 | [return_dict] : bool 29 | ''' 30 | 31 | with open('{}/{}.json'.format(cf.LOGS_DIR, dict_name)) as logs_json: 32 | logs = json.load(logs_json) 33 | 34 | if return_dict: 35 | return logs 36 | else: 37 | countries, metrics = logs['countries'], logs['metrics'] 38 | return countries, metrics 39 | -------------------------------------------------------------------------------- /source/feature_extraction.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Feature extraction 3 | ''' 4 | 5 | from copy import deepcopy 6 | import warnings 7 | 8 | import numpy as np 9 | import pandas as pd 10 | from tqdm import tqdm 11 | 12 | from configs import config as cf 13 | 14 | 15 | def calculate_change(dataframe_to_be_formatted, clip_min=0): 16 | ''' 17 | increase 18 | ''' 19 | dataframe_formatted = deepcopy(dataframe_to_be_formatted) 20 | for i in range(dataframe_formatted.shape[0]): 21 | dataframe_formatted.iloc[i, :] = np.diff( 22 | dataframe_formatted.iloc[i, :], prepend=0 23 | ) 24 | 25 | # clip nonzero values to 0 26 | if (dataframe_formatted < 0).values.sum(): 27 | warnings.warn('Nonzero change values found!') 28 | dataframe_formatted = dataframe_formatted.clip(lower=clip_min) 29 | 30 | return dataframe_formatted 31 | 32 | 33 | def calculate_percentage_change(dataframe_to_be_formatted, 34 | fillna=True, 35 | smoothing=0.0, 36 | clip_min=0, 37 | replace_inf=100.0): 38 | ''' 39 | relative increase 40 | ''' 41 | dataframe_formatted = deepcopy(dataframe_to_be_formatted) 42 | for i in range(dataframe_formatted.shape[0]): 43 | dataframe_formatted.iloc[i, 1:] = np.array((np.diff( 44 | dataframe_formatted.iloc[i, :], prepend=0 45 | )[1:] + smoothing) / (dataframe_formatted.iloc[i, 0:-1] + smoothing)) 46 | 47 | if fillna: 48 | dataframe_formatted = dataframe_formatted.fillna(0) 49 | 50 | # clip nonzero values to 0 51 | if (dataframe_formatted < 0).values.sum(): 52 | warnings.warn('Nonzero percentage change values found!') 53 | dataframe_formatted = dataframe_formatted.clip(lower=clip_min) 54 | 55 | # clip infinity values to 100 56 | if (dataframe_formatted == np.inf).values.sum(): 57 | warnings.warn('Infinity percentage change values found!') 58 | dataframe_formatted = dataframe_formatted.replace([np.inf], 59 | replace_inf/100.0) 60 | 61 | return dataframe_formatted * 100.0 62 | 63 | 64 | def days_since_first_case(dataframe_to_be_formatted): 65 | ''' 66 | days since first official case 67 | ''' 68 | dataframe_formatted = deepcopy(dataframe_to_be_formatted) 69 | for index, rows in dataframe_formatted.iterrows(): 70 | first_nonzero = (np.array(rows) != 0).argmax(axis=0) 71 | dataframe_formatted.loc[index] = [0] * first_nonzero + list( 72 | range(len(rows)-first_nonzero) 73 | ) 74 | 75 | return dataframe_formatted 76 | 77 | 78 | def is_first_occurance(dataframe_to_be_formatted): 79 | ''' 80 | day of first infection 81 | ''' 82 | dataframe_formatted = deepcopy(dataframe_to_be_formatted) 83 | for index, rows in dataframe_formatted.iterrows(): 84 | first_nonzero = (np.array(rows) != 0).argmax(axis=0) 85 | dataframe_formatted.loc[index] = 0 86 | dataframe_formatted.loc[index].iloc[first_nonzero] = 1 87 | if dataframe_to_be_formatted.loc[index][0] == 0: 88 | dataframe_formatted.loc[index][0] = 0 89 | 90 | return dataframe_formatted 91 | 92 | 93 | def is_infected(dataframe_to_be_formatted): 94 | ''' 95 | 1 if the country has at least 1 confirmed case 96 | ''' 97 | 98 | return (dataframe_to_be_formatted > 0.5).astype(int) 99 | 100 | 101 | def gov_announcement(dataframe_to_be_formatted, country, left_and_right=1): 102 | ''' 103 | government restriction / lockdown announcement 104 | ''' 105 | 106 | dataframe_formatted = deepcopy(dataframe_to_be_formatted) 107 | dataframe_formatted = dataframe_formatted.replace(dataframe_formatted, 0) 108 | if country not in cf.restrictions.keys(): 109 | return dataframe_formatted 110 | col_ind = np.where( 111 | dataframe_formatted.columns == cf.restrictions[country])[0] 112 | if col_ind.shape[0] == 0: 113 | return dataframe_formatted 114 | dataframe_formatted.loc[country][ 115 | col_ind[0]-left_and_right:col_ind[0]+left_and_right + 1] = 1 116 | 117 | return dataframe_formatted 118 | 119 | 120 | def get_feature_matrix(country_counts, covid, mode, country_list): 121 | ''' 122 | [mode] : 'infected' or 'deaths' 123 | ''' 124 | all_merged = [] 125 | for country in tqdm(country_list): 126 | merged = pd.merge( 127 | pd.DataFrame(data=covid.T[country]), 128 | country_counts[country_counts['Location'] == country], 129 | how='outer', 130 | left_index=True, 131 | right_on='date' 132 | ) 133 | merged.drop(['Location'], axis=1, inplace=True) 134 | merged.fillna(value=0, inplace=True) 135 | merged.rename(columns={country: mode}, inplace=True) 136 | merged.reset_index(drop=True, inplace=True) 137 | 138 | # add change 139 | merged = pd.merge( 140 | merged, 141 | pd.DataFrame(data=calculate_change(covid).T[country]), 142 | how='outer', 143 | right_index=True, 144 | left_on='date' 145 | ) 146 | merged.rename(columns={country: '{}_new'.format(mode)}, inplace=True) 147 | 148 | # add percentage change 149 | merged = pd.merge( 150 | merged, 151 | pd.DataFrame(data=calculate_percentage_change(covid).T[country]), 152 | how='outer', 153 | right_index=True, 154 | left_on='date' 155 | ) 156 | merged.rename(columns={country: '{}_perc_change'.format(mode)}, 157 | inplace=True) 158 | 159 | # add government restriction 160 | merged = pd.merge( 161 | merged, 162 | pd.DataFrame(data=gov_announcement(covid, country).T[country]), 163 | how='outer', 164 | right_index=True, 165 | left_on='date' 166 | ) 167 | merged.rename(columns={country: 'restriction'}, 168 | inplace=True) 169 | 170 | # add country stats 171 | merged['over_65'] = cf.over_65[country] 172 | merged['twitter_usage'] = cf.twitter_usage[country] 173 | merged['single_household'] = cf.single_household[country] 174 | 175 | # normalize 176 | for c in ['twitter_activity', mode, '{}_new'.format(mode)]: 177 | merged[c] = merged[c] / cf.population[country] 178 | 179 | merged.sort_values(by=['date'], inplace=True) 180 | all_merged.append(merged) 181 | 182 | return pd.concat(all_merged) 183 | -------------------------------------------------------------------------------- /source/inference.py: -------------------------------------------------------------------------------- 1 | ''' 2 | inference related modules 3 | ''' 4 | 5 | from causalnex.inference import InferenceEngine 6 | 7 | 8 | def marginal_probs(graph, query, observations, verbose=1): 9 | ''' 10 | [graph] : causalnex BayesianNetwork object 11 | [query] : str 12 | [observations] : dict 13 | ''' 14 | 15 | ie = InferenceEngine(graph) 16 | marginals = ie.query(observations) 17 | marg_probs = marginals[query] 18 | 19 | if verbose: 20 | print('Marginal probabilities of "{}" | {} = {}'.format( 21 | query, observations, marg_probs)) 22 | 23 | return marg_probs 24 | -------------------------------------------------------------------------------- /source/sentiment.py: -------------------------------------------------------------------------------- 1 | ''' 2 | laguage & sentiment detection 3 | ''' 4 | 5 | from copy import deepcopy 6 | import numpy as np 7 | from pandarallel import pandarallel 8 | from langdetect import detect 9 | from tqdm import tqdm 10 | from transformers import (pipeline, AutoModelForSequenceClassification, 11 | AutoTokenizer) 12 | 13 | from configs import config as cf 14 | 15 | 16 | def detect_lang(text): 17 | ''' 18 | return language of the text 19 | ''' 20 | try: 21 | return detect(text) 22 | except: 23 | return 'no_lang' 24 | 25 | 26 | def add_lang(dataframe): 27 | ''' 28 | add language as a new column 29 | [dataframe] : pandas dataframe 30 | ''' 31 | df_copy = deepcopy(dataframe) 32 | pandarallel.initialize(progress_bar=True) 33 | df_copy['lang'] = df_copy['text'].parallel_apply(detect_lang) 34 | 35 | return df_copy 36 | 37 | 38 | def add_sentiment(dataframe): 39 | ''' 40 | add sentiment score as a new column, range=[-100,100] 41 | [dataframe] : pandas dataframe 42 | ''' 43 | df_copy = deepcopy(dataframe) 44 | 45 | tokenizer = AutoTokenizer.from_pretrained( 46 | pretrained_model_name_or_path=cf.sentiment_tokenizer_model) 47 | model = AutoModelForSequenceClassification.from_pretrained( 48 | pretrained_model_name_or_path=cf.sentiment_model) 49 | sentiment_analyzer = pipeline('sentiment-analysis', 50 | framework='pt', 51 | model=model, 52 | tokenizer=tokenizer, 53 | device=0) 54 | 55 | df_copy['sentiment'] = np.nan 56 | for row in tqdm(range(df_copy.shape[0])): 57 | if df_copy['lang'].iloc[row] == 'en': 58 | sentiment = sentiment_analyzer(df_copy['text'].iloc[row]) 59 | score = sentiment[0]['score'] 60 | label = sentiment[0]['label'] 61 | if label == 'POSITIVE': 62 | df_copy['sentiment'].iloc[row] = 100 * score 63 | elif label == 'NEGATIVE': 64 | df_copy['sentiment'].iloc[row] = -100 * score 65 | else: 66 | raise ValueError 67 | else: 68 | continue 69 | 70 | return df_copy 71 | -------------------------------------------------------------------------------- /source/train.py: -------------------------------------------------------------------------------- 1 | ''' 2 | training related functions 3 | ''' 4 | 5 | from causalnex.network import BayesianNetwork 6 | 7 | 8 | def train_bn(data, graph): 9 | 10 | bn = BayesianNetwork(graph) 11 | bn = bn.fit_node_states(data) 12 | bn = bn.fit_cpds(data, method='BayesianEstimator', bayes_prior='K2') 13 | 14 | return bn 15 | -------------------------------------------------------------------------------- /source/train_utils.py: -------------------------------------------------------------------------------- 1 | ''' 2 | utility functions related to training 3 | ''' 4 | 5 | from copy import deepcopy 6 | 7 | import numpy as np 8 | from causalnex.discretiser import Discretiser 9 | 10 | from configs import config as cf 11 | 12 | 13 | def calculate_splits_chunks(array, 14 | n_splits=cf.n_levels, 15 | remove_nonzero=True): 16 | ''' 17 | split a given array to equal sized chunks 18 | ''' 19 | 20 | array = np.sort(array) 21 | if remove_nonzero: 22 | array = array[np.nonzero(array)[0]] 23 | splitted = np.array_split(array, n_splits) 24 | 25 | return [i[-1] for i in splitted][:-1] 26 | 27 | 28 | def calculate_splits_perc(array, 29 | percentiles=cf.percentiles, 30 | remove_nonzero=True): 31 | ''' 32 | split a given array by percentiles 33 | ''' 34 | 35 | array = np.array(array) 36 | if remove_nonzero: 37 | array = array[np.nonzero(array)[0]] 38 | 39 | return [np.percentile(array, i) for i in percentiles] 40 | 41 | 42 | def discretize_df(dataframe): 43 | 44 | fit_feats = deepcopy(dataframe) 45 | 46 | for c_n in cf.numerical_columns: 47 | splits = calculate_splits_perc(fit_feats[c_n], 48 | percentiles=cf.percentiles) 49 | fit_feats[c_n] = Discretiser(method='fixed', 50 | numeric_split_points=splits 51 | ).transform(fit_feats[c_n].values) 52 | if cf.n_levels == 2: 53 | fit_feats[c_n] = fit_feats[c_n].map(cf.label_dict_two_cat) 54 | if cf.n_levels == 3: 55 | fit_feats[c_n] = fit_feats[c_n].map(cf.label_dict_three_cat) 56 | if cf.n_levels == 4: 57 | fit_feats[c_n] = fit_feats[c_n].map(cf.label_dict_four_cat) 58 | 59 | for c_s in cf.stat_numerical_columns: 60 | fit_feats[c_s] = Discretiser(method='fixed', 61 | numeric_split_points=cf.cut_offs[c_s] 62 | ).transform(fit_feats[c_s].values) 63 | fit_feats[c_s] = fit_feats[c_s].map(cf.label_dict_two_cat) 64 | 65 | fit_feats['sentiment'].loc[fit_feats['sentiment'] < 0] = -1 # neg 66 | fit_feats['sentiment'].loc[fit_feats['sentiment'] >= 0] = 1 # pos 67 | fit_feats['sentiment'] = fit_feats['sentiment'].map({-1: 'neg', 1: 'pos'}) 68 | 69 | return fit_feats 70 | --------------------------------------------------------------------------------