Быстрый и надёжный хостинг на SSD-дисках от 165р в месяц   •   Реклама
954 просм
2 комм
Поделиться:

Получаем статистику заражений коронавирусом COVID-19 (2019-nCoV) на PHP

Мне трудно представить человека, который в настоящее время не в курсе «гуляющего» по планете коронавируса COVID-19 (2019-nCoV). Интернет переполнен информацией на этот счет, и самая популярная (на мой взгляд) – это статистика. Текстовая статистика распространения коронавируса в отдельных странах и регионах, а также общая во всем мире и в виде интерактивных карт.

Одним из источников таких данных является проект системных наук и инженерии (CSSE) при университете Джона Хопкинса.

Вся собираемая в одном месте из различных источников информация, которая, кстати говоря, доступна для ознакомления на GitHub, представлена здесь в виде интерактивной карты.

Получаем статистику заражений коронавирусом COVID-19 (2019-nCoV) на PHP

Данная тема является сейчас как никогда актуальной, и многие зарубежные разработчики уже успели ее подхватить. Не будем же отставать от них и рассмотрим варианты обработки доступной на данный момент информации.

Все данные, как я уже отметил выше, доступны в репозитории CSSEGISandData в трех файлах: time_series_19-covid-Confirmed.csv (зараженные), time_series_19-covid-Deaths.csv (погибшие) и time_series_19-covid-Recovered.csv (выздоровевшие) в виде идентичных (имеющих одинаковую структуру) таблиц. И прежде чем начать обработку информации, нужно все эти три файла собрать воедино и удобно структурировать.

Сразу хочу отметить, что все статистические данные принадлежат университету Джонса Хопкинса и предоставляются общественности исключительно в образовательных и академических целях.

Ознакомившись с таблицами, для себя я определил следующую структуру данных, на примере 1 строки:

[2] => [
	'Country/Region' => 'Thailand',
	'Province/State' => '',
	'Lat' => '15',
	'Long' => '101',
	'Confirmed' => [
		'1/22/20' => 2
		...
	],
	'Deaths' => [
		'1/22/20' => 0
		...
	],
	'Recovered' => [
		'1/22/20' => 0
		...
	]
]

Здесь:

  1. Country/Region – название страны или региона.
  2. Province/State – название провинции или штата.
  3. Lat и Long – широта и долгота (географические координаты).
  4. Confirmed – массив числа зараженных по дням в виде «дата в формате месяц/день/год => число».
  5. Deaths – массив числа погибших по дням в том же виде, что и Confirmed.
  6. Recovered – массив числа выздоровевших по дням в том же виде, что и Confirmed.

Индекс массива – порядковый номер страны в таблице, каждое последнее значение «Confirmed», «Deaths» и «Recovered» – актуальный показатель на данный момент.

Функция, которая представляет информацию в таком виде, выглядит следующим образом:

function get_data_covid_19() {

	$cache_time_out = '21600'; // Время жизни кэша в секундах
	$file_cache = __DIR__.'/data_covid_19.json'; // Файл кэша

	if(!is_file($file_cache) || filemtime($file_cache) < (time() - $cache_time_out)) {

		$data_array = []; // Общий массив с данными из всех CSV

		$data_url = [
			'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv',
			'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv',
			'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv'
		];

		for($k = 0; $k < 3; $k++) {

			$i = 1;

			if(($data_csv = fopen($data_url[$k], 'r')) !== false) {

				while(($data = fgetcsv($data_csv, 0, ',')) !== false) {
					
					if($i == 1) {

						$days_name_array = []; // Массив существующих дат из CSV

						for($z = 4; $z < count($data); $z++) {
							
							if($data[$z] != '') {

								$days_name_array[$z] = htmlspecialchars(strip_tags($data[$z]));

							}
						
						}

					} else {

						$days_array = []; // Статистика по дням

						for($z = 4; $z < count($data); $z++) {

							if($data[$z] != '') {

								$days_array[$days_name_array[$z]] = intval($data[$z]);

							}

						}

						if($k == 0) {

							$data_array[$i] = [
								'Country/Region' => htmlspecialchars(strip_tags($data[1])),
								'Province/State' => htmlspecialchars(strip_tags($data[0])),
								'Lat' => htmlspecialchars(strip_tags($data[2])),
								'Long' => htmlspecialchars(strip_tags($data[3])),
								'Confirmed' => $days_array
							];

						} else {
							
							$title_days_array = 'Deaths';

							if($k == 2) {

								$title_days_array = 'Recovered';

							}

							$data_array[$i] += [
								$title_days_array => $days_array
							];

						}

					}

					$i++;

				}

				fclose($data_csv);

			}

		}

		file_put_contents($file_cache, json_encode($data_array));

	}

	$data = file_get_contents($file_cache);
	$data = json_decode($data, true);

	return $data;

}

