This tutorial demonstrates how to populate a feature store with a timeseries of bitcoin price data, and then compute some transformations on it.
Run this tutorial as a Colab notebook.
As with the quick-start guide, start by creating a blank feature store and namespace.
fs = bh.FeatureStore()fs.create_namespace('tutorial', url='/tmp/featurestore/tutorial', description='Tutorial datasets')
Now download some data from the CoinDesk API and save it to the feature store.
from_date = '2017-01-01'to_date = pd.Timestamp.now().strftime('%Y-%m-%d')response = requests.get('https://api.coindesk.com/v1/bpi/historical/close.json',params={'start': from_date, 'end': to_date})response.raise_for_status()df_close = pd.DataFrame({'time': pd.to_datetime(list(response.json().get('bpi').keys())),'value': response.json().get('bpi').values()}).set_index('time')fs.create_feature('tutorial/bitcoin.close', partition='year') # Data is partitioned by year on diskfs.save_dataframe(df_close, 'tutorial/bitcoin.close')
We can now query and resample this data using load_dataframe
:
df_weekly = fs.load_dataframe(['tutorial/bitcoin.close'],from_date='2020-01-01', to_date='2020-12-31',freq='1W')print(df_weekly.head())
Now create transform features to compute the exponentially-weighted moving averages of the bitcoin price over different time windows, along with a momentum indicator.
@fs.transform('tutorial/bitcoin.ewma.15', from_features=['tutorial/bitcoin.close'])def ewma_15(df):return df.ewm(halflife=15).mean()@fs.transform('tutorial/bitcoin.ewma.30', from_features=['tutorial/bitcoin.close'])def ewma_30(df):return df.ewm(halflife=30).mean()@fs.transform('tutorial/bitcoin.momentum', from_features=['tutorial/bitcoin.ewma.15', 'tutorial/bitcoin.ewma.30'])def ewma_15(df):return df['tutorial/bitcoin.ewma.15'] - df['tutorial/bitcoin.ewma.30']
These new, transformed features are now available to query from the load_dataframe
method. They are calculated on-the-fly, and therefore reflect any changes to the underlying bitcoin price data.