From 859109da17d94423b9db3dbe2bd4511982da91a8 Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 09:34:56 -0400
Subject: [PATCH 01/18] Refactor two functions into a DailyReports class with
one function
---
app/utils/get_data.py | 49 +++++++++++++++----------------------------
1 file changed, 17 insertions(+), 32 deletions(-)
diff --git a/app/utils/get_data.py b/app/utils/get_data.py
index 48a4dd6..e8d6288 100644
--- a/app/utils/get_data.py
+++ b/app/utils/get_data.py
@@ -27,38 +27,23 @@ def get_data_lookup_table() -> Dict[str, str]:
return data
-
-# Get data from daily reports
-def get_data_daily_reports() -> pd.DataFrame:
- """ Get data from BASE_URL_DAILY_REPORTS """
- # Check the latest file
- latest_base_url = helper_get_latest_data_url(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS'])
-
- # Extract the data
- df = pd.read_csv(latest_base_url)
-
- # Data pre-processing
- concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
- df = helper_df_cols_cleaning(df, concerned_columns, int)
-
- return df
-
-
-# Get data from daily reports (USA)
-def get_data_daily_reports_us() -> pd.DataFrame:
- """ Get data from BASE_URL_DAILY_REPORTS """
- # Check the latest file
- latest_base_url = helper_get_latest_data_url(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS_US'])
-
- # Extract the data
- df = pd.read_csv(latest_base_url)
-
- # Data pre-processing
- concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
- df = helper_df_cols_cleaning(df, concerned_columns, int)
-
- return df
-
+class DailyReports:
+ def __init__(self) -> None:
+ self.latest_base_url = helper_get_latest_data_url(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS'])
+
+ # Get data from daily reports
+ def get_data_daily_reports(self, US=False) -> pd.DataFrame:
+ """ Get data from BASE_URL_DAILY_REPORTS """
+ # Extract the data
+ if US is False:
+ df = pd.read_csv(self.latest_base_url)
+ else:
+ df = pd.read_csv(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS_US'])
+ # Data pre-processing
+ concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
+ df = helper_df_cols_cleaning(df, concerned_columns, int)
+
+ return df
# Get data from time series
def get_data_time_series() -> Dict[str, pd.DataFrame]:
From 5d01f02a2ca8664a0e953b5127fa376c69d03a9d Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 09:35:29 -0400
Subject: [PATCH 02/18] Use the new class within the API integrator
---
app/integrators/covid_api_v2_integrator.py | 20 ++++++++++----------
app/routers/v2/router_api_v2.py | 4 +++-
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/app/integrators/covid_api_v2_integrator.py b/app/integrators/covid_api_v2_integrator.py
index 632c6e4..db722df 100644
--- a/app/integrators/covid_api_v2_integrator.py
+++ b/app/integrators/covid_api_v2_integrator.py
@@ -24,8 +24,7 @@
TimeseriesUSDataModel,
TimeseriesUSInfoModel,
TimeseriesUSModel, TotalModel)
-from utils.get_data import (get_data_daily_reports,
- get_data_daily_reports_us, get_data_lookup_table,
+from utils.get_data import (DailyReports, get_data_lookup_table,
get_data_time_series, get_US_time_series)
@@ -37,7 +36,7 @@ class CovidAPIv2Integrator:
"ts": int = "{timestamp}
}
"""
- def __init__(self) -> None:
+ def __init__(self, daily_reports: DailyReports) -> None:
""" Initiate DataFrames """
self.lookup_table = get_data_lookup_table()
self.scheme = {
@@ -45,6 +44,7 @@ def __init__(self) -> None:
'dt': None,
'ts': None
}
+ self.daily_reports=daily_reports
def wrap_data(func) -> ResponseModel:
""" Wrap a result in a schemed data """
@@ -71,7 +71,7 @@ def wrapper(self, *args, **kwargs):
def get_current(self) -> List[CurrentModel]:
""" Current data from all locations (Lastest date) """
concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
self.df_grp_by_country = self.df.groupby('Country_Region')[concerned_columns].sum()
self.df_grp_by_country[concerned_columns] = self.df_grp_by_country[concerned_columns].astype(int)
@@ -89,7 +89,7 @@ def get_current(self) -> List[CurrentModel]:
@wrap_data
def get_current_US(self) -> List[CurrentUSModel]:
""" Get current data for USA's situation """
- self.df_US = get_data_daily_reports_us() # Get base data
+ self.df_US = self.daily_reports.get_data_daily_reports(US=True) # Get base data
concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
df = self.df_US.groupby(['Province_State'])[concerned_columns].sum().sort_values(by='Confirmed', ascending=False)
@@ -128,7 +128,7 @@ def get_country(self, country_name: str) -> Dict[str, Any]:
@wrap_data
def get_confirmed(self) -> ConfirmedModel:
""" Summation of all confirmed cases """
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
data = ConfirmedModel(
confirmed=int(self.df['Confirmed'].sum())
)
@@ -140,7 +140,7 @@ def get_confirmed(self) -> ConfirmedModel:
@wrap_data
def get_deaths(self) -> DeathsModel:
""" Summation of all deaths """
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
data = DeathsModel(
deaths=int(self.df['Deaths'].sum())
)
@@ -152,7 +152,7 @@ def get_deaths(self) -> DeathsModel:
@wrap_data
def get_recovered(self) -> RecoveredModel:
""" Summation of all recovers """
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
data = RecoveredModel(
recovered=int(self.df['Recovered'].sum())
)
@@ -164,7 +164,7 @@ def get_recovered(self) -> RecoveredModel:
@wrap_data
def get_active(self) -> ActiveModel:
""" Summation of all actives """
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
data = ActiveModel(
active=int(self.df['Active'].sum())
)
@@ -176,7 +176,7 @@ def get_active(self) -> ActiveModel:
@wrap_data
def get_total(self) -> TotalModel:
""" Summation of Confirmed, Deaths, Recovered, Active """
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
data = TotalModel(
confirmed=int(self.df['Confirmed'].sum()),
deaths=int(self.df['Deaths'].sum()),
diff --git a/app/routers/v2/router_api_v2.py b/app/routers/v2/router_api_v2.py
index d9acab4..58795ff 100644
--- a/app/routers/v2/router_api_v2.py
+++ b/app/routers/v2/router_api_v2.py
@@ -14,9 +14,11 @@
from starlette.requests import Request
from . import v2
+from utils.get_data import DailyReports
# Initiate Integrator
-COVID_API_V2 = CovidAPIv2Integrator()
+DAILY_REPORTS = DailyReports()
+COVID_API_V2 = CovidAPIv2Integrator(DAILY_REPORTS)
# Logging
From de89146b0dfbe9aaac50d666a23da2890e66f1e9 Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 09:35:56 -0400
Subject: [PATCH 03/18] Refactor the test to use the new class
---
app/tests/test_get_data.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/app/tests/test_get_data.py b/app/tests/test_get_data.py
index 863ed48..487398b 100644
--- a/app/tests/test_get_data.py
+++ b/app/tests/test_get_data.py
@@ -6,46 +6,46 @@
"""
# Import libraries
import pandas as pd
-from ..utils import get_data
+from ..utils.get_data import DailyReports, get_data_lookup_table, get_data_time_series, get_US_time_series
# Test - Get Lookup table
def test_get_data_lookup_table() -> None:
- result = get_data.get_data_lookup_table()
+ result = get_data_lookup_table()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get data from daily reports
def test_get_data_daily_reports() -> None:
- result = get_data.get_data_daily_reports()
+ result = DailyReports.get_data_daily_reports()
assert len(result) > 0
assert isinstance(result, pd.DataFrame) is True
# Test - Get data from time series
def test_get_data_time_series() -> None:
- result = get_data.get_data_time_series()
+ result = get_data_time_series()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get data from time series (US)
def test_get_US_time_series() -> None:
- result = get_data.get_US_time_series()
+ result = get_US_time_series()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get Data (API v1)
def test_get_data() -> None:
- result = get_data.get_data()
+ result = get_data()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get Data (API v1)
def test_get_data(time_series = True) -> None:
- result = get_data.get_data()
+ result = get_data()
assert len(result) > 0
assert isinstance(result, dict) is True
From 206f0d0cae44b00615befddaea8f3e4e5e6449da Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 09:53:24 -0400
Subject: [PATCH 04/18] Fix failing tests
---
app/tests/test_get_data.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/tests/test_get_data.py b/app/tests/test_get_data.py
index 487398b..8a71cea 100644
--- a/app/tests/test_get_data.py
+++ b/app/tests/test_get_data.py
@@ -6,8 +6,9 @@
"""
# Import libraries
import pandas as pd
-from ..utils.get_data import DailyReports, get_data_lookup_table, get_data_time_series, get_US_time_series
+from ..utils.get_data import DailyReports, get_data_lookup_table, get_data_time_series, get_US_time_series, get_data
+daily_reports = DailyReports()
# Test - Get Lookup table
def test_get_data_lookup_table() -> None:
@@ -18,7 +19,7 @@ def test_get_data_lookup_table() -> None:
# Test - Get data from daily reports
def test_get_data_daily_reports() -> None:
- result = DailyReports.get_data_daily_reports()
+ result = daily_reports.get_data_daily_reports()
assert len(result) > 0
assert isinstance(result, pd.DataFrame) is True
From 59460ab30d2b07e1fbbaf5e739ce5e56181838aa Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 10:06:47 -0400
Subject: [PATCH 05/18] Create new DataTimeSeries class
---
app/utils/get_data.py | 61 ++++++++++++++++++-------------------------
1 file changed, 25 insertions(+), 36 deletions(-)
diff --git a/app/utils/get_data.py b/app/utils/get_data.py
index 48a4dd6..c2edd71 100644
--- a/app/utils/get_data.py
+++ b/app/utils/get_data.py
@@ -59,42 +59,31 @@ def get_data_daily_reports_us() -> pd.DataFrame:
return df
-
-# Get data from time series
-def get_data_time_series() -> Dict[str, pd.DataFrame]:
- """ Get the dataset from JHU CSSE """
- dataframes = {}
-
- # Iterate through all files
- for category in JHU_CSSE_FILE_PATHS['CATEGORIES']:
- url = JHU_CSSE_FILE_PATHS['BASE_URL_TIME_SERIES'].format(category)
-
- # Extract data
- df = pd.read_csv(url)
- df = helper_df_cleaning(df)
- dataframes[category] = df
-
- return dataframes
-
-
-# Get data from time series (US)
-def get_US_time_series() -> Dict[str, pd.DataFrame]:
- """ Get the dataset of time series for USA """
- dataframes = {}
-
- # Iterate through categories ('confirmed', 'deaths')
- for category in JHU_CSSE_FILE_PATHS['CATEGORIES'][:-1]:
- url = JHU_CSSE_FILE_PATHS['BASE_URL_US_TIME_SERIES'].format(category)
-
- # Extract data
- df = pd.read_csv(url)
- df = helper_df_cleaning(df)
- concerned_columns = ['Lat', 'Long_']
- df = helper_df_cols_cleaning(df, concerned_columns, float)
- dataframes[category] = df
-
- return dataframes
-
+class DataTimeSeries:
+ # Get data from time series
+ def get_data_time_series(self, US=False) -> Dict[str, pd.DataFrame]:
+ """ Get the dataset from JHU CSSE """
+ dataframes = {}
+
+ if US is False:
+ categories = JHU_CSSE_FILE_PATHS['CATEGORIES']
+ url = JHU_CSSE_FILE_PATHS['BASE_URL_TIME_SERIES']
+ else:
+ categories = JHU_CSSE_FILE_PATHS['CATEGORIES'][:-1]
+ url = JHU_CSSE_FILE_PATHS['BASE_URL_US_TIME_SERIES']
+ # Iterate through all files
+ for category in categories:
+ url = url.format(category)
+
+ # Extract data
+ df = pd.read_csv(url)
+ df = helper_df_cleaning(df)
+ if US:
+ concerned_columns = ['Lat', 'Long_']
+ df = helper_df_cols_cleaning(df, concerned_columns, float)
+ dataframes[category] = df
+
+ return dataframes
# API v1
def get_data(time_series: bool = False) -> Dict[str, pd.DataFrame]:
From 0d9e22b3a6fbfd5f7b88926352dd52126597f057 Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 10:14:56 -0400
Subject: [PATCH 06/18] Refactor to use DataTimeSeries class
---
app/integrators/covid_api_v2_integrator.py | 9 +++++----
app/routers/v2/router_api_v2.py | 4 +++-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/app/integrators/covid_api_v2_integrator.py b/app/integrators/covid_api_v2_integrator.py
index 632c6e4..a710b47 100644
--- a/app/integrators/covid_api_v2_integrator.py
+++ b/app/integrators/covid_api_v2_integrator.py
@@ -26,7 +26,7 @@
TimeseriesUSModel, TotalModel)
from utils.get_data import (get_data_daily_reports,
get_data_daily_reports_us, get_data_lookup_table,
- get_data_time_series, get_US_time_series)
+ DataTimeSeries)
class CovidAPIv2Integrator:
@@ -37,7 +37,7 @@ class CovidAPIv2Integrator:
"ts": int = "{timestamp}
}
"""
- def __init__(self) -> None:
+ def __init__(self, time_series: DataTimeSeries) -> None:
""" Initiate DataFrames """
self.lookup_table = get_data_lookup_table()
self.scheme = {
@@ -45,6 +45,7 @@ def __init__(self) -> None:
'dt': None,
'ts': None
}
+ self.time_series=time_series
def wrap_data(func) -> ResponseModel:
""" Wrap a result in a schemed data """
@@ -194,7 +195,7 @@ def get_time_series(self, case: str) -> List[Any]:
1.) global
2.) confirmed, deaths, recovered
"""
- self.df_time_series = get_data_time_series() # Get base data
+ self.df_time_series = self.time_series.get_data_time_series() # Get base data
if case not in ['global']:
raw_data = self.df_time_series[case].T.to_dict()
@@ -262,7 +263,7 @@ def get_US_time_series(self, case: str) -> List[TimeseriesUSModel]:
if case not in ['confirmed', 'deaths']:
data = []
else:
- self.df_US_time_series = get_US_time_series() # Get base data
+ self.df_US_time_series = self.time_series.get_data_time_series(US=True) # Get base data
raw_data = self.df_US_time_series[case].T.to_dict()
data = self.__extract_US_time_series(raw_data)
diff --git a/app/routers/v2/router_api_v2.py b/app/routers/v2/router_api_v2.py
index d9acab4..ec2403b 100644
--- a/app/routers/v2/router_api_v2.py
+++ b/app/routers/v2/router_api_v2.py
@@ -14,9 +14,11 @@
from starlette.requests import Request
from . import v2
+from utils.get_data import DataTimeSeries
# Initiate Integrator
-COVID_API_V2 = CovidAPIv2Integrator()
+DATA_TIME_SERIES = DataTimeSeries()
+COVID_API_V2 = CovidAPIv2Integrator(DataTimeSeries)
# Logging
From 869267f2db0f941bb86263140c2f8fc475dc390d Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Mon, 15 Mar 2021 10:15:07 -0400
Subject: [PATCH 07/18] Refactor tests
---
app/tests/test_get_data.py | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/tests/test_get_data.py b/app/tests/test_get_data.py
index 863ed48..40beef3 100644
--- a/app/tests/test_get_data.py
+++ b/app/tests/test_get_data.py
@@ -6,46 +6,46 @@
"""
# Import libraries
import pandas as pd
-from ..utils import get_data
-
+from ..utils.get_data import get_data, DataTimeSeries, get_data_lookup_table, get_data_daily_reports
+time_series = DataTimeSeries()
# Test - Get Lookup table
def test_get_data_lookup_table() -> None:
- result = get_data.get_data_lookup_table()
+ result = get_data_lookup_table()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get data from daily reports
def test_get_data_daily_reports() -> None:
- result = get_data.get_data_daily_reports()
+ result = get_data_daily_reports()
assert len(result) > 0
assert isinstance(result, pd.DataFrame) is True
# Test - Get data from time series
def test_get_data_time_series() -> None:
- result = get_data.get_data_time_series()
+ result = time_series.get_data_time_series()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get data from time series (US)
def test_get_US_time_series() -> None:
- result = get_data.get_US_time_series()
+ result = time_series.get_data_time_series(US=True)
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get Data (API v1)
def test_get_data() -> None:
- result = get_data.get_data()
+ result = get_data()
assert len(result) > 0
assert isinstance(result, dict) is True
# Test - Get Data (API v1)
def test_get_data(time_series = True) -> None:
- result = get_data.get_data()
+ result = get_data()
assert len(result) > 0
assert isinstance(result, dict) is True
From 5621333fa39001aadfa6ee070769c36c54a056fd Mon Sep 17 00:00:00 2001
From: Nuttaphat Arunoprayoch
Date: Tue, 16 Mar 2021 09:57:53 +0800
Subject: [PATCH 08/18] Update covid_api_v2_integrator.py
---
app/integrators/covid_api_v2_integrator.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/integrators/covid_api_v2_integrator.py b/app/integrators/covid_api_v2_integrator.py
index db722df..eb3bc1b 100644
--- a/app/integrators/covid_api_v2_integrator.py
+++ b/app/integrators/covid_api_v2_integrator.py
@@ -37,7 +37,7 @@ class CovidAPIv2Integrator:
}
"""
def __init__(self, daily_reports: DailyReports) -> None:
- """ Initiate DataFrames """
+ """ Initiate instances """
self.lookup_table = get_data_lookup_table()
self.scheme = {
'data': None,
From be20ce7e877b965da403221b5cb7f21f80209798 Mon Sep 17 00:00:00 2001
From: nat236919
Date: Tue, 16 Mar 2021 10:58:45 +0800
Subject: [PATCH 09/18] patch PR #72 by adding missing parts and tests
---
app/integrators/covid_api_v2_integrator.py | 2 +-
app/tests/test_get_data.py | 7 +++++++
app/utils/get_data.py | 12 +++++++-----
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/app/integrators/covid_api_v2_integrator.py b/app/integrators/covid_api_v2_integrator.py
index d374be8..ef2925f 100644
--- a/app/integrators/covid_api_v2_integrator.py
+++ b/app/integrators/covid_api_v2_integrator.py
@@ -108,7 +108,7 @@ def get_current_US(self) -> List[CurrentUSModel]:
def get_country(self, country_name: str) -> CountryModel:
""" Get a country data from its name or ISO 2 """
concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
- self.df = get_data_daily_reports() # Get base data
+ self.df = self.daily_reports.get_data_daily_reports() # Get base data
self.df_grp_by_country = self.df.groupby('Country_Region')[concerned_columns].sum()
self.df_grp_by_country[concerned_columns] = self.df_grp_by_country[concerned_columns].astype(int)
diff --git a/app/tests/test_get_data.py b/app/tests/test_get_data.py
index 8a71cea..bb0bae9 100644
--- a/app/tests/test_get_data.py
+++ b/app/tests/test_get_data.py
@@ -24,6 +24,13 @@ def test_get_data_daily_reports() -> None:
assert isinstance(result, pd.DataFrame) is True
+# Test - Get data from daily reports (US)
+def test_get_data_daily_reports_US() -> None:
+ result = daily_reports.get_data_daily_reports(US=True)
+ assert len(result) > 0
+ assert isinstance(result, pd.DataFrame) is True
+
+
# Test - Get data from time series
def test_get_data_time_series() -> None:
result = get_data_time_series()
diff --git a/app/utils/get_data.py b/app/utils/get_data.py
index e8d6288..5a344db 100644
--- a/app/utils/get_data.py
+++ b/app/utils/get_data.py
@@ -27,24 +27,26 @@ def get_data_lookup_table() -> Dict[str, str]:
return data
+
+# Get Daily Reports Data (General and US)
class DailyReports:
def __init__(self) -> None:
self.latest_base_url = helper_get_latest_data_url(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS'])
+ self.latest_base_US_url = helper_get_latest_data_url(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS_US'])
# Get data from daily reports
- def get_data_daily_reports(self, US=False) -> pd.DataFrame:
+ def get_data_daily_reports(self, US: bool = False) -> pd.DataFrame:
""" Get data from BASE_URL_DAILY_REPORTS """
# Extract the data
- if US is False:
- df = pd.read_csv(self.latest_base_url)
- else:
- df = pd.read_csv(JHU_CSSE_FILE_PATHS['BASE_URL_DAILY_REPORTS_US'])
+ df = pd.read_csv(self.latest_base_US_url) if US else pd.read_csv(self.latest_base_url)
+
# Data pre-processing
concerned_columns = ['Confirmed', 'Deaths', 'Recovered', 'Active']
df = helper_df_cols_cleaning(df, concerned_columns, int)
return df
+
# Get data from time series
def get_data_time_series() -> Dict[str, pd.DataFrame]:
""" Get the dataset from JHU CSSE """
From 059df63a80a310bb0004e45b7dbac381a9fcf389 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Tue, 16 Mar 2021 03:03:18 +0000
Subject: [PATCH 10/18] docs: update README.md [skip ci]
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 0db9627..42364a5 100644
--- a/README.md
+++ b/README.md
@@ -128,12 +128,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
From 129f5a3885d2f881fa5a1f412c5af5730f57f597 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Tue, 16 Mar 2021 03:03:19 +0000
Subject: [PATCH 11/18] docs: update .all-contributorsrc [skip ci]
---
.all-contributorsrc | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index c8b1ddf..3cf58c9 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -63,6 +63,15 @@
"contributions": [
"doc"
]
+ },
+ {
+ "login": "mSitkovets",
+ "name": "Maria Sitkovets",
+ "avatar_url": "https://avatars.githubusercontent.com/u/28634142?v=4",
+ "profile": "https://www.linkedin.com/in/maria-sitkovets-03994b159/",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
From dd0f6f7841adbcb3db5c05d66ddec462595e93b4 Mon Sep 17 00:00:00 2001
From: Nuttaphat Arunoprayoch
Date: Tue, 16 Mar 2021 11:21:54 +0800
Subject: [PATCH 12/18] Update .all-contributorsrc
---
.all-contributorsrc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 3cf58c9..c458ef1 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -9,13 +9,12 @@
"login": "nat236919",
"name": "Nuttaphat Arunoprayoch",
"avatar_url": "https://avatars0.githubusercontent.com/u/9074112?v=4",
- "profile": "http://nuttaphat.azurewebsites.net",
+ "profile": "https://nuttaphat.com",
"contributions": [
"maintenance",
"code",
"bug",
"doc",
- "ideas",
"review"
]
},
@@ -61,6 +60,7 @@
"avatar_url": "https://avatars.githubusercontent.com/u/43126781?v=4",
"profile": "https://github.com/owen-duncan-snobel",
"contributions": [
+ "code",
"doc"
]
},
From 3110aad24980a81e7668df0cc685f3307b82c219 Mon Sep 17 00:00:00 2001
From: Maria Sitkovets
Date: Tue, 16 Mar 2021 13:00:57 -0400
Subject: [PATCH 13/18] Add type
---
app/utils/get_data.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/utils/get_data.py b/app/utils/get_data.py
index 2c8d27c..2a82c2e 100644
--- a/app/utils/get_data.py
+++ b/app/utils/get_data.py
@@ -48,7 +48,7 @@ def get_data_daily_reports(self, US: bool = False) -> pd.DataFrame:
class DataTimeSeries:
# Get data from time series
- def get_data_time_series(self, US=False) -> Dict[str, pd.DataFrame]:
+ def get_data_time_series(self, US: bool = False) -> Dict[str, pd.DataFrame]:
""" Get the dataset from JHU CSSE """
dataframes = {}
From e095d7869fd064f182f913844b78270c65a9b47f Mon Sep 17 00:00:00 2001
From: Nuttaphat Arunoprayoch
Date: Thu, 18 Mar 2021 08:50:05 +0800
Subject: [PATCH 14/18] Update get_data.py
---
app/utils/get_data.py | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/app/utils/get_data.py b/app/utils/get_data.py
index 2a82c2e..23afb55 100644
--- a/app/utils/get_data.py
+++ b/app/utils/get_data.py
@@ -46,32 +46,39 @@ def get_data_daily_reports(self, US: bool = False) -> pd.DataFrame:
return df
+
+# Get data from time series (General and US)
class DataTimeSeries:
- # Get data from time series
+ """ Get the tiemseires dataset from JHU CSSE and Prepare DataFrames """
def get_data_time_series(self, US: bool = False) -> Dict[str, pd.DataFrame]:
""" Get the dataset from JHU CSSE """
dataframes = {}
- if US is False:
+ # Determine categories and url
+ if US:
+ categories = JHU_CSSE_FILE_PATHS['CATEGORIES'][:-1] # Select only 'confirmed' and 'deaths'
+ url = JHU_CSSE_FILE_PATHS['BASE_URL_US_TIME_SERIES']
+ else:
categories = JHU_CSSE_FILE_PATHS['CATEGORIES']
url = JHU_CSSE_FILE_PATHS['BASE_URL_TIME_SERIES']
- else:
- categories = JHU_CSSE_FILE_PATHS['CATEGORIES'][:-1]
- url = JHU_CSSE_FILE_PATHS['BASE_URL_US_TIME_SERIES']
+
# Iterate through all files
for category in categories:
url = url.format(category)
-
- # Extract data
+ # Extract data from URL
df = pd.read_csv(url)
- df = helper_df_cleaning(df)
- if US:
- concerned_columns = ['Lat', 'Long_']
- df = helper_df_cols_cleaning(df, concerned_columns, float)
+ df = self._clean_timeseries_dataframe(df, US)
dataframes[category] = df
return dataframes
+
+ def _clean_timeseries_dataframe(self, df: pd.DataFrame, US: bool = False) -> pd.DataFrame:
+ df_cleaned = helper_df_cleaning(df) # main pre-processing
+ if US:
+ df_cleaned = helper_df_cols_cleaning(df_cleaned, ['Lat', 'Long_'], float)
+ return df_cleaned
+
# API v1
def get_data(time_series: bool = False) -> Dict[str, pd.DataFrame]:
""" Get the dataset from JHU CSSE """
From 65a7b2bcfef86ab0932e96b8bd416b28c8f095d4 Mon Sep 17 00:00:00 2001
From: nat236919
Date: Thu, 18 Mar 2021 10:47:16 +0800
Subject: [PATCH 15/18] patch PR #73 to resolve conflict APIv2 integrator
---
app/integrators/covid_api_v2_integrator.py | 13 +++++--------
app/tests/test_get_data.py | 5 ++++-
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/app/integrators/covid_api_v2_integrator.py b/app/integrators/covid_api_v2_integrator.py
index 2b62b03..2c02c15 100644
--- a/app/integrators/covid_api_v2_integrator.py
+++ b/app/integrators/covid_api_v2_integrator.py
@@ -24,9 +24,9 @@
TimeseriesUSDataModel,
TimeseriesUSInfoModel,
TimeseriesUSModel, TotalModel)
+from utils.get_data import (DailyReports, DataTimeSeries,
+ get_data_lookup_table)
-from utils.get_data import (DailyReports, get_data_lookup_table,
- DataTimeSeries)
class CovidAPIv2Integrator:
""" Covid-19 API v2 methods
@@ -38,9 +38,6 @@ class CovidAPIv2Integrator:
"""
def __init__(self, daily_reports: DailyReports, time_series: DataTimeSeries) -> None:
- """ Initiate DataFrames """
-
- def __init__(self, daily_reports: DailyReports) -> None:
""" Initiate instances """
self.lookup_table = get_data_lookup_table()
self.scheme = {
@@ -48,9 +45,9 @@ def __init__(self, daily_reports: DailyReports) -> None:
'dt': None,
'ts': None
}
- self.daily_reports=daily_reports
- self.time_series=time_series
-
+ self.daily_reports = daily_reports
+ self.time_series = time_series
+
def wrap_data(func) -> ResponseModel:
""" Wrap a result in a schemed data """
@wraps(func)
diff --git a/app/tests/test_get_data.py b/app/tests/test_get_data.py
index 7c8ef0a..6dcb2fb 100644
--- a/app/tests/test_get_data.py
+++ b/app/tests/test_get_data.py
@@ -6,11 +6,14 @@
"""
# Import libraries
import pandas as pd
-from ..utils.get_data import get_data, DataTimeSeries, get_data_lookup_table, DailyReports
+
+from ..utils.get_data import (DailyReports, DataTimeSeries, get_data,
+ get_data_lookup_table)
daily_reports = DailyReports()
time_series = DataTimeSeries()
+
# Test - Get Lookup table
def test_get_data_lookup_table() -> None:
result = get_data_lookup_table()
From 943f105bf6dd66988038071731d651a7070f3e88 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Thu, 18 Mar 2021 03:19:14 +0000
Subject: [PATCH 16/18] docs: update README.md [skip ci]
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 42364a5..3a1b7a9 100644
--- a/README.md
+++ b/README.md
@@ -128,12 +128,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
From d96e3c9cde65ab5dac8925f5a59c918043d6f0df Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Thu, 18 Mar 2021 03:19:15 +0000
Subject: [PATCH 17/18] docs: update .all-contributorsrc [skip ci]
---
.all-contributorsrc | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.all-contributorsrc b/.all-contributorsrc
index c458ef1..fe05295 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -61,7 +61,8 @@
"profile": "https://github.com/owen-duncan-snobel",
"contributions": [
"code",
- "doc"
+ "doc",
+ "financial"
]
},
{
From 8da617136e030b5b3a41d11e608125e60ccb1953 Mon Sep 17 00:00:00 2001
From: nat236919
Date: Thu, 18 Mar 2021 11:31:32 +0800
Subject: [PATCH 18/18] release 2.1.2 with aggregated get data methods on daily
and time series data
---
README.md | 22 +++++++++++-----------
app/config.py | 2 +-
app/docs/index.md | 27 ++++++++++++++-------------
3 files changed, 26 insertions(+), 25 deletions(-)
diff --git a/README.md b/README.md
index 3a1b7a9..11239bf 100644
--- a/README.md
+++ b/README.md
@@ -7,17 +7,17 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -30,7 +30,7 @@ This API provides the information regarding '2019 Novel Coronavirus (covid-19)'.
## Example
-* https://covid19.nuttaphat.com/
+* https://covid19api.azurewebsites.net/
* https://covid2019-api.herokuapp.com/
## Applications
@@ -41,9 +41,9 @@ This API provides the information regarding '2019 Novel Coronavirus (covid-19)'.
* [BAILAM (Data and API Integration)](https://www.bailam.com/covid19)
* [Coronavirus Tech Handbook (Data Tools)](https://coronavirustechhandbook.com/data-tools)
-### References
+### Reference
-https://github.com/CSSEGISandData/COVID-19
+* https://github.com/CSSEGISandData/COVID-19
## Branches
diff --git a/app/config.py b/app/config.py
index 19694e4..63e6f16 100644
--- a/app/config.py
+++ b/app/config.py
@@ -9,6 +9,6 @@
'app': {
'title': 'COVID-19 API',
'description': 'Simply FAST API for COVID-19 cases exploration',
- 'version': '2.1.1'
+ 'version': '2.1.2'
}
}
diff --git a/app/docs/index.md b/app/docs/index.md
index 5d5cb9f..a1b7d9c 100644
--- a/app/docs/index.md
+++ b/app/docs/index.md
@@ -7,17 +7,17 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -30,7 +30,7 @@ This API provides the information regarding '2019 Novel Coronavirus (covid-19)'.
## Example
-* https://covid19.nuttaphat.com/
+* https://covid19api.azurewebsites.net/
* https://covid2019-api.herokuapp.com/
## Applications
@@ -41,9 +41,9 @@ This API provides the information regarding '2019 Novel Coronavirus (covid-19)'.
* [BAILAM (Data and API Integration)](https://www.bailam.com/covid19)
* [Coronavirus Tech Handbook (Data Tools)](https://coronavirustechhandbook.com/data-tools)
-### References
+### Reference
-https://github.com/CSSEGISandData/COVID-19
+* https://github.com/CSSEGISandData/COVID-19
## Branches
@@ -128,12 +128,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d