Основные моменты я пометил в коде. Данные кэшируются на 6 часов. Функцию обязательно вставлять 1 раз в верх вашего PHP-файла. Теперь, имея всю информацию в удобном виде, рассмотрим несколько простых случаев ее применения.

Получение общей краткой мировой статистики заражений коронавирусом COVID-19 (2019-nCoV) на PHP

Общая краткая мировая статистика включает в себя 3 показателя – это число зараженных, число погибших и, соответственно, выздоровевших.

Получить точечно каждую из них можно с помощью следующей функции:

function get_total_data_covid_19($data_type, $data_array) {

	$allow_data_type = array_flip(['Confirmed', 'Deaths', 'Recovered']);

	$total = 0;

	if(isset($allow_data_type[$data_type])) {

		foreach($data_array as $key => $value) {
			
			$total = $total + end($value[$data_type]);

		}

	}

	return number_format($total, 0, '', ' ');

}

Пример ее использования:

echo 'Число зараженных: '.get_total_data_covid_19('Confirmed', get_data_covid_19());

Допустимые значения первого параметра в вызове функции: Confirmed, Deaths, Recovered.

Получение общей полной мировой статистики заражений коронавирусом COVID-19 (2019-nCoV) на PHP

Теперь попробуем сформировать таблицу со статистикой в виде «Страна/регион (провинция/штат, если он есть) – Число зараженных – Число погибших – Число выздоровевших» с помощью следующей функции:

function get_country_province_data_covid_19($data_array) {

	usort($data_array, function($a, $b) {
		
		return strcmp($a['Country/Region'], $b['Country/Region']);
	
	});

	$total_all_country = '

		<table>

			<tr>
				<td><b>Страна</b></td>
				<td><b>Зараженных</b></td>
				<td><b>Погибших</b></td>
				<td><b>Выздоровевших</b></td>
			</tr>

	';

	foreach($data_array as $key => $value) {
		
		if(end($value['Confirmed']) > 0 || end($value['Deaths']) > 0 || end($value['Recovered']) > 0) {

			if($value['Province/State'] != '') {

				$value['Country/Region'] .= ' ('.$value['Province/State'].')';

			}

			$total_all_country .= '

				<tr>
					<td>'.$value['Country/Region'].'</td>
					<td>'.number_format(end($value['Confirmed']), 0, '', ' ').'</td>
					<td>'.number_format(end($value['Deaths']), 0, '', ' ').'</td>
					<td>'.number_format(end($value['Recovered']), 0, '', ' ').'</td>
				</tr>

			';

		}

	}

	$total_all_country .= '

		</table>

	';

	return $total_all_country;

}

Вызывается без параметров (кроме массива данных):

echo get_country_province_data_covid_19(get_data_covid_19());

Данные сортируются по алфавиту и выводятся только по тем странам, где хотя бы одно из значений (Confirmed, Deaths, Recovered) больше нуля.

Получение общей краткой мировой статистики заражений коронавирусом COVID-19 (2019-nCoV) на конкретный день на PHP

Общую таблицу по странам мы получили, теперь давайте попробуем поменять условия задачи и выведем статистику на конкретный день.

В этом нам поможет следующая функция:

function get_total_day_data_covid_19($date, $data_type, $data_array) {

	$allow_data_type = array_flip(['Confirmed', 'Deaths', 'Recovered']);

	$total = 0;

	if(isset($allow_data_type[$data_type])) {

		foreach($data_array as $key => $value) {
			
			$total = $total + $value[$data_type][$date];

		}

	}

	return number_format($total, 0, '', ' ');

}

