Storing data in database
First generate a fresh database built using latest source code:
import logging
import sys
logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
level=logging.INFO, stream=sys.stdout)
# Check your environment
print(sys.path)
Create a database with:
from solvency2_data.eiopa_data import get_workspace
from solvency2_data.sqlite_handler import EiopaDB
database = get_workspace()['database']
db = EiopaDB(database)
Reset the database with:
# Hard reset of DB - deletes the file and all stored data and rebuilds empty DB
db.reset()
Now populate it for every month:
import solvency2_data
solvency2_data.refresh()
Now this can be indirectly queried using the API
import solvency2_data
from datetime import date
ref_date = date(2020, 12, 31)
rfr = solvency2_data.get(ref_date)
meta = solvency2_data.get(ref_date, 'meta')
spr = solvency2_data.get(ref_date, 'spreads')
gov = solvency2_data.get(ref_date, 'govies')
sym_adj = solvency2_data.get(ref_date, 'sym_adj')
rfr.head()
Or directly queried via a SQL expression:
import pandas as pd
sql = "SELECT * FROM rfr"
df = pd.read_sql(sql, con=db.conn)
df = df.loc[df.scenario=='base',['currency_code','ref_date', 'duration', 'spot']]
df.head()
month_list = df.ref_date.drop_duplicates().to_list()
month_list[:5]
df['ref_date'] = df.ref_date.apply(lambda x: month_list.index(x))
df.head()
eurs = df.loc[df.currency_code=='EUR', ['ref_date', 'duration', 'spot']].set_index('ref_date')
gbps = df.loc[df.currency_code=='GBP', ['ref_date', 'duration', 'spot']].set_index('ref_date')
chfs = df.loc[df.currency_code=='CHF', ['ref_date', 'duration', 'spot']].set_index('ref_date')
usds = df.loc[df.currency_code=='USD', ['ref_date', 'duration', 'spot']].set_index('ref_date')
eurs.head()
list(eurs.loc[66, 'spot'].values)[:5]
Now have some fun :p
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
# plt.style.use('ggplot')
plt.xkcd()
fig, ax = plt.subplots(figsize=(7, 4))
ax.set(xlim=(0, 100), ylim=(-0.01, 0.04))
date_text = ax.text(0.02, 0.9, '', transform=ax.transAxes)
#plt.tight_layout()
plt.gcf().subplots_adjust(bottom=0.15, left=0.15)
plt.title('EIOPA Spots')
x = list(range(1,151))
#plt.xticks(ticks = x)
plt.xlabel('duration (years)')
plt.locator_params(axis='x', nbins=10)
percentage = np.array(list(map("{:.1%}".format, 0.005 * np.arange(-2, 10))))
plt.yticks(ticks=0.005 * np.arange(-2, 10), labels=percentage)
plt.ylabel('risk free spots')
date_text.set_text(month_list[0])
eur_start = ax.plot(x, eurs.loc[0,'spot'].values, color='b', ls='dashed', lw=2)[0]
eur_line = ax.plot(x, eurs.loc[0,'spot'].values, color='b', lw=2)[0]
gbp_start = ax.plot(x, gbps.loc[0, 'spot'].values, color='y', ls='dashed', lw=2)[0]
gbp_line = ax.plot(x, gbps.loc[0, 'spot'].values, color='y', lw=2)[0]
chf_start = ax.plot(x, chfs.loc[0, 'spot'].values, color='m', ls='dashed', lw=2)[0]
chf_line = ax.plot(x, chfs.loc[0, 'spot'].values, color='m', lw=2)[0]
ax.legend((eur_line, chf_line, gbp_line), ('eur', 'chf', 'gbp'), loc='lower right')
def animate(i):
key = min(i, 66)
date_text.set_text(month_list[key])
eur_line.set_ydata(list(eurs.loc[key, 'spot'].values))
gbp_line.set_ydata(list(gbps.loc[key, 'spot'].values))
chf_line.set_ydata(list(chfs.loc[key, 'spot'].values))
anim = FuncAnimation(
fig, animate, interval=100, frames=67 + 15)
plt.draw()
#plt.show()
HTML(anim.to_html5_video())