6
6
import pandas as pd
7
7
import requests
8
8
from dotenv import load_dotenv
9
- from pandas .errors import SettingWithCopyWarning
9
+
10
+ try :
11
+ from pandas .errors import SettingWithCopyWarning
12
+ except ImportError as e :
13
+ raise ImportError ("Please upgrade your version of pandas to 1.5.3 or higher." ) from e
10
14
11
15
warnings .simplefilter (action = "ignore" , category = SettingWithCopyWarning )
16
+
12
17
load_dotenv ()
13
18
14
19
@@ -32,30 +37,23 @@ def get_series(
32
37
Args:
33
38
series_id (str): The series ID. For example, "NG.RNGC1.W".
34
39
new_name (str): A name you want to give the value column.
40
+
35
41
Returns:
36
42
pd.DataFrame: A DataFrame with the date and value columns.
37
43
"""
38
44
headers = {"Accept" : "*/*" }
39
45
url = f"{ self .url } seriesid/{ series_id } ?api_key={ self .token } "
40
- response = requests .get (url , headers = headers )
41
- response .raise_for_status ()
42
- json_response = response .json ()
46
+ base_df = self .get_json_response (url , headers )
43
47
44
- base_df = pd .DataFrame (json_response ["response" ]["data" ])
45
-
46
- if "series-description" in base_df .columns :
47
- series_description = base_df ["series-description" ][0 ]
48
+ if not new_name :
49
+ series_description = base_df ["series-description" ][0 ] if "series-description" in base_df .columns else series_id
48
50
else :
49
- series_description = series_id
50
-
51
- if new_name != "" :
52
51
series_description = new_name
53
52
54
53
df = base_df [["period" , "value" ]]
54
+
55
55
df .rename (columns = {df .columns [0 ]: "Date" , df .columns [1 ]: series_description }, inplace = True )
56
- df ["Date" ] = pd .to_datetime (df ["Date" ])
57
- df .set_index ("Date" , inplace = True )
58
- return df
56
+ return self .format_time_series_data (df )
59
57
60
58
def get_series_via_route (
61
59
self ,
@@ -74,6 +72,7 @@ def get_series_via_route(
74
72
frequency (str): The frequency of the series. For example, "daily".
75
73
facet (str): The facet of the series. For example, "series", "seriesId".
76
74
new_name (str): A name you want to give the value column.
75
+
77
76
Returns:
78
77
pd.DataFrame: A DataFrame with the date and value columns.
79
78
"""
@@ -84,30 +83,35 @@ def get_series_via_route(
84
83
sort = "&sort[0][column]=period&sort[0][direction]=desc"
85
84
url = f"{ self .url } { api_route } { series } { sort } "
86
85
87
- response = requests .get (url , headers = headers )
88
- response .raise_for_status ()
89
- json_response = response .json ()
90
-
91
- base_df = pd .DataFrame (json_response ["response" ]["data" ])
86
+ base_df = self .get_json_response (url , headers )
92
87
93
88
if facet == "series" :
94
89
df = base_df [["period" , "value" , "series-description" , "series" ]]
95
-
96
90
elif facet == "seriesId" :
97
91
df = base_df [["period" , "value" , "seriesDescription" , "seriesId" ]]
98
92
99
93
df .reset_index (drop = True , inplace = True )
100
94
101
- name = df [df .columns [2 ]][0 ]
102
-
103
- if new_name != "" :
104
- name = new_name
105
-
95
+ name = new_name if new_name != "" else df [df .columns [2 ]][0 ]
106
96
df .rename (columns = {df .columns [1 ]: name }, inplace = True )
107
-
108
97
df = df .iloc [:, :2 ]
109
98
110
99
df .rename (columns = {df .columns [0 ]: "Date" }, inplace = True )
100
+ return self .format_time_series_data (df )
101
+
102
+ def format_time_series_data (self , df ):
103
+ """
104
+ Helper function to format time series data.
105
+ """
111
106
df ["Date" ] = pd .to_datetime (df ["Date" ])
112
107
df .set_index ("Date" , inplace = True )
113
108
return df
109
+
110
+ def get_json_response (self , url : str , headers : dict ):
111
+ """
112
+ Helper function to get JSON response from API.
113
+ """
114
+ response = requests .get (url , headers = headers )
115
+ response .raise_for_status ()
116
+ json_response = response .json ()
117
+ return pd .DataFrame (json_response ["response" ]["data" ])
0 commit comments