Пример ее использования:

echo 'Число погибших на 10 марта: '.get_total_day_data_covid_19('3/10/20', 'Deaths', get_data_covid_19());

Допустимые значения первого параметра в вызове функции: дата в формате «месяц/число/год в сокращении», допустимые значения второго параметра: Confirmed, Deaths, Recovered.

Точечное получение общей краткой статистики заражений коронавирусом COVID-19 (2019-nCoV) по конкретной стране/региону на PHP

Ну и в логическое завершение я хотел бы показать простой пример того, как получить информацию только по нужной вам стране с провинцией/штатом (если они есть).

Функция для решения этой задачи:

function get_total_one_country_province_data_covid_19($country_province, $data_type, $data_array) {

	$allow_data_type = array_flip(['Confirmed', 'Deaths', 'Recovered']);

	$total = 0;

	if(isset($allow_data_type[$data_type]) && isset($data_array[$country_province])) {

		$total = end($data_array[$country_province][$data_type]);

	}

	return number_format($total, 0, '', ' ');

}

И пример ее вызова:

echo 'Зараженных в Thailand: '.get_total_one_country_province_data_covid_19('2', 'Confirmed', get_data_covid_19());

Допустимые значения первого параметра в вызове функции: порядковый номер страны по таблице, допустимые значения второго параметра: Confirmed, Deaths, Recovered.

Для лучшего ориентира собрал для вас список в виде «Страна/регион (провинция/штат, если он есть) – порядковый номер по таблице»:

