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 - + - + +

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 👀

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 🤔 👀

Sophia Castellarin

💻

Jeremy

💻

Tim

🌍

melsaa

💻

owen-duncan-snobel

💻 🐛 📖

owen-duncan-snobel

📖

Maria Sitkovets

💻
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 - + - +

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 🤔 👀

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 👀

Sophia Castellarin

💻

Jeremy

💻

Tim

🌍

melsaa

💻

owen-duncan-snobel

📖

owen-duncan-snobel

💻 📖 💵

Maria Sitkovets

💻
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 @@

- - issues + + issues - - forks + + forks - - starts + + starts - - licence + + licence build @@ -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 @@

- - issues + + issues - - forks + + forks - - starts + + starts - - licence + + licence build @@ -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 - + - + +

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 👀

Nuttaphat Arunoprayoch

🚧 💻 🐛 📖 👀

Sophia Castellarin

💻

Jeremy

💻

Tim

🌍

melsaa

💻

owen-duncan-snobel

💻 🐛 📖

owen-duncan-snobel

💻 📖 💵

Maria Sitkovets

💻