1515 register_matplotlib_converters as _register_matplotlib_converters ,
1616)
1717import seaborn as _sns
18+ import time
1819
1920from ._pa import *
2021
@@ -284,14 +285,18 @@ def returns(df, ret_type="abs", period_return=1, spread=False):
284285 if ret_type == "abs" :
285286 df = df .groupby (level = 0 , group_keys = False ).apply (lambda x : x .diff ())
286287 elif ret_type == "rel" :
287- df = df .groupby (level = 0 , group_keys = False ).apply (lambda x : x / x .shift (period_return ) - 1 )
288+ df = df .groupby (level = 0 , group_keys = False ).apply (
289+ lambda x : x / x .shift (period_return ) - 1
290+ )
288291 elif ret_type == "log" :
289292 if df [df < 0 ].count ().sum () > 0 :
290293 warnings .warn (
291294 "Negative values passed to log returns. You will likely get NaN values using log returns" ,
292295 RuntimeWarning ,
293296 )
294- df = df .groupby (level = 0 , group_keys = False ).apply (lambda x : _np .log (x / x .shift (period_return )))
297+ df = df .groupby (level = 0 , group_keys = False ).apply (
298+ lambda x : _np .log (x / x .shift (period_return ))
299+ )
295300 else :
296301 raise ValueError ("ret_type is not valid" )
297302
@@ -704,7 +709,7 @@ def crr_euro(s=100, x=100, sigma=0.2, Rf=0.1, T=1, n=5, type="call"):
704709
705710 for i in range (0 , n + 1 ):
706711 for j in range (0 , i + 1 ):
707- asset [i , j ] = s * (u ** j ) * (d ** (i - j ))
712+ asset [i , j ] = s * (u ** j ) * (d ** (i - j ))
708713
709714 # create matrix of the same dims as asset price tree
710715 option = _np .zeros ([n + 1 , n + 1 ])
@@ -809,7 +814,7 @@ def stl_decomposition(
809814 return res
810815
811816
812- def get_eia_df (tables , key , version = 2 ):
817+ def get_eia_df (tables , key , version = 2 , sleep = 1 ):
813818 """
814819 Function for download data from the US Government EIA and return it as a pandas dataframe/series
815820
@@ -824,7 +829,7 @@ def get_eia_df(tables, key, version=2):
824829 EIA key.
825830 version : 1 | 2
826831 API version to use, can be either 1 or 2. By default 2. As of Nov 2022, EIA is no
827- longer support v1 of the API.
832+ longer support v1 of the API.
828833
829834 Returns
830835 -------
@@ -839,7 +844,7 @@ def get_eia_df(tables, key, version=2):
839844 if int (version ) == 1 :
840845 return _get_eia_df_v1 (tables , key )
841846 else :
842- return _get_eia_df_v2 (tables , key )
847+ return _get_eia_df_v2 (tables , key , sleep = sleep )
843848
844849
845850def _get_eia_df_v1 (tables , key ):
@@ -878,7 +883,8 @@ def _get_eia_df_v1(tables, key):
878883 url = r"http://api.eia.gov/series/?api_key={}&series_id={}&out=json" .format (
879884 key , tbl
880885 )
881- tmp = json .loads (requests .get (url ).text )
886+ r = requests .get (url )
887+ tmp = json .loads (r .text )
882888
883889 tf = _pd .DataFrame (tmp ["series" ][0 ]["data" ], columns = ["date" , "value" ])
884890 tf ["table_name" ] = tmp ["series" ][0 ]["name" ]
@@ -892,7 +898,7 @@ def _get_eia_df_v1(tables, key):
892898 return eia
893899
894900
895- def _get_eia_df_v2 (tables , key ):
901+ def _get_eia_df_v2 (tables , key , sleep ):
896902 """
897903 Function for download data from the US Government EIA and return it as a pandas dataframe/series.
898904 API version 2.
@@ -926,17 +932,27 @@ def _get_eia_df_v2(tables, key):
926932
927933 for tbl in tables :
928934 url = f"http://api.eia.gov/v2/seriesid/{ tbl } ?api_key={ key } "
929- tmp = json .loads (requests .get (url ).text )
930935
931- tf = _pd .DataFrame (tmp ['response' ]['data' ], columns = ["period" ,"series-description" , "value" ])
936+ try :
937+ r = requests .get (url )
938+ tmp = json .loads (r .text )
939+ tf = _pd .DataFrame (
940+ tmp ["response" ]["data" ],
941+ columns = ["period" , "series-description" , "value" ],
942+ )
943+ except :
944+ print (f"Error in table { tbl } " )
945+ print (r .text )
946+ continue
932947 tf ["series_id" ] = tbl
933948 eia = _pd .concat ([eia , tf ], axis = 0 )
949+ time .sleep (sleep )
934950 # eia = eia.append(tf)
935-
936- eia = eia .rename (columns = {' period' : ' date' , ' series-description' : ' table_name' })
951+
952+ eia = eia .rename (columns = {" period" : " date" , " series-description" : " table_name" })
937953 eia .loc [eia .date .str .len () < 7 , "date" ] += "01"
938954 eia .date = _pd .to_datetime (eia .date )
939- return eia [[' date' , ' value' , ' table_name' , ' series_id' ]]
955+ return eia [[" date" , " value" , " table_name" , " series_id" ]]
940956
941957
942958def _check_df (df ):
@@ -949,7 +965,7 @@ def _check_df(df):
949965
950966def infer_freq (x , multiplier = False ):
951967 """
952- Function to infer the frequency of a time series. Improvement over
968+ Function to infer the frequency of a time series. Improvement over
953969 pandas.infer_freq as it can handle missing days/holidays. Note that
954970 for business days it will return 'D' vs 'B'
955971
@@ -991,4 +1007,3 @@ def infer_freq(x, multiplier=False):
9911007 return 4
9921008 elif freq [0 ] == "A" :
9931009 return 1
994-
0 commit comments