In [1]:
import pandas as pd
In [2]:
exchange_rates = pd.read_csv('euro-daily-hist_1999_2020.csv')
In [3]:
exchange_rates.head()
Out[3]:
Period\Unit: [Australian dollar ] [Bulgarian lev ] [Brazilian real ] [Canadian dollar ] [Swiss franc ] [Chinese yuan renminbi ] [Cypriot pound ] [Czech koruna ] [Danish krone ] ... [Romanian leu ] [Russian rouble ] [Swedish krona ] [Singapore dollar ] [Slovenian tolar ] [Slovak koruna ] [Thai baht ] [Turkish lira ] [US dollar ] [South African rand ]
0 2021-01-08 1.5758 1.9558 6.5748 1.5543 1.0827 7.9184 NaN 26.163 7.4369 ... 4.8708 90.8000 10.0510 1.6228 NaN NaN 36.8480 9.0146 1.2250 18.7212
1 2021-01-07 1.5836 1.9558 6.5172 1.5601 1.0833 7.9392 NaN 26.147 7.4392 ... 4.8712 91.2000 10.0575 1.6253 NaN NaN 36.8590 8.9987 1.2276 18.7919
2 2021-01-06 1.5824 1.9558 6.5119 1.5640 1.0821 7.9653 NaN 26.145 7.4393 ... 4.8720 90.8175 10.0653 1.6246 NaN NaN 36.9210 9.0554 1.2338 18.5123
3 2021-01-05 1.5927 1.9558 6.5517 1.5651 1.0803 7.9315 NaN 26.227 7.4387 ... 4.8721 91.6715 10.0570 1.6180 NaN NaN 36.7760 9.0694 1.2271 18.4194
4 2021-01-04 1.5928 1.9558 6.3241 1.5621 1.0811 7.9484 NaN 26.141 7.4379 ... 4.8713 90.3420 10.0895 1.6198 NaN NaN 36.7280 9.0579 1.2296 17.9214

5 rows × 41 columns

In [4]:
exchange_rates.tail()
Out[4]:
Period\Unit: [Australian dollar ] [Bulgarian lev ] [Brazilian real ] [Canadian dollar ] [Swiss franc ] [Chinese yuan renminbi ] [Cypriot pound ] [Czech koruna ] [Danish krone ] ... [Romanian leu ] [Russian rouble ] [Swedish krona ] [Singapore dollar ] [Slovenian tolar ] [Slovak koruna ] [Thai baht ] [Turkish lira ] [US dollar ] [South African rand ]
5694 1999-01-08 1.8406 NaN NaN 1.7643 1.6138 NaN 0.58187 34.938 7.4433 ... 1.3143 27.2075 9.1650 1.9537 188.8400 42.560 42.5590 0.3718 1.1659 6.7855
5695 1999-01-07 1.8474 NaN NaN 1.7602 1.6165 NaN 0.58187 34.886 7.4431 ... 1.3092 26.9876 9.1800 1.9436 188.8000 42.765 42.1678 0.3701 1.1632 6.8283
5696 1999-01-06 1.8820 NaN NaN 1.7711 1.6116 NaN 0.58200 34.850 7.4452 ... 1.3168 27.4315 9.3050 1.9699 188.7000 42.778 42.6949 0.3722 1.1743 6.7307
5697 1999-01-05 1.8944 NaN NaN 1.7965 1.6123 NaN 0.58230 34.917 7.4495 ... 1.3168 26.5876 9.4025 1.9655 188.7750 42.848 42.5048 0.3728 1.1790 6.7975
5698 1999-01-04 1.9100 NaN NaN 1.8004 1.6168 NaN 0.58231 35.107 7.4501 ... 1.3111 25.2875 9.4696 1.9554 189.0450 42.991 42.6799 0.3723 1.1789 6.9358

5 rows × 41 columns

In [5]:
exchange_rates.info()
<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
In [6]:
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)
exchange_rates.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5699 entries, 0 to 5698
Data columns (total 41 columns):
 #   Column                    Non-Null Count  Dtype         
---  ------                    --------------  -----         
 0   Time                      5699 non-null   datetime64[ns]
 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: datetime64[ns](1), float64(3), object(37)
memory usage: 1.8+ MB
In [7]:
euro_to_dollar = exchange_rates[['Time', 'US_dollar']]
In [8]:
euro_to_dollar = euro_to_dollar.copy()[euro_to_dollar['US_dollar'] != '-']
euro_to_dollar['US_dollar'] = euro_to_dollar['US_dollar'].astype(float)
In [9]:
euro_to_dollar['rolling_mean'] = euro_to_dollar['US_dollar'].rolling(30).mean()
euro_to_dollar = euro_to_dollar.dropna()
euro_to_dollar.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5608 entries, 29 to 5698
Data columns (total 3 columns):
 #   Column        Non-Null Count  Dtype         
---  ------        --------------  -----         
 0   Time          5608 non-null   datetime64[ns]
 1   US_dollar     5608 non-null   float64       
 2   rolling_mean  5608 non-null   float64       
dtypes: datetime64[ns](1), float64(2)
memory usage: 175.2 KB

How has the euro-dollar rate changed during the last three U.S. presidents (George W. Bush (2001-2009), Barack Obama (2009-2017), and Donald Trump (2017-2021))?

