Files
DATA11001-Introduction-to-D…/backend/app/views.py
T
2026-06-24 16:52:08 +02:00

80 lines
2.9 KiB
Python

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)