mirror of
https://github.com/kennethreitz/coinbin.org.git
synced 2026-06-05 23:10:17 +00:00
46844ab7d0
Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
85 lines
2.1 KiB
Python
85 lines
2.1 KiB
Python
import time
|
||
import uuid
|
||
|
||
import records
|
||
import os
|
||
|
||
import maya
|
||
import numpy as np
|
||
import pandas as pd
|
||
|
||
# Matplotlib hack.
|
||
|
||
import matplotlib
|
||
matplotlib.use('agg')
|
||
|
||
import mpld3
|
||
from fbprophet import Prophet
|
||
|
||
from scraper import Coin, MWT, convert_to_decimal
|
||
|
||
|
||
PERIODS = 30
|
||
GRAPH_PERIODS = 365
|
||
|
||
|
||
|
||
@MWT(timeout=300)
|
||
def get_predictions(coin, render=False):
|
||
"""Returns a list of predictions, unless render is True.
|
||
Otherwise, returns the path of a rendered image.
|
||
"""
|
||
|
||
c = Coin(coin)
|
||
|
||
q = "SELECT date as ds, value as y from api_coin WHERE name=:coin"
|
||
|
||
db = records.Database()
|
||
rows = db.query(q, coin=c.name)
|
||
|
||
df = rows.export('df')
|
||
|
||
df['y_orig'] = df['y'] # to save a copy of the original data..you'll see why shortly.
|
||
|
||
# log-transform y
|
||
df['y'] = np.log(df['y'])
|
||
|
||
model = Prophet(weekly_seasonality=True, yearly_seasonality=True)
|
||
model.fit(df)
|
||
|
||
periods = PERIODS if not render else GRAPH_PERIODS
|
||
|
||
future_data = model.make_future_dataframe(periods=periods, freq='d')
|
||
forecast_data = model.predict(future_data)
|
||
|
||
if render:
|
||
matplotlib.pyplot.gcf()
|
||
fig = model.plot(forecast_data, xlabel='Date', ylabel='log($)')
|
||
return mpld3.fig_to_html(fig)
|
||
|
||
forecast_data_orig = forecast_data # make sure we save the original forecast data
|
||
forecast_data_orig['yhat'] = np.exp(forecast_data_orig['yhat'])
|
||
forecast_data_orig['yhat_lower'] = np.exp(forecast_data_orig['yhat_lower'])
|
||
forecast_data_orig['yhat_upper'] = np.exp(forecast_data_orig['yhat_upper'])
|
||
|
||
df['y_log'] = df['y'] #copy the log-transformed data to another column
|
||
df['y'] = df['y_orig'] #copy the original data to 'y'
|
||
|
||
# print(forecast_data_orig)
|
||
d = forecast_data_orig['yhat'].to_dict()
|
||
predictions = []
|
||
|
||
for i, k in enumerate(list(d.keys())[-PERIODS:]):
|
||
w = maya.when(f'{i+1} days from now')
|
||
predictions.append({
|
||
'when': w.slang_time(),
|
||
'timestamp': w.iso8601(),
|
||
'usd': convert_to_decimal(d[k]),
|
||
})
|
||
|
||
return predictions
|
||
|
||
|
||
if __name__ == '__main__':
|
||
print(get_predictions('btc'))
|