Python API for FRED — Random Points (original) (raw)
FRED data
FRED (Federal Reserve Economic Data) is a vast database of economic data provided by the Federal Reserve Bank of St. Louis. It currently contains 237,000 data series and it continues to expand.
I wrote a simple python module called fredapi
that makes it easy to access the FRED data. It returns data in pandas
data structures.
This module also makes it easy to deal with data revisions. Many economic data series contain frequent revisions for various reasons. fredapi
provides several convenient methods for handling data revisions and answering the quesion of what-data-was-known-when.
The system in FRED that contains historic data revisions is also known as ALFRED (ArchivaL Federal Reserve Economic Data.) You can look at my github page for more detailed examples related to ALFRED and data revisions.
Installing
The easiest way to install fredapi is through pip:
You can also download or view the code from my github page.
Example usage
Import the fredapi
module. Note that I have set my api key to the environment variable FRED_API_KEY
. You can also pass your key explicitly.
In [1]:
from fredapi import Fred fred = Fred()
Import pandas
and several display and plotting options
In [2]:
import pandas as pd pd.options.display.max_colwidth = 60
In [3]:
%matplotlib inline import matplotlib.pyplot as plt from IPython.core.pylabtools import figsize figsize(20, 5)
If you already know the series ID you want (say by searching on the FRED website), you can fetch data easily into a pandas Series
In [4]:
s = fred.get_series('SP500', observation_start='2014-09-02', observation_end='2014-09-05') s.tail()
Out[4]:
2014-09-02 2002.28 2014-09-03 2000.72 2014-09-04 1997.65 2014-09-05 2007.71 dtype: float64
In [5]:
s = fred.get_series('SP500', observation_start='1/31/2014') s.tail()
Out[5]:
2014-11-19 2048.72 2014-11-20 2052.75 2014-11-21 2063.50 2014-11-24 2069.41 2014-11-25 2067.03 dtype: float64
You can also easily fetch the meta data about any series
In [6]:
info = fred.get_series_info('PAYEMS') info['title']
Out[6]:
'All Employees: Total nonfarm'
You can also get a set of series IDs programmatically by release or category IDs. Several sorting options are also available. On the FRED website I know that the release ID 175 contains some personal income data. Let's fetch 5 most popular series in that set.
In [7]:
personal_income_series = fred.search_by_release(175, limit=5, order_by='popularity', sort_order='desc')
In [8]:
personal_income_series['title']
Out[8]:
series id PCPI06075 Per Capita Personal Income in San Francisco County/city, CA PCPI06085 Per Capita Personal Income in Santa Clara County, CA PCPI11001 Per Capita Personal Income in the District of Columbia PCPI36061 Per Capita Personal Income in New York County, NY PCPI32003 Per Capita Personal Income in Clark County, NV Name: title, dtype: object
In [9]:
df = {} df['SF'] = fred.get_series('PCPI06075') df['NY'] = fred.get_series('PCPI36061') df['DC'] = fred.get_series('PCPI11001') df = pd.DataFrame(df) df.plot()
Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x10a7341d0>
You can also search by categories. On the FRED website I see that category 101
contains data about Consumer Credit.
In [10]:
df = fred.search_by_category(101, limit=10, order_by='popularity', sort_order='desc') df['title']
Out[10]:
series id TOTALSL Total Consumer Credit Owned and Securitized, Outstanding TERMCBAUTO48NS Finance Rate on Consumer Installment Loans at Commercial... SLOAS Student Loans Owned and Securitized, Outstanding TERMCBPER24NS Finance Rate on Personal Loans at Commercial Banks, 24 M... TERMAFCNCNSA New Car Average Finance Rate at Auto Finance Companies REVOLSL Total Revolving Credit Owned and Securitized, Outstanding TERMCBCCALLNS Commercial Bank Interest Rate on Credit Card Plans, All ... MVLOAS Motor Vehicle Loans Owned and Securitized, Outstanding NONREVSL Total Nonrevolving Credit Owned and Securitized, Outstan... TERMCBCCINTNS Commercial Bank Interest Rate on Credit Card Plans, Acco... Name: title, dtype: object
As a example let's fetch the personal income data. Release 151
looks quite intersting
In [11]:
df = fred.search_by_release(151) df['title'].head(10)
Out[11]:
series id AKPCPI Per Capita Personal Income in Alaska ALPCPI Per Capita Personal Income in Alabama ARPCPI Per Capita Personal Income in Arkansas AZPCPI Per Capita Personal Income in Arizona BEAFWPCPI Per Capita Personal Income in the Far West BEA Region BEAGLPCPI Per Capita Personal Income in the Great Lakes BEA Region BEAMEPCPI Per Capita Personal Income in the Mideast BEA Region BEANEPCPI Per Capita Personal Income in the New England BEA Region BEAPLPCPI Per Capita Personal Income in the Plains BEA Region BEARMPCPI Per Capita Personal Income in the Rocky Mountain BEA Region Name: title, dtype: object
I noticed that the data is mostly organized by state, except for a few that are by BEA region. We can use pandas
to easily select the seires we want
In [12]:
state_df = df[~df['title'].str.startswith('Per Capita Personal Income in the')]
Out[14]:
series id AKPCPI AK ALPCPI AL ARPCPI AR AZPCPI AZ CAPCPI CA COPCPI CO CTPCPI CT DEPCPI DE FLPCPI FL GAPCPI GA HIPCPI HI IAPCPI IA IDPCPI ID ILPCPI IL INPCPI IN KSPCPI KS KYPCPI KY LAPCPI LA MAPCPI MA MDPCPI MD MEPCPI ME MIPCPI MI MNPCPI MN MOPCPI MO MSPCPI MS MTPCPI MT NCPCPI NC NDPCPI ND NEPCPI NE NHPCPI NH NJPCPI NJ NMPCPI NM NVPCPI NV NYPCPI NY OHPCPI OH OKPCPI OK ORPCPI OR PAPCPI PA RIPCPI RI SCPCPI SC SDPCPI SD TNPCPI TN TXPCPI TX UTPCPI UT VAPCPI VA VTPCPI VT WAPCPI WA WIPCPI WI WVPCPI WV WYPCPI WY Name: id, dtype: object
looks good, we got the data series for all 50 states here
In [15]:
income_by_state = {} for series_id in state_df.index: income_by_state[series_id[:2]] = fred.get_series(series_id)
In [16]:
income_by_state = pd.DataFrame(income_by_state)
In [17]:
income_by_state.ix[-1].plot(kind='bar') plt.title('Per Capita Personal Income by State')
Out[17]:
<matplotlib.text.Text at 0x10bcf0a10>