In [10]:
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.style as style
In [11]:
plt.plot(euro_to_dollar['Time'], euro_to_dollar['rolling_mean'])
plt.show()
In [12]:
import datetime as dt
euro_to_dollar.loc[(euro_to_dollar['Time'] >= dt.datetime(2001,1,20)) & (euro_to_dollar['Time'] <= dt.datetime(2009,1,19)),'President'] = "BUSH"
euro_to_dollar.loc[(euro_to_dollar['Time'] >= dt.datetime(2009,1,20)) & (euro_to_dollar['Time'] <= dt.datetime(2017,1,19)),'President'] = 'OBAMA'
euro_to_dollar.loc[euro_to_dollar['Time'] >= dt.datetime(2017,1,20),'President'] = 'TRUMP'
euro_to_dollar['President'].value_counts()
Out[12]:
OBAMA    2052
BUSH     2044
TRUMP    1013
Name: President, dtype: int64
In [13]:
euro_to_dollar = euro_to_dollar.dropna()
euro_to_dollar_bush = euro_to_dollar[euro_to_dollar['President'] == 'BUSH'].copy()
euro_to_dollar_obama = euro_to_dollar[euro_to_dollar['President'] == 'OBAMA'].copy()
euro_to_dollar_trump = euro_to_dollar[euro_to_dollar['President'] == 'TRUMP'].copy()
In [36]:
style.use('fivethirtyeight')
fig = plt.figure(figsize = (16,9))
spec = fig.add_gridspec(2, 3)

ax1 = fig.add_subplot(spec[1, :])
ax1.plot(euro_to_dollar_bush['Time'], euro_to_dollar_bush['rolling_mean'], color = '#9966cc')
ax1.plot(euro_to_dollar_obama['Time'], euro_to_dollar_obama['rolling_mean'], color = "#ffbf00")
ax1.plot(euro_to_dollar_trump['Time'], euro_to_dollar_trump['rolling_mean'], color = '#00b7e5')
plt.xticks([])
ax1.set_yticks([1.0, 1.2, 1.4, 1.6])
ax1.set_yticklabels(labels = [1.0, 1.2, 1.4, 1.6], color = 'grey')

ax00 = fig.add_subplot(spec[0, 0])
ax00.plot(euro_to_dollar_bush['Time'], euro_to_dollar_bush['rolling_mean'], color = '#9966cc')
ax00_ylim = ax00.get_ylim()
ax00.set_xticklabels(["", "2001", "", "2003", "", "2005", "", "2007", "", "2009"], color = 'grey')
ax00.set_yticks([1.0, 1.2, 1.4, 1.6])
ax00.set_yticklabels(labels = [1.0, 1.2, 1.4, 1.6], color = 'grey')
ax00.text(0.5, 1.15,"BUSH", color = '#9966cc', ha = 'center',
          weight = 'bold',fontsize = 'x-large', transform=ax00.transAxes)
ax00.text(0.5, 1.05, "(2001-2009)", color = 'grey', ha = 'center',
          weight = 'bold',fontsize = 'large',transform=ax00.transAxes)

ax01 = fig.add_subplot(spec[0, 1])
ax01.plot(euro_to_dollar_obama['Time'], euro_to_dollar_obama['rolling_mean'], color = "#ffbf00")
ax01.set_ylim(ax00_ylim)
ax01.set_xticklabels(["", "2009", "", "2011", "", "2013", "", "2015", "", "2017"],color = 'grey')
ax01.set_yticks([1.0, 1.2, 1.4, 1.6])
ax01.set_yticklabels(labels = [1.0, 1.2, 1.4, 1.6], color = 'grey')
ax01.text(0.5, 1.15,"OBAMA", color = '#ffbf00', ha = 'center',
          weight = 'bold',fontsize = 'x-large', transform=ax01.transAxes)
ax01.text(0.5, 1.05, "(2009-2017)", color = 'grey', ha = 'center',
          weight = 'bold',fontsize = 'large',transform=ax01.transAxes)

ax02 = fig.add_subplot(spec[0, 2])
ax02.plot(euro_to_dollar_trump['Time'], euro_to_dollar_trump['rolling_mean'], color = '#00b7e5')
ax02.set_ylim(ax00_ylim)
ax02.set_xticklabels(["2017", "", "2018", "", "2019", "", "2020", "", "2021"],color = 'grey')
ax02.set_yticks([1.0, 1.2, 1.4, 1.6])
ax02.set_yticklabels(labels = [1.0, 1.2, 1.4, 1.6], color = 'grey')
ax02.text(0.5, 1.15,"TRUMP", color = '#00b7e5', ha = 'center',
          weight = 'bold',fontsize = 'x-large', transform=ax02.transAxes)
ax02.text(0.5, 1.05, "(2009-2017)", color = 'grey', ha = 'center',
          weight = 'bold',fontsize = 'large',transform=ax02.transAxes)

plt.text(732300,2.1, "EURO-USD rate averaged 1.22 under the last three US Presidents",
        horizontalalignment='left', size = 28,weight = 'bold')
plt.text(732300,2, "EURO-USD exchange rates under George W.Bush (2001-2009), Barack Obama (2019-2017),",
        horizontalalignment='left', size = 22)
plt.text(732300,1.9, "and Donald Trump (2017-2021)",
        horizontalalignment='left', size = 22)
plt.text(732300, -0.2, "©DATAQUEST" + " "*160 + "Source: European Central Bank", 
         color = 'white',
         backgroundcolor = "#606060")

#ax00.get_xticks()

plt.show()
In [ ]: