|
|
|
@@ -0,0 +1,80 @@
|
|
|
|
|
from django.http import HttpResponse, JsonResponse
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
import pandas as pd
|
|
|
|
|
import statsmodels.api as sm
|
|
|
|
|
|
|
|
|
|
stations = ['Kamppi (M)', 'Rautatientori - itä']
|
|
|
|
|
station_dict = {}
|
|
|
|
|
|
|
|
|
|
for station in stations:
|
|
|
|
|
departure_data = pd.read_csv('datasets/' + station + '_hourly_aggregate.csv')
|
|
|
|
|
return_data = pd.read_csv('datasets/' + station + '_return_hourly_aggregate.csv')
|
|
|
|
|
departure_data['Departure'] = pd.to_datetime(departure_data['Departure'], format='mixed')
|
|
|
|
|
return_data['Return'] = pd.to_datetime(return_data['Return'], format='mixed')
|
|
|
|
|
|
|
|
|
|
departure_data.set_index(departure_data['Departure'], inplace=True)
|
|
|
|
|
return_data.set_index(return_data['Return'], inplace=True)
|
|
|
|
|
|
|
|
|
|
departure_data['trip'] = pd.to_numeric(departure_data['trip'], errors='coerce')
|
|
|
|
|
return_data['trip'] = pd.to_numeric(return_data['trip'], errors='coerce')
|
|
|
|
|
|
|
|
|
|
departure_data = departure_data.dropna(axis=1)
|
|
|
|
|
return_data = return_data.dropna(axis=1)
|
|
|
|
|
|
|
|
|
|
departure_mod = sm.tsa.statespace.SARIMAX(departure_data['trip'], order=(1, 1, 1), seasonal_order=(0, 1, 0, 24), freq='h').fit(disp=False, low_memory=True)
|
|
|
|
|
return_mod = sm.tsa.statespace.SARIMAX(return_data['trip'], order=(1, 1, 1), seasonal_order=(0, 1, 0, 24), freq='h').fit(disp=False, low_memory=True)
|
|
|
|
|
|
|
|
|
|
station_dict[station] = {}
|
|
|
|
|
station_dict[station]['departure_mod'] = departure_mod
|
|
|
|
|
station_dict[station]['return_mod'] = return_mod
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def index(request):
|
|
|
|
|
return HttpResponse('You\'re at the app index.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def predict(request):
|
|
|
|
|
if request.method == 'GET':
|
|
|
|
|
current = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
timestamp = request.GET.get('timestamp', current)
|
|
|
|
|
station = request.GET.get('station', 'Kamppi (M)')
|
|
|
|
|
ts = timestamp
|
|
|
|
|
|
|
|
|
|
defaultBikeCount = 28
|
|
|
|
|
|
|
|
|
|
departingCount = -1
|
|
|
|
|
if departure_data.index.max() >= pd.to_datetime(timestamp):
|
|
|
|
|
ls = departure_data[departure_data['Departure'] == ts]['trip'].tolist()
|
|
|
|
|
if len(ls) != 0:
|
|
|
|
|
departingCount = ls[0]
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
departure_mod = station_dict[station]['departure_mod']
|
|
|
|
|
departForecast = departure_mod.forecast(timestamp)
|
|
|
|
|
departingCount = round(departForecast[-1])
|
|
|
|
|
|
|
|
|
|
returningCount = -1
|
|
|
|
|
if return_data.index.max() >= pd.to_datetime(timestamp):
|
|
|
|
|
ls = return_data[return_data['Return'] == ts]['trip'].tolist()
|
|
|
|
|
if len(ls) != 0:
|
|
|
|
|
returningCount = ls[0]
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
return_mod = station_dict[station]['return_mod']
|
|
|
|
|
returnForecast = return_mod.forecast(timestamp)
|
|
|
|
|
returningCount = round(returnForecast[-1])
|
|
|
|
|
|
|
|
|
|
bikeAtStationCount = defaultBikeCount - departingCount + returningCount
|
|
|
|
|
|
|
|
|
|
result = {
|
|
|
|
|
'timestamp': timestamp,
|
|
|
|
|
'station': station,
|
|
|
|
|
'departingCount': departingCount,
|
|
|
|
|
'returningCount': returningCount,
|
|
|
|
|
'bikeAtStationCount': bikeAtStationCount,
|
|
|
|
|
'increasing': returningCount > departingCount
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return JsonResponse(result)
|