Создание набора данных таймсерий из API с использованием Pandas - PullRequest
0 голосов
/ 06 мая 2020

Я создаю набор данных, который в конечном итоге будет использован для создания интерактивного онлайн-приложения для визуализации данных с Da sh.

Это мой первый проект с Python (и программированием в целом), и Я пытаюсь решить, как лучше go получать, хранить и обновлять данные для набора данных.

Это API, который я использую: https://covid19api.com/

документация: https://documenter.getpostman.com/view/10808728/SzS8rjbc?version=latest

Я написал некоторый код, который извлекает данные, которые мне нужны для каждой страны, и манипулирует ими для создания серии, которая мне нужна

# Import the libraries
import requests

import pandas as pd
import numpy as np
from pandas import Series, DataFrame
from pandas import json_normalize

from datetime import datetime

import matplotlib.pyplot as plt


url = 'https://api.covid19api.com/total/dayone/country/ireland'
data = requests.get(url)

# Store the API response in a variable.
available_data = data.json()
df_ire = json_normalize(available_data)

# rename the date to datetime
df_ire = df_ire.rename(columns={"Date" : "datetime"})

#convert the data to datetime format
df_ire["datetime"] = pd.to_datetime(df_ire["datetime"])

# Create Daily new cases column & SMA
df_ire["New Cases"] = df_ire['Confirmed'].diff()
df_ire["SMA_10 New Cases"] = df_ire["New Cases"].rolling(window=10).mean()

# Create Daily new deaths column & SMA
df_ire["New Deaths"] = df_ire['Deaths'].diff()
df_ire["SMA_10 New Deaths"] = df_ire["New Deaths"].rolling(window=10).mean()

df_ire.fillna(0)

#set datetime as index
df_ire.set_index('datetime')

#Plot New Cases
fig, ax = plt.subplots(figsize=(15,7))
plt.grid(False)
plt.plot(df_ire["SMA_10 New Cases"], label="New Cases - 10-Day Moving Average", 
         color = "orange", linewidth = 4 )
ax.bar(df_ire.index, df_ire["New Cases"], label = "Daily New Confirmed Cases")

ax.set(xlabel='Days Since First Confirmed Case', ylabel='Number of Infections',
       title='Ireland: Average vs Daily New Cases')

fig.autofmt_xdate()

plt.legend(loc=2);

plt.savefig('ireland_avg_vs_daily_cases', dpi = 1067, bbox_inches='tight' )

На данный момент я просто работаю с данными для одной страны и использую matplotlib, поскольку я лучше всего понимаю, как представить и обработать данные. Вот пример того, что я сделал до сих пор: chart

Готовый проект должен выглядеть примерно так, но со скоростью изменения для всех стран: https://dash-gallery.plotly.host/dash-opioid-epidemic/

Прежде всего, API - это проект сообщества, находящийся в разработке, и я не хочу перегружать их систему запросами, поэтому я пытаюсь структурировать свой проект так, чтобы минимизировать количество нагрузки, которую я положил на их систему. Я - попросту - не знаю, какие хорошие / плохие практики в отношении использования API, и я не хочу быть «этим парнем».

Как я сказал выше, мне также нужно подумать о хранении данных и их обновлении через определенные промежутки времени. Это данные временных рядов для 248 стран и записи нескольких переменных, все из которых нужно будет обрабатывать в pandas и регулярно добавлять. Должен ли я создать один массивный фрейм данных? Должен ли я создать фрейм данных для каждой страны, каждой переменной?

После того, как я создал набор данных, я надеюсь обновить и добавить его, используя код, аналогичный приведенному выше, используя этот вызов api: https://api.covid19api.com/summary

Это хороший план и как он должен выглядеть?

Я планирую разместить на Heroku (или что-то подобное), когда он будет готов.

Большое спасибо, если вы все еще читаете этот момент. Я знаю, что это очень объемный пост, и я задаю много вопросов в одном go. Я весь день пытался думать о том, как поступить с этим, и знаю, что мне нужно принять некоторые фундаментальные решения, чтобы продолжить. Любая помощь будет принята с благодарностью.

...