Определение функций для фильтрации и извлечения данных pandas и построения графиков на географических pandas графиках - PullRequest
0 голосов
/ 20 марта 2020

Я изучал различные наборы данных COVID-19 и проводил анализ. Ниже приведена «очищенная» версия моего кода. Я работал в Google Colab, но должен работать на любом компьютере с доступными (проверенными) модулями.

Вопросы заранее:

  1. Как создать функцию моей методики извлечения данных, как я делаю ниже для каждой страны или штата США? Моя техника обозначена ниже с помощью Моя техника

  2. Как отобразить (пузырьковый график) данные на географических pandas картах? Я хотел бы создать новую карту для каждой даты. Затем создайте mov ie, но у меня не так уж далеко.

Импорт модулей

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
#%matplotlib inline
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from IPython import display
from ipywidgets import interact, widgets
from datetime import datetime, timedelta
#from google.colab import files

Некоторые параметры настройки

chartcol='red'
plt.rcParams['figure.figsize'] = [15, 5]

Я использую набор данных Центра системной науки и техники Университета Джона Хопкинса (JHU CSSE), который обновляется каждую ночь (ежедневно?).

# Get the data 
#Read Data for Cases, Deaths and Recoveries

ConfirmedCases_raw=pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv')
Deaths_raw=pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv')
Recoveries_raw=pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv')
    plt.rcParams['figure.figsize'] = [15, 5]

Здесь я создаю список строк даты, которые соответствуют именам столбцов данных временных рядов. Список заканчивается «вчера», потому что набор данных не обновляется до «сегодня».

#This produces a list of strings that matches the column names in the COVID-10 time series.
# Will use it to extract data to build country and state data later.

today = datetime.now()
today2=date.today()
yesterday = today2 - timedelta(days = 1)
covid_epoch=date(2020, 1, 22) 


delta = yesterday - covid_epoch
timeline=[]
for i in range(delta.days + 1):
    #day = sdate + timedelta(days=i)
    day = covid_epoch + timedelta(days=i)
    timeline.append(day.strftime("%-m/%-d/%y"))

Теперь я использую свою «технику», чтобы извлечь данные временных рядов так, как я могу их использовать. Я хотел бы иметь возможность сделать это с помощью функции.

#Extracts data from csv file into time column and value column
#Creates a list of values from each time column
#Consider using melt to do this. How?
#Create a function to do this. How?

Моя техника: Блок ниже - это то, что я хочу превратить в функцию

time = [];value = [];country=[];province= []
col_value = list(ConfirmedCases_raw.columns)
for i in timeline:
    time.append(i)
    value.append(ConfirmedCases_raw[i].sum())  

Создание базы данных для всех случаев по всему миру. Я заполняю фрейм данных значениями сумм для всех стран для «мировых» фреймов данных, «времени» и «значения».

world = pd.DataFrame({'Timeline':time,'Covid-19 impact':value})

#Plot the world data

plt.plot(world['Timeline'],world['Covid-19 impact'])
plt.xticks(rotation=45);

plt.suptitle('World COVID-19 Confirmed Cases', fontsize=20)
plt.xlabel('Date', fontsize=18);
plt.ylabel('Count', fontsize=16);
plt.grid(color='b', ls = '-.', lw = 0.25)

enter image description here

Снова , сделайте это, чтобы создать американский фрейм данных. Отфильтрованные Подтвержденные случаи для Соединенных Штатов

us_confirmed_raw=ConfirmedCases_raw[ConfirmedCases_raw['Country/Region']=='US']

Вот мой блок извлечения данных снова:

time = [];value = [];country=[];province= []
col_value = list(us_confirmed_raw.columns)
for i in timeline:
    time.append(i)
    value.append(us_confirmed[i].sum())

И создание кадра данных и нанесение данных США

us_confirmed = pd.DataFrame({'Timeline':time,'Covid-19 impact':value})
plt.plot(us_confirmed['Timeline'],us_confirmed['Covid-19 impact'])
plt.xticks(rotation=45);
plt.suptitle('USA COVID-19 Confirmed Cases', fontsize=20)
plt.xlabel('Date', fontsize=18);
plt.ylabel('Count', fontsize=16);
plt.grid(color='r', ls = '-.', lw = 0.55) 

enter image description here

И снова для Нью-Мексико.

nm_confirmed=us_confirmed_raw[us_confirmed_raw['Province/State']=='New Mexico']

time = [];value = [];country=[];province= []
col_value = list(nm_confirmed.columns)
for i in timeline:
    time.append(i)
    value.append(nm_confirmed[i].sum())

nm = pd.DataFrame({'Timeline':time,'Covid-19 impact':value})
plt.plot(nm['Timeline'],nm['Covid-19 impact'],linestyle='--', marker='o')
plt.xticks(rotation=45);
plt.suptitle('New Mexico COVID-19 Confirmed Cases', fontsize=20)
plt.xlabel('Date', fontsize=18);
plt.ylabel('Count', fontsize=16);
plt.grid(color='r', ls = '-.', lw = 0.25)

Ваше право, может быть, слишком много примеров.

Моя следующая проблема - создание карт. Ниже я использую geo pandas, чтобы создать карту и нанести данные.

!pip install geopandas;
import geopandas

поместите данные Нью-Мексико в географический pandas фрейм данных:

gdf = geopandas.GeoDataFrame(
    nm_confirmed, geometry=geopandas.points_from_xy(nm_confirmed.Long, nm_confirmed.Lat))

и нанесите местоположение Нью-Мексико. Я не могу понять, как отобразить данные COVID-19 на этой карте.

# Creates a map of the world
# Show the location of new mexico

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))

ax = world[world.continent == 'North America'].plot(
    color='white', edgecolor='black')

gdf.plot(ax=ax, color='red')

enter image description here

1 Ответ

0 голосов
/ 21 марта 2020

Вот мой ответ на вопрос 1:

Эта функция 'get_state' возвращает данные о состоянии в файлах данных (отфильтрованные США):

def get_state(state):
  state_confirmed=us_confirmed_raw[us_confirmed_raw['Province/State']==state]
  col_value = list(state_confirmed.columns)
  time = [];value = [];
      for i in timeline:
        time.append(i)
        value.append(state_confirmed[i].sum())
  us_state = pd.DataFrame({'Timeline':time,'Covid-19 impact':value})
  return us_state   

, и ее можно использовать напрямую

state='Texas'
plt.plot(get_state(state).Timeline,get_state(state)['Covid-19 impact'],linestyle='--', marker='o')
plt.xticks(rotation=45);
plt.suptitle(state+' COVID-19 Confirmed Cases', fontsize=20)
plt.xlabel('Date', fontsize=18);
plt.ylabel('Count', fontsize=16);
plt.grid(color='r', ls = '-.', lw = 0.25)

, который производит этот график,

enter image description here

...