Search code examples
pythonpandasdataframematplotlibfinance

matplotlib US Treasury yield curve


I'm currently trying to build a dataframe consisting of daily US Treasury Rates. As you can see, pandas automatically formats the columns so that they're in order, which clearly I do not want. Here's some of my code. I only needed to do a small example in order to show the problem I'm having.

import quandl
import matplotlib.pyplot as plt

One_Month = quandl.get('FRED/DGS1MO')

^^ Repeated for all rates

Yield_Curve = pd.DataFrame({'1m': One_Month['Value'], '3m': Three_Month['Value'], '1yr': One_Year['Value']})
Yield_Curve.loc['2017-06-22'].plot()
plt.show()

enter image description here

Yield_Curve.tail()


             1m      1yr     3m
Date            
2017-06-16  0.85    1.21    1.03
2017-06-19  0.85    1.22    1.02
2017-06-20  0.88    1.22    1.01
2017-06-21  0.85    1.22    0.99
2017-06-22  0.80    1.22    0.96

As I said, I only added three rates to the dataframe but obviously the two year, three year, and five year rates will cause a problem as well.

I did some searching and saw this post: Plotting Treasury Yield Curve, how to overlay two yield curves using matplotlib

While using the code in the last post clearly works, I'd rather be able to keep my current datasets (One_Month, Three_Month....) to do this since I use them for other analyses as well.

Question: Is there a way for me to lock the column order?

Thanks for your help!


Solution

  • With pandas-datareader you can specify the symbols as one list. And in addition to using reindex_axis as suggested by @Andrew L, you can also just pass a list of ordered columns with two brackets, see final line below, to specify column order.

    from pandas_datareader.data import DataReader as dr
    syms = ['DGS10', 'DGS5', 'DGS2', 'DGS1MO', 'DGS3MO']
    yc = dr(syms, 'fred') # could specify start date with start param here
    names = dict(zip(syms, ['10yr', '5yr', '2yr', '1m', '3m']))
    yc = yc.rename(columns=names)
    yc = yc[['1m', '3m', '2yr', '5yr', '10yr']]
    
    print(yc)
                  1m    3m   2yr   5yr  10yr
    DATE                                    
    2010-01-01   NaN   NaN   NaN   NaN   NaN
    2010-01-04  0.05  0.08  1.09  2.65  3.85
    2010-01-05  0.03  0.07  1.01  2.56  3.77
    2010-01-06  0.03  0.06  1.01  2.60  3.85
    2010-01-07  0.02  0.05  1.03  2.62  3.85
             ...   ...   ...   ...   ...
    2017-06-16  0.85  1.03  1.32  1.75  2.16
    2017-06-19  0.85  1.02  1.36  1.80  2.19
    2017-06-20  0.88  1.01  1.36  1.77  2.16
    2017-06-21  0.85  0.99  1.36  1.78  2.16
    2017-06-22  0.80  0.96  1.34  1.76  2.15
    
    yc.loc['2016-06-01'].plot(label='Jun 1')
    yc.loc['2016-06-02'].plot(label='Jun 2')
    plt.legend(loc=0)
    

    enter image description here