Thailand - 2
Japan - 3
Singapore - 4
Nepal - 5
Malaysia - 6
Canada (British Columbia) - 7
Australia (New South Wales) - 8
Australia (Victoria) - 9
Australia (Queensland) - 10
Cambodia - 11
Sri Lanka - 12
Germany - 13
Finland - 14
United Arab Emirates - 15
Philippines - 16
India - 17
Italy - 18
Sweden - 19
Spain - 20
Australia (South Australia) - 21
Belgium - 22
Egypt - 23
Australia (From Diamond Princess) - 24
Lebanon - 25
Iraq - 26
Oman - 27
Afghanistan - 28
Bahrain - 29
Kuwait - 30
Algeria - 31
Croatia - 32
Switzerland - 33
Austria - 34
Israel - 35
Pakistan - 36
Brazil - 37
Georgia - 38
Greece - 39
North Macedonia - 40
Norway - 41
Romania - 42
Estonia - 43
San Marino - 44
Belarus - 45
Iceland - 46
Lithuania - 47
Mexico - 48
New Zealand - 49
Nigeria - 50
Australia (Western Australia) - 51
Ireland - 52
Luxembourg - 53
Monaco - 54
Qatar - 55
Ecuador - 56
Azerbaijan - 57
Armenia - 58
Dominican Republic - 59
Indonesia - 60
Portugal - 61
Andorra - 62
Australia (Tasmania) - 63
Latvia - 64
Morocco - 65
Saudi Arabia - 66
Senegal - 67
Argentina - 68
Chile - 69
Jordan - 70
Ukraine - 71
Hungary - 72
Australia (Northern Territory) - 73
Liechtenstein - 74
Poland - 75
Tunisia - 76
Bosnia and Herzegovina - 77
Slovenia - 78
South Africa - 79
Bhutan - 80
Cameroon - 81
Colombia - 82
Costa Rica - 83
Peru - 84
Serbia - 85
Slovakia - 86
Togo - 87
Malta - 88
Martinique - 89
Bulgaria - 90
Maldives - 91
Bangladesh - 92
Paraguay - 93
Canada (Ontario) - 94
Canada (Alberta) - 95
Canada (Quebec) - 96
Albania - 97
Cyprus - 98
Brunei - 99
US (Washington) - 100
US (New York) - 101
US (California) - 102
US (Massachusetts) - 103
US (Diamond Princess) - 104
US (Grand Princess) - 105
US (Georgia) - 106
US (Colorado) - 107
US (Florida) - 108
US (New Jersey) - 109
US (Oregon) - 110
US (Texas) - 111
US (Illinois) - 112
US (Pennsylvania) - 113
US (Iowa) - 114
US (Maryland) - 115
US (North Carolina) - 116
US (South Carolina) - 117
US (Tennessee) - 118
US (Virginia) - 119
US (Arizona) - 120
US (Indiana) - 121
US (Kentucky) - 122
US (District of Columbia) - 123
US (Nevada) - 124
US (New Hampshire) - 125
US (Minnesota) - 126
US (Nebraska) - 127
US (Ohio) - 128
US (Rhode Island) - 129
US (Wisconsin) - 130
US (Connecticut) - 131
US (Hawaii) - 132
US (Oklahoma) - 133
US (Utah) - 134
Burkina Faso - 135
Holy See - 136
Mongolia - 137
Panama - 138
US (Kansas) - 139
US (Louisiana) - 140
US (Missouri) - 141
US (Vermont) - 142
US (Alaska) - 143
US (Arkansas) - 144
US (Delaware) - 145
US (Idaho) - 146
US (Maine) - 147
US (Michigan) - 148
US (Mississippi) - 149
US (Montana) - 150
US (New Mexico) - 151
US (North Dakota) - 152
US (South Dakota) - 153
US (West Virginia) - 154
US (Wyoming) - 155
China (Hubei) - 156
Iran - 157
Korea, South - 158
France (France) - 159
China (Guangdong) - 160
China (Henan) - 161
China (Zhejiang) - 162
China (Hunan) - 163
China (Anhui) - 164
China (Jiangxi) - 165
China (Shandong) - 166
Cruise Ship (Diamond Princess) - 167
China (Jiangsu) - 168
China (Chongqing) - 169
China (Sichuan) - 170
China (Heilongjiang) - 171
Denmark (Denmark) - 172
China (Beijing) - 173
China (Shanghai) - 174
China (Hebei) - 175
China (Fujian) - 176
China (Guangxi) - 177
China (Shaanxi) - 178
China (Yunnan) - 179
China (Hainan) - 180
China (Guizhou) - 181
China (Tianjin) - 182
China (Shanxi) - 183
China (Gansu) - 184
China (Hong Kong) - 185
China (Liaoning) - 186
China (Jilin) - 187
Czechia - 188
China (Xinjiang) - 189
China (Inner Mongolia) - 190
China (Ningxia) - 191
Taiwan* - 192
Vietnam - 193
Russia - 194
China (Qinghai) - 195
China (Macau) - 196
Moldova - 197
Bolivia - 198
Denmark (Faroe Islands) - 199
France (St Martin) - 200
Honduras - 201
United Kingdom (Channel Islands) - 202
Canada (New Brunswick) - 203
China (Tibet) - 204
Congo (Kinshasa) - 205
Cote d'Ivoire - 206
France (Saint Barthelemy) - 207
Jamaica - 208
Reunion - 209
Turkey - 210
United Kingdom (Gibraltar) - 211
US (Kitsap, WA) - 212
US (Solano, CA) - 213
US (Santa Cruz, CA) - 214
US (Napa, CA) - 215
US (Ventura, CA) - 216
US (Worcester, MA) - 217
US (Gwinnett, GA) - 218
US (DeKalb, GA) - 219
US (Floyd, GA) - 220
US (Fayette, GA) - 221
US (Gregg, TX) - 222
US (Monmouth, NJ) - 223
US (Burlington, NJ) - 224
US (Camden, NJ) - 225
US (Passaic, NJ) - 226
US (Union, NJ) - 227
US (Eagle, CO) - 228
US (Larimer, CO) - 229
US (Arapahoe, CO) - 230
US (Gunnison, CO) - 231
US (Kane, IL) - 232
US (Monroe, PA) - 233
US (Philadelphia, PA) - 234
US (Norfolk, VA) - 235
US (Arlington, VA) - 236
US (Spotsylvania, VA) - 237
US (Loudoun, VA) - 238
US (Prince George's, MD) - 239
US (Pottawattamie, IA) - 240
US (Camden, NC) - 241
US (Pima, AZ) - 242
US (Noble, IN) - 243
US (Adams, IN) - 244
US (Boone, IN) - 245
US (Dane, WI) - 246
US (Pierce, WI) - 247
US (Cuyahoga, OH) - 248
US (Weber, UT) - 249
US (Bennington County, VT) - 250
US (Carver County, MN) - 251
US (Charlotte County, FL) - 252
US (Cherokee County, GA) - 253
US (Collin County, TX) - 254
US (Jefferson County, KY) - 255
US (Jefferson Parish, LA) - 256
US (Shasta County, CA) - 257
US (Spartanburg County, SC) - 258
US (Harrison County, KY) - 259
US (Johnson County, IA) - 260
US (Berkshire County, MA) - 261
US (Davidson County, TN) - 262
US (Douglas County, OR) - 263
US (Fresno County, CA) - 264
US (Harford County, MD) - 265
US (Hendricks County, IN) - 266
US (Hudson County, NJ) - 267
US (Johnson County, KS) - 268
US (Kittitas County, WA) - 269
US (Manatee County, FL) - 270
US (Marion County, OR) - 271
US (Okaloosa County, FL) - 272
US (Polk County, GA) - 273
US (Riverside County, CA) - 274
US (Shelby County, TN) - 275
US (St. Louis County, MO) - 276
US (Suffolk County, NY) - 277
US (Ulster County, NY) - 278
US (Volusia County, FL) - 279
US (Fairfax County, VA) - 280
US (Rockingham County, NH) - 281
US (Washington, D.C.) - 282
US (Montgomery County, PA) - 283
US (Alameda County, CA) - 284
US (Broward County, FL) - 285
US (Lee County, FL) - 286
US (Pinal County, AZ) - 287
US (Rockland County, NY) - 288
US (Saratoga County, NY) - 289
US (Charleston County, SC) - 290
US (Clark County, WA) - 291
US (Cobb County, GA) - 292
US (Davis County, UT) - 293
US (El Paso County, CO) - 294
US (Honolulu County, HI) - 295
US (Jackson County, OR ) - 296
US (Jefferson County, WA) - 297
US (Kershaw County, SC) - 298
US (Klamath County, OR) - 299
US (Madera County, CA) - 300
US (Pierce County, WA) - 301
US (Tulsa County, OK) - 302
US (Douglas County, CO) - 303
US (Providence County, RI) - 304
US (Chatham County, NC) - 305
US (Delaware County, PA) - 306
US (Douglas County, NE) - 307
US (Fayette County, KY) - 308
US (Marion County, IN) - 309
US (Middlesex County, MA) - 310
US (Nassau County, NY) - 311
US (Ramsey County, MN) - 312
US (Washoe County, NV) - 313
US (Wayne County, PA) - 314
US (Yolo County, CA) - 315
US (Santa Clara County, CA) - 316
US (Clark County, NV) - 317
US (Fort Bend County, TX) - 318
US (Grant County, WA) - 319
US (Santa Rosa County, FL) - 320
US (Williamson County, TN) - 321
US (New York County, NY) - 322
US (Montgomery County, MD) - 323
US (Suffolk County, MA) - 324
US (Denver County, CO) - 325
US (Summit County, CO) - 326
US (Bergen County, NJ) - 327
US (Harris County, TX) - 328
US (San Francisco County, CA) - 329
US (Contra Costa County, CA) - 330
US (Orange County, CA) - 331
US (Norfolk County, MA) - 332
US (Maricopa County, AZ) - 333
US (Wake County, NC) - 334
US (Westchester County, NY) - 335
US (Grafton County, NH) - 336
US (Hillsborough, FL) - 337
US (Placer County, CA) - 338
US (San Mateo, CA) - 339
US (Sonoma County, CA) - 340
US (Umatilla, OR) - 341
US (Fulton County, GA) - 342
US (Washington County, OR) - 343
US (Snohomish County, WA) - 344
US (Humboldt County, CA) - 345
US (Sacramento County, CA) - 346
US (San Diego County, CA) - 347
US (San Benito, CA) - 348
US (Los Angeles, CA) - 349
US (King County, WA) - 350
US (Cook County, IL) - 351
US (Skagit, WA) - 352
US (Thurston, WA) - 353
US (Island, WA) - 354
US (Whatcom, WA) - 355
US (Marin, CA) - 356
US (Calaveras, CA) - 357
US (Stanislaus, CA) - 358
US (San Joaquin, CA) - 359
US (Essex, MA) - 360
US (Charlton, GA) - 361
US (Collier, FL) - 362
US (Pinellas, FL) - 363
US (Alachua, FL) - 364
US (Nassau, FL) - 365
US (Pasco, FL) - 366
US (Dallas, TX) - 367
US (Tarrant, TX) - 368
US (Montgomery, TX) - 369
US (Middlesex, NJ) - 370
US (Jefferson, CO) - 371
US (Multnomah, OR) - 372
US (Polk, OR) - 373
US (Deschutes, OR) - 374
US (McHenry, IL) - 375
US (Lake, IL) - 376
US (Bucks, PA) - 377
US (Hanover, VA) - 378
US (Lancaster, SC) - 379
US (Sullivan, TN) - 380
US (Johnson, IN) - 381
US (Howard, IN) - 382
US (St. Joseph, IN) - 383
US (Knox, NE) - 384
US (Stark, OH) - 385
US (Anoka, MN) - 386
US (Olmsted, MN) - 387
US (Summit, UT) - 388
US (Fairfield, CT) - 389
US (Litchfield, CT) - 390
US (Orleans, LA) - 391
US (Pennington, SD) - 392
US (Beadle, SD) - 393
US (Charles Mix, SD) - 394
US (Davison, SD) - 395
US (Minnehaha, SD) - 396
US (Bon Homme, SD) - 397
US (Socorro, NM) - 398
US (Bernalillo, NM) - 399
US (Oakland, MI) - 400
US (Wayne, MI) - 401
US (New Castle, DE) - 402
Cuba - 403
Guyana - 404
Australia (Australian Capital Territory) - 405
United Kingdom (United Kingdom) - 406
Kazakhstan - 407
France (French Polynesia) - 408
Guadeloupe - 409
Canada (Manitoba) - 410
Canada (Saskatchewan) - 411
Ethiopia - 412
Sudan - 413
Guinea - 414
Aruba - 415
Canada (Grand Princess) - 416
Kenya - 417
Antigua and Barbuda - 418
US (Alabama) - 419
Uruguay - 420
Ghana - 421
US (Puerto Rico) - 422
Jersey - 423
Namibia - 424
Seychelles - 425
Trinidad and Tobago - 426
Venezuela - 427
Eswatini - 428
Gabon - 429
Guatemala - 430
Guernsey - 431
Mauritania - 432
Rwanda - 433
Saint Lucia - 434
Saint Vincent and the Grenadines - 435
Suriname - 436
occupied Palestinian territory - 437
France (French Guiana) - 438
US (Guam) - 439
Kosovo - 440
Canada (Newfoundland and Labrador) - 441
Canada (Prince Edward Island) - 442
Central African Republic - 443
Congo (Brazzaville) - 444
Equatorial Guinea - 445
France (Mayotte) - 446
Uzbekistan - 447
Netherlands (Netherlands) - 448
French Guiana - 449
Canada (Nova Scotia) - 450
France (Guadeloupe) - 451
Guam - 452
Puerto Rico - 453
Benin - 454
Greenland - 455
Liberia - 456
Mayotte - 457
Netherlands (Curacao) - 458
Republic of the Congo - 459
Somalia - 460
Tanzania - 461
The Bahamas - 462
US (Virgin Islands) - 463
United Kingdom (Cayman Islands) - 464

Информация актуальна на момент написания статьи.

В целом, говоря о простоте примеров, хочется отметить, что самым сложным во всех случаях было первоначальное структурирование информации из источника, а дальше – дело техники.

Надеюсь, вся это обзорная статья найдет свое место при реализации самых разных ваших идей.

Остались вопросы? Задать их можете в комментариях под данной статьей.

2
комментария
Форма комментирования этой статьи скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    8
      •  Пользователь
    30 мар в 11:12

    Было бы круто видеть это в виде плагина для DLE Хотя бы с минимальными возможностями

    • 0
    2
      •  Пользователь
    27 мар в 00:40

    Можете сделать этого скрипт модуль для DLE? желательно для всей версии. спасибо

Подняться наверх
«Pandoge» - помощник вебмастера