import pandas as pd
import matplotlib.pyplot as plt
import datetime
exchange_rates = pd.read_csv('euro-daily-hist_1999_2020.csv')
print(exchange_rates.head())
print(exchange_rates.tail())
print(exchange_rates.info())
Period\Unit: [Australian dollar ] [Bulgarian lev ] [Brazilian real ] \ 0 2021-01-08 1.5758 1.9558 6.5748 1 2021-01-07 1.5836 1.9558 6.5172 2 2021-01-06 1.5824 1.9558 6.5119 3 2021-01-05 1.5927 1.9558 6.5517 4 2021-01-04 1.5928 1.9558 6.3241 [Canadian dollar ] [Swiss franc ] [Chinese yuan renminbi ] [Cypriot pound ] \ 0 1.5543 1.0827 7.9184 NaN 1 1.5601 1.0833 7.9392 NaN 2 1.5640 1.0821 7.9653 NaN 3 1.5651 1.0803 7.9315 NaN 4 1.5621 1.0811 7.9484 NaN [Czech koruna ] [Danish krone ] ... [Romanian leu ] [Russian rouble ] \ 0 26.163 7.4369 ... 4.8708 90.8000 1 26.147 7.4392 ... 4.8712 91.2000 2 26.145 7.4393 ... 4.8720 90.8175 3 26.227 7.4387 ... 4.8721 91.6715 4 26.141 7.4379 ... 4.8713 90.3420 [Swedish krona ] [Singapore dollar ] [Slovenian tolar ] [Slovak koruna ] \ 0 10.0510 1.6228 NaN NaN 1 10.0575 1.6253 NaN NaN 2 10.0653 1.6246 NaN NaN 3 10.0570 1.6180 NaN NaN 4 10.0895 1.6198 NaN NaN [Thai baht ] [Turkish lira ] [US dollar ] [South African rand ] 0 36.8480 9.0146 1.2250 18.7212 1 36.8590 8.9987 1.2276 18.7919 2 36.9210 9.0554 1.2338 18.5123 3 36.7760 9.0694 1.2271 18.4194 4 36.7280 9.0579 1.2296 17.9214 [5 rows x 41 columns] Period\Unit: [Australian dollar ] [Bulgarian lev ] [Brazilian real ] \ 5694 1999-01-08 1.8406 NaN NaN 5695 1999-01-07 1.8474 NaN NaN 5696 1999-01-06 1.8820 NaN NaN 5697 1999-01-05 1.8944 NaN NaN 5698 1999-01-04 1.9100 NaN NaN [Canadian dollar ] [Swiss franc ] [Chinese yuan renminbi ] \ 5694 1.7643 1.6138 NaN 5695 1.7602 1.6165 NaN 5696 1.7711 1.6116 NaN 5697 1.7965 1.6123 NaN 5698 1.8004 1.6168 NaN [Cypriot pound ] [Czech koruna ] [Danish krone ] ... [Romanian leu ] \ 5694 0.58187 34.938 7.4433 ... 1.3143 5695 0.58187 34.886 7.4431 ... 1.3092 5696 0.58200 34.850 7.4452 ... 1.3168 5697 0.58230 34.917 7.4495 ... 1.3168 5698 0.58231 35.107 7.4501 ... 1.3111 [Russian rouble ] [Swedish krona ] [Singapore dollar ] \ 5694 27.2075 9.1650 1.9537 5695 26.9876 9.1800 1.9436 5696 27.4315 9.3050 1.9699 5697 26.5876 9.4025 1.9655 5698 25.2875 9.4696 1.9554 [Slovenian tolar ] [Slovak koruna ] [Thai baht ] [Turkish lira ] \ 5694 188.8400 42.560 42.5590 0.3718 5695 188.8000 42.765 42.1678 0.3701 5696 188.7000 42.778 42.6949 0.3722 5697 188.7750 42.848 42.5048 0.3728 5698 189.0450 42.991 42.6799 0.3723 [US dollar ] [South African rand ] 5694 1.1659 6.7855 5695 1.1632 6.8283 5696 1.1743 6.7307 5697 1.1790 6.7975 5698 1.1789 6.9358 [5 rows x 41 columns] <class 'pandas.core.frame.DataFrame'> RangeIndex: 5699 entries, 0 to 5698 Data columns (total 41 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Period\Unit: 5699 non-null object 1 [Australian dollar ] 5699 non-null object 2 [Bulgarian lev ] 5297 non-null object 3 [Brazilian real ] 5431 non-null object 4 [Canadian dollar ] 5699 non-null object 5 [Swiss franc ] 5699 non-null object 6 [Chinese yuan renminbi ] 5431 non-null object 7 [Cypriot pound ] 2346 non-null object 8 [Czech koruna ] 5699 non-null object 9 [Danish krone ] 5699 non-null object 10 [Estonian kroon ] 3130 non-null object 11 [UK pound sterling ] 5699 non-null object 12 [Greek drachma ] 520 non-null object 13 [Hong Kong dollar ] 5699 non-null object 14 [Croatian kuna ] 5431 non-null object 15 [Hungarian forint ] 5699 non-null object 16 [Indonesian rupiah ] 5699 non-null object 17 [Israeli shekel ] 5431 non-null object 18 [Indian rupee ] 5431 non-null object 19 [Iceland krona ] 3292 non-null float64 20 [Japanese yen ] 5699 non-null object 21 [Korean won ] 5699 non-null object 22 [Lithuanian litas ] 4159 non-null object 23 [Latvian lats ] 3904 non-null object 24 [Maltese lira ] 2346 non-null object 25 [Mexican peso ] 5699 non-null object 26 [Malaysian ringgit ] 5699 non-null object 27 [Norwegian krone ] 5699 non-null object 28 [New Zealand dollar ] 5699 non-null object 29 [Philippine peso ] 5699 non-null object 30 [Polish zloty ] 5699 non-null object 31 [Romanian leu ] 5637 non-null float64 32 [Russian rouble ] 5699 non-null object 33 [Swedish krona ] 5699 non-null object 34 [Singapore dollar ] 5699 non-null object 35 [Slovenian tolar ] 2085 non-null object 36 [Slovak koruna ] 2608 non-null object 37 [Thai baht ] 5699 non-null object 38 [Turkish lira ] 5637 non-null float64 39 [US dollar ] 5699 non-null object 40 [South African rand ] 5699 non-null object dtypes: float64(3), object(38) memory usage: 1.8+ MB None
exchange_rates.rename(columns={'[US dollar ]': 'US_dollar',
'Period\\Unit:': 'Time'},
inplace=True)
exchange_rates['Time'] = pd.to_datetime(exchange_rates['Time'])
exchange_rates.sort_values('Time', inplace=True)
exchange_rates.reset_index(drop=True, inplace=True)
euro_to_dollar = exchange_rates.copy()[['Time', 'US_dollar']]
euro_to_dollar['US_dollar'].value_counts()
- 62 1.2276 9 1.1215 8 1.1305 7 1.3532 6 .. 1.1042 1 1.2941 1 1.3553 1 1.5068 1 1.4579 1 Name: US_dollar, Length: 3528, dtype: int64
euro_to_dollar = euro_to_dollar[euro_to_dollar['US_dollar']!='-']
euro_to_dollar.shape
(5637, 2)
euro_to_dollar['US_dollar'] = euro_to_dollar['US_dollar'].astype(float)
%matplotlib inline
euro_to_dollar['rolling_mean'] = euro_to_dollar['US_dollar'].rolling(30).mean()
euro_to_dollar.iloc[28:31]
Time | US_dollar | rolling_mean | |
---|---|---|---|
28 | 1999-02-11 | 1.1312 | NaN |
29 | 1999-02-12 | 1.1244 | 1.150667 |
30 | 1999-02-15 | 1.1238 | 1.148830 |
plt.style.use('ggplot')
plt.plot(euro_to_dollar['Time'], euro_to_dollar['rolling_mean'])
[<matplotlib.lines.Line2D at 0x7fee4469e280>]
euro_to_dollar[['Time']].info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 5637 entries, 0 to 5698 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Time 5637 non-null datetime64[ns] dtypes: datetime64[ns](1) memory usage: 88.1 KB
euro_to_dollar['Year'] = euro_to_dollar['Time'].dt.year
euro_to_dollar['Year'].value_counts().sort_index()
1999 259 2000 255 2001 254 2002 255 2003 255 2004 259 2005 257 2006 255 2007 255 2008 256 2009 256 2010 258 2011 257 2012 256 2013 255 2014 255 2015 256 2016 257 2017 255 2018 255 2019 255 2020 257 2021 5 Name: Year, dtype: int64
%matplotlib inline
import matplotlib
matplotlib.style.use('fivethirtyeight')
euro_to_dollar = euro_to_dollar.copy()[euro_to_dollar['rolling_mean']!=0]
import numpy as np
fig = plt.figure(figsize=(12,6))
gs = fig.add_gridspec(2,3)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[0, 2])
ax4 = fig.add_subplot(gs[1, :])
ax1.plot(euro_to_dollar[euro_to_dollar['Year'].between(2001,2008,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2001,2008,inclusive='left')]['rolling_mean'],
color='purple', alpha=.6,
linewidth=3)
ax1.set_ylim([.8,1.7])
ax1.set_xticklabels(['','2001','','2003','','2005','','2007','','2009'], alpha=.5)
ax1.set_yticklabels(['','1.0','1.2','1.4','1.6'], alpha=.5)
ax2.plot(euro_to_dollar[euro_to_dollar['Year'].between(2009,2016,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2009,2016,inclusive='left')]['rolling_mean'],
color='orange', alpha=.8,
linewidth=3)
ax2.set_ylim([.8,1.7])
ax2.set_xticklabels(['','2009','','2011','','2013','','2015','','2017'], alpha=.5)
ax2.set_yticklabels(['','1.0','1.2','1.4','1.6'], alpha=.5)
ax3.plot(euro_to_dollar[euro_to_dollar['Year'].between(2017,2020,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2017,2020,inclusive='left')]['rolling_mean'],
color='blue', alpha=.6,
linewidth=3)
ax3.set_ylim([.8,1.7])
ax3.set_xticklabels(['','2017','','2018','','2019','','2020','','2021'], alpha=.5)
ax3.set_yticklabels(['','1.0','1.2','1.4','1.6'], alpha=.5)
ax4.plot(euro_to_dollar[euro_to_dollar['Year'].between(2001,2020,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2001,2020,inclusive='left')]['rolling_mean'],
color='purple', alpha=0,
linewidth=3)
ax4.plot(euro_to_dollar[euro_to_dollar['Year'].between(2001,2008,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2001,2008,inclusive='left')]['rolling_mean'],
color='purple', alpha=.6,
linewidth=3)
ax4.plot(euro_to_dollar[euro_to_dollar['Year'].between(2009,2016,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2009,2016,inclusive='left')]['rolling_mean'],
color='orange', alpha=.8,
linewidth=3)
ax4.plot(euro_to_dollar[euro_to_dollar['Year'].between(2017,2020,inclusive='left')]['Time'],
euro_to_dollar[euro_to_dollar['Year'].between(2017,2020,inclusive='left')]['rolling_mean'],
color='blue', alpha=.6,
linewidth=3)
ax4.set_xticklabels([])
ax4.set_ylim([.6,1.7])
ax4.set_yticks([1.0, 1.2, 1.4, 1.6])
ax4.set_yticklabels(['1.0','1.2','1.4','1.6'], alpha=.5)
ax4.grid(axis='x')
ax1.text(np.datetime64('2003-07-01 00:00:00'),1.9,s='BUSH',weight='bold',color='purple',alpha=.6,size=20)
ax1.text(np.datetime64('2003-03-01 00:00:00'),1.8,s='(2001-2009)',alpha=.4,size=13)
ax2.text(np.datetime64('2011-02-01 00:00:00'),1.9,s='OBAMA',weight='bold',color='orange',alpha=.8,size=20)
ax2.text(np.datetime64('2011-03-01 00:00:00'),1.8,s='(2009-2017)',alpha=.4,size=13)
ax3.text(np.datetime64('2018-03-01 00:00:00'),1.9,s='TRUMP',weight='bold',color='blue',alpha=.6,size=20)
ax3.text(np.datetime64('2018-03-01 00:00:00'),1.8,s='(2017-2021)',alpha=.4,size=13)
ax1.text(np.datetime64('1999-10-01 00:00:00'),2.3,
s='EURO-USD rate averaged 1.22 under the last three US presidents',
weight='bold',size=20)
ax1.text(np.datetime64('1999-10-01 00:00:00'),2.2,
s='EURO-USD exchange rates under George W. Bush (2001-2009), Barack Obama (2009-2017),',
size=15)
ax1.text(np.datetime64('1999-10-01 00:00:00'),2.1,
s='and Donald Trump (2017-2021)',
size=15)
ax4.text(np.datetime64('1999-04-01 00:00:00'), .6,
backgroundcolor='#4d4d4d', color='#fcfcf1',
s='DATAQUEST Project by Mos Cheung' + ' '*68 + 'Source: European Central Bank')
plt.show()