timeseries Example with GBP/USD Historical Daily Rates and Daily New Cases of Covid-19

See generated html here.

Initialization

In [1]:
# !pip install --use-feature=in-tree-build git+https://github.com/krzpiesiewicz/timeseries
In [2]:
from datetime import datetime

import pandas as pd

from timeseries import Interval
from timeseries.plotting import plot_ts, plot_hist, plot_acf, plot_pacf
from timeseries.transform.ihs import IHSTransformer

GBP/USD Historical Daily Rates (Pyplot Engine)

Time Series Loading and Visualization

In [3]:
# .csv available to download at:
# https://www.investing.com/currencies/gbp-usd-historical-data
gpd_usd_data = pd.read_csv("data/GBP_USD Historical Data_daily.csv")
gpd_usd_data["Date"] = pd.to_datetime(gpd_usd_data.Date, format="%b %d, %Y")
gpd_usd_data.set_index("Date", inplace=True)
gpd_usd_data.sort_index(ascending=True, inplace=True)

ts = gpd_usd_data.Price
whole_intv = Interval(ts, datetime(2019, 1, 1))
train_intv = Interval(ts, datetime(2020, 2, 1), datetime(2021, 4, 1))
display(plot_ts(whole_intv.view(), title="GBP/USD Daily"))

Plain differencing

In [4]:
trans = IHSTransformer(ts, interval=train_intv, verbose=True, lmb=None)
trans_ts = trans.transform(ts)
print(f"differenced only – skewness: {trans_ts.skew()}")
fig = plot_ts(whole_intv.view(trans_ts),
               title="GBP/USD Daily – Differenced")
plot_ts(train_intv.view(trans_ts), color="tab:red", name="train",
        fig=fig)
display(fig)
Order of differencing: 1
differenced only – skewness: -0.7761890333877342

Inverse Hyperbolic Sine (IHS) Transformation

$$ f^{\mathrm{IHS}}(x_t, \lambda) = \frac{\sinh^{-1}(\lambda x_t)}{\lambda} = \log{\frac{\lambda x_t + (\lambda^2 {x_t}^2 + 1)^{1/2}}{\lambda}} \;\;\;\;\;\text{for } \;\; \lambda > 0 $$
In [5]:
trans_ihs = IHSTransformer(ts, interval=train_intv, verbose=True, save_loglikelihood_deriv=True)
display(plot_ts(trans_ihs.loglikelihood_deriv, title="GBP/USD Daily",
                xaxis_title=trans_ihs.loglikelihood_deriv.index.name))
Order of differencing: 1
MLE of IHS lambda: 90.75
In [6]:
trans_ihs_ts = trans_ihs.transform(ts)
print(f"differenced and IHS transformed – skewness: {trans_ihs_ts.skew()}")
fig = plot_ts(whole_intv.view(trans_ihs_ts), title="GBP/USD Daily – Differenced and IHS Transformed")
plot_ts(train_intv.view(trans_ihs_ts), color="tab:red", name="train",
        fig=fig)
display(fig)
differenced and IHS transformed – skewness: -0.07236345482265553

Histogram of Transformed Time Series

In [7]:
figh = plot_hist(whole_intv.view(trans_ts), bins=50, title="GBP/USD Daily – Histogram of Transformed",
                 name="differenced only")
plot_hist(whole_intv.view(trans_ihs_ts), fig=figh, bins=50, name="differenced and IHS transformed")
display(figh)

Detransformation

In [8]:
detrans_ts = trans_ihs.detransform(train_intv.view(trans_ihs_ts), train_intv.prev_view())

fig = plot_ts(whole_intv.view(), title="GBP/USD Daily")
plot_ts(detrans_ts, color="red", name="detransformed train", fig=fig)
display(fig)

Daily New Cases of Covid-19 (Plotly Engine)

Covid-19 Time Series Loading and Visualization

In [9]:
# .csv available to download at:
# https://ourworldindata.org/explorers/coronavirus-data-explorer
covid_data = pd.read_csv("data/covid-data.csv")
covid_data["date"] = pd.to_datetime(covid_data["date"], format="%Y-%m-%d")
covid_data.set_index("date", inplace=True)
covid_data.sort_index(ascending=True, inplace=True)

loc = "Argentina"
ts = covid_data[covid_data.location == loc]["new_cases"]
ts = ts[~ts.isnull()]

plot_ts(ts, title=f"Covid-19 {loc}", engine="plotly", color="tab:blue")

Plain differencing of Covid-19 Time Series

In [10]:
train_intv = Interval(ts, begin=datetime(2020, 8, 1), end=datetime(2021, 3, 1))

trans = IHSTransformer(ts, interval=train_intv, lmb=None, verbose=True)
trans_ts = trans.transform(ts)
print(f"differenced only – skewness: {trans_ts.skew()}")

fig = plot_ts(trans_ts, engine="plotly", color="tab:blue",
              title=f"Covid-19 New Cases in {loc} – Differenced")
plot_ts(train_intv.view(trans_ts), color="tab:red", fig=fig)
differenced only – skewness: 0.4909252510631482
Order of differencing: 1

Inverse Hyperbolic Sine (IHS) Transformation of Covid-19 Time Series

In [11]:
trans_ihs = IHSTransformer(ts, interval=train_intv, verbose=True)
trans_ihs_ts = trans_ihs.transform(ts)
print(f"differenced with IHS – skewness: {trans_ihs_ts.skew()}")

fig = plot_ts(trans_ihs_ts, engine="plotly", color="tab:blue",
              title=f"Covid-19 New Cases in {loc} – IHS Transformed")
plot_ts(train_intv.view(trans_ihs_ts), color="tab:red", fig=fig)
Order of differencing: 1
differenced with IHS – skewness: 0.23128501273486962
MLE of IHS lambda: 0.00028125

Autocorrelation and Partial Autocorrelation of Covid-19 Time Series

In [12]:
# plot_acf and plot_pacf are only available with pyplot engine at the moment
display(plot_acf(trans_ihs_ts))
display(plot_pacf(trans_ihs_ts))

Histogram of Transformed Covid-19 Time Series

In [13]:
figh = plot_hist(whole_intv.view(trans_ts), engine="plotly", color="tab:blue",
                 title=f"Covid-19 New Cases in {loc} – Histogram of IHS Transformed",
                 name="differenced only")
plot_hist(whole_intv.view(trans_ihs_ts), fig=figh, name="differenced with IHS", color="tab:orange")

Detransformation of Covid-19 Time Series

In [14]:
detrans_ts = trans_ihs.detransform(train_intv.view(trans_ihs_ts), train_intv.prev_view())

fig = plot_ts(ts, title=f"Covid-19 {loc}", engine="plotly", color="tab:blue")
plot_ts(train_intv.view(ts), color="yellow", fig=fig)
plot_ts(detrans_ts, color="tab:red", name="detransformed IHS train", fig=fig)