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

1306 lines
77 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Importing Libraries**"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import statsmodels.api as sm\n",
"import datetime as datetime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Preprocessing**"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Aggregating over Sammonpuistikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Albertinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Arabiankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Piispanportti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Marian sairaala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Perämiehenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töölönlahdenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koskelantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Päijänteentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lintulahdenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kansallismuseo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laulurastaantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaivopuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jämeräntaival\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Niittykumpu (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Toppelundinportti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Näkinsilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kutsuntatie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Muurarinkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Urheilupuisto (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Matinkyläntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Gyldenintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hauenkalliontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kössi Koskisen aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Fleminginkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hakaniemi (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kauppakorkeakoulu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Nordenskiöldinaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Munkkiniemen aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mamsellimyllynkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hietalahdentori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Karhupuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Matinkartanontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rautatientori / länsi\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lauttasaarensilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rautatientori / itä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itälahdenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Marjaniementie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Komeetankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Piispankallio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ympyrätalo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lystimäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Toinen linja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lastenlehto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vuosaaren puistopolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaivonkatsojanpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Niittymaa\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vallipolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Etuniementie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pitäjänmäen asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sompasaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Erottajan aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kuikkarinne\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lystimäensilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Olympiastadion\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Apollonkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töölöntulli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jätkäsaarenlaituri\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Reiherintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kamppi (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töölönkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Välimerenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kuusitie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalasatama (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sumukuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Intiankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kiasma\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Baana\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haukilahdenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Varustuksentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pajupillintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tilkanvierto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lauttasaaren ostoskeskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pasilan asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vanha kirkkopuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siilitie 13\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Bermudankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Betonimies\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haapaniemenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vilhonvuorenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Heikkiläntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siilitie 9\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jalavatie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mäntyviita\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Muusantori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eteläinen Hesperiankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Korjaamo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotinkylän kartano\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vallilan varikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Muotoilijankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Aurinkotuulenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Linnanmäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pajamäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Messeniuksenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eläinmuseo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mannerheimintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pohjois-Haagan asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ida Aalbergin tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kustaankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tollinpolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Venttiilikuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Syystie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töölönlahden puisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Porolahden koulu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Relanderinaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Käpyläntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Brahen kenttä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pernajantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Oravannahkatori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tontunmäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Viiskulma\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Brahen puistikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Orpaanporras\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Otsolahti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Peukaloisentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalkkihiekantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Varsapuistikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Narinkka\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töölöntori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itäkeskus (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Merihaka\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ulappasilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Painiitty\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hankasuontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Munkkivuoren ostoskeskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Isoisänsilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laivalahden puistotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haakoninlahdenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Halkaisijantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vanha Kauppahalli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Liisanpuistikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaisaniemenpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Myllypuro (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tapionaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Väärämäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paavalinpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laajalahden aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vanha Viertotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Porthania\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Verkatehtaanpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Annankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Länsisatamankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Otaranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Louhentori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kiskontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Esterinportti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Herttoniemi (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mikkolantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Urhea-kampus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Huovitie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Suurpellonaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jäähalli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Viikin tiedepuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Arabian kauppakeskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rastila (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kivikonlaita\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tietäjä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leikosaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hauenkallio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pohjolanaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mastokatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ooppera\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pohjankulma\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Länsituuli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itämerentori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Merisotilaantori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laajasalon ostoskeskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eränkävijäntori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kustaankartano\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ritarikatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Viljelijäntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Olarinluoma\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kylävoudintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Maistraatintori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laivasillankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Gebhardinaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rummunlyöjänkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Länsisatamankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Velodrominrinne\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Aalto-yliopisto (M), Korkeakouluaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalevalantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Saniaiskuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Katariina Saksilaisen katu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siilitie (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Juhana Herttuan tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Agronominkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kauppakeskus Columbus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Laajalahden keskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tenholantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Maunula\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Huopalahdentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Voikukantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vesakkotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kriikunakuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rajasaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Designmuseo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Punakiventie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mestarinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kesäkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koskelan varikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pohjolankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Westendinasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Halmetie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Friisilänaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Aurinkolahdenaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rautatieläisenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kontula (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hernepellontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hakalehto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Käpylän asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaapelitehdas\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Suomenlahdentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Läkkitori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mellunmäki (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mäkelänkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haagan tori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tyynenmerenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Unioninkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paloheinäntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lukutori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Heikkilänaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sepänkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Metsänneidonpolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Malminkartanon asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Postipuun koulu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tilkantori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Piispansilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Keilaniemi (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ulvilantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haapasaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Korppaanmäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Meri-Rastilan tori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Verkkosaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lokitie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Diakoniapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kapteeninpuistikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kauppakeskus Kaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Komentajankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tapiolan urheilupuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Karhulantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pihlajamäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Nelikkotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Teurastamo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Toppelundintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalevankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Otto Brandtin tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puistokaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vallikatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Postipuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ruskeasuon varikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Marjaniemi\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Agnetankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Huopalahden asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hernesaarenranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ramsinniementie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kivikonkaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lepolantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Säterinniitty\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vähäntuvantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Petter Wetterin tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Säterinrinne\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kanavaranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Cygnaeuksenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotila (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siltavoudintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tekniikantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tunnelitie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ala-Malmin tori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hanasaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hertanmäenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Thalianaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paciuksenkaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Opastinsilta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leppävaarankäytävä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalkkipellonmäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ratapihantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Radiokatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Arielinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sörnäinen (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ruomelantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lehtisaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Luoteisväylä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Golfpolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sofianlehdonkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tuohipolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kivikon liikuntapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ratsutori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kulttuuriaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotinharju\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Torpparinmäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Margareetankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Asentajanpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vuosaaren liikuntapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Herttoniemenranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ilmalan asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leppävaaranaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sateentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eteläesplanadi\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Humalniementie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kannelmäen liikuntapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Senaatintori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Auringonkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koukkusaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jännetie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Käskynhaltijantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sateenkaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Valimotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Aalto-yliopisto (M), Tietotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kulosaari (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tulisuontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Melkonkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Elimäenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Yhdyskunnankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Teollisuuskatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Von Daehnin katu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ruutikatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaustisentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jokipellontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mellstenintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rapakiventie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Seurasaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pukinmäen liikuntapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tiistiläntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pukinmäen asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sinkilätie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Malmin asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Huhtakuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tupasaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Saunalahdentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koivusaari (M)\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haukilahdenaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Takomotie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Teerisuontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ajomiehentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Keilaranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töyrynummi\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Aulangontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Linnakepolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kasarmitori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Salmisaarenranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Majurinkulma\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mustikkamaa\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puistolan asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vihdintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Viikin normaalikoulu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Valimon asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Meilahden sairaala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itäportti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sähkömies\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leppäsuonaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Herttoniemen kirkko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kontulankaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Matinlahdenranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Trumpettikuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Honkasuo\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paloheinän kirjasto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Abraham Wetterin tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Oulunkylän asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotilan ostoskeskus\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mosaiikkitori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kannelmäen asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eerikinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pirkkolan liikuntapuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Länsiterminaali\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sallatunturintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Torpanranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tammisalon aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Stenbäckinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leppävaaran uimahalli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hietaniemenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Revontulentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ahertajantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Westendintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Näyttelijäntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Marttila\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Karviaistie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Nuottaniementie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotilantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Elfvik\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kuunkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Karhusuontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Roihupelto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over A.I. Virtasen aukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sepetlahdentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Prinsessantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Teljäntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itäkeskus Metrovarikko\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Humikkalankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Savela\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paloheinän maja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tuukkalantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tiistinkallio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vanha Tapanilantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haukilahdensolmu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Uimastadion\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kirkkoherrantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kuninkaantammi\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hakuninmaa\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hämeenlinnanväylä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Alakiventie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Malmin sairaala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Etupellonpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kuusisaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Säteri\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koivu-Mankkaa\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Helluntairaitti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mäkitorpantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Töyrynummentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hagalundinpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Haukilahdenranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ehrenströmintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Purjetie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Gunillantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Linnuntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Maarinranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Isosaarentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mäkkylän asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalannintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Orionintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Piikintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Innopoli\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kurkimäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Maununneva\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mankkaanaukio\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kotinummentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Korkeasaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lettopolku\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puistolantori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Upseerinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Derby Business Park\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siltamäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jollas\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Workshop Helsinki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mankkaanlaaksontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Gransinmäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Keilalahti\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puistolan VPK\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lallukankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tapanilan asema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jakomäentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Maatullinkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Outotec\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tilketori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Vartioharjuntie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Alppikylä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Avaruuskatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Nokkala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Gallen-Kallelan tie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Malminkartanonhuippu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leppävaaran urheilupuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kurkimäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Rukatunturintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kurkijoentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tuulimäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Porvarintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Jakomäki\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Paciuksenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Heikinlaakso\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Koetilankuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pop-Up Kansalaistori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Sörnäisten metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Museokatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kampin metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hakaniemen metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Eiran Sairaala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kauppatori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Erottaja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over nan\n",
"Writing aggregated dataframe to .csv...\n",
"Failed to write nan due to 'float' object has no attribute 'replace'\n",
"Aggregating over Hollolantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kirjurinkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lumivaarantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalasataman metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Hylkeenpyytäjänkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Messitytönkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kaironkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Cygnauksenkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Marian Sairaala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Porkkalankatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Veturitori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Mäntytie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kalastajantie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lintumetsä\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Relay Box test station\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kauppakartanonkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Armas Launiksen katu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Workshop Konala\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Tiurintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over O'Bike Station\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ruomelantie***\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Leiritori\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Adjutantinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Lahnalahdentie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Professorintie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Niemenmäenkuja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Olarinkatu\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Ulvilanpuisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Friisinkalliontie\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Workshop Smoove\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over 999 Pop-Up Stadin Ammattiopisto\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over 9 Station Test\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over 09 Erottaja\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Herttoniemen ranta\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Puotilan metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kulosaaren metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Myllypuron metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Herttoniemen metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Itäkeskuksen metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Siilitien metroasema\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Pop-Up Jätkäsaari\n",
"Writing aggregated dataframe to .csv...\n",
"Aggregating over Kirjurinkuja\n",
"Writing aggregated dataframe to .csv...\n"
]
}
],
"source": [
"from os import listdir\n",
"\n",
"weather_df = pd.read_csv('datasets/weather_hourly_helsinki.csv', header=2)\n",
"bike_df = pd.DataFrame(columns=['Departure', 'Return', 'Departure station id', 'Departure station name', 'Return station id', 'Return station name', 'Covered distance (m)', 'Duration (sec.)'])\n",
"\n",
"print('Loading datasets...')\n",
"for dataset in listdir('datasets'):\n",
" if dataset == 'weather_hourly_helsinki.csv' or dataset == 'full_bike_data.csv' or dataset.endswith('.gz'):\n",
" continue\n",
" temp_df = pd.read_csv('datasets/' + dataset, low_memory=False)\n",
" bike_df = pd.concat([bike_df, temp_df])\n",
"\n",
"bike_df['Departure'] = pd.to_datetime(bike_df['Departure'], format='mixed')\n",
"bike_df['Return'] = pd.to_datetime(bike_df['Return'], format='mixed')\n",
"bike_df.to_csv('datasets/full_bike_data.csv')\n",
"\n",
"for station in bike_df['Departure station name'].unique():\n",
" print(f'Aggregating over {station}')\n",
" columns = ['Departure', 'Departure station name', 'Departure station id']\n",
" temp_station = bike_df.loc[bike_df['Departure station name'] == station, columns]\n",
" temp_station['trip'] = 1\n",
"\n",
" temp_station = temp_station.resample('h', on='Departure').trip.sum()\n",
"\n",
" print('Writing aggregated dataframe to .csv...')\n",
" try:\n",
" name = station.replace('/', '-')\n",
" temp_station.to_csv('datasets/' + name + '_hourly_aggregate.csv', mode='x')\n",
" except Exception as e:\n",
" print(f'Failed to write {station} due to {e}')\n",
"\n",
"for station in bike_df['Return station name'].unique():\n",
" print(f'Aggregating over {station}')\n",
" columns = ['Return', 'Return station name', 'Return station id']\n",
" temp_station = bike_df.loc[bike_df['Return station name'] == station, columns]\n",
" temp_station['trip'] = 1\n",
"\n",
" temp_station = temp_station.resample('h', on='Return').trip.sum()\n",
"\n",
" print('Writing aggregated dataframe to .csv...')\n",
" try:\n",
" name = station.replace('/', '-')\n",
" temp_station.to_csv('datasets/' + name + '_return_hourly_aggregate.csv', mode='x')\n",
" except Exception as e:\n",
" print(f'Failed to write {station} due to {e}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Plotting the Distribution of Bike Trips by Year**"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_354687/4263803594.py:1: DtypeWarning: Columns (3,5) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" df = pd.read_csv('datasets/full_bike_data.csv', low_memory=True)\n",
"/tmp/ipykernel_354687/4263803594.py:8: FutureWarning: \n",
"\n",
"Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
"\n",
" sns.barplot(x=bike_trips_per_year['Year'], y=bike_trips_per_year['Number of Trips'], palette='viridis')\n"
]
},
{
"data": {
"image/png": "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EwAAAACY8IngNH/+fDVs2FABAQG655579OWXX96y/apVq9SsWTMFBASodevW+uSTTzxUKQAAAICyyOvBaeXKlYqPj9eUKVO0e/dutWnTRr1799bp06eLbb9jxw4NHjxYw4YNU2ZmpmJiYhQTE6O9e/d6uHIAAAAAZYXXg9Ps2bM1YsQIDR06VC1atNCbb76pSpUqacmSJcW2nzdvnh544AE9++yzat68uaZPn6527drpjTfe8HDlAAAAAMoKf2+e/MqVK9q1a5cSEhKK1vn5+alHjx5KT08vdp/09HTFx8fbrevdu7fWrl1bbPuCggIVFBQUfc7Ly5Mk5efnm9Z3tbDAtA3sOfK9OuPa1Z9deryywOVjcIUxcJarx6CwgDFwlivHoPBn/i64Ha4cg2uXGIPb4coxKLh4xWXHKktcOQaXLl5z2bHKErMxuL7dMAzzgxle9N133xmSjB07dtitf/bZZ40OHToUu0/58uWN5cuX262bP3++UatWrWLbT5kyxZDEwsLCwsLCwsLCwsJS7HLixAnT7OLVK06ekJCQYHeFymaz6cyZM6pRo4YsFosXK7t9+fn5CgsL04kTJxQUFOTtcsokxsC7+P69jzHwPsbA+xgD72MMvK+kj4FhGDp//rzq1Klj2tarwemOO+5QuXLldOrUKbv1p06dUmhoaLH7hIaGOtXearXKarXaratatertF+1DgoKCSuR/oKUJY+BdfP/exxh4H2PgfYyB9zEG3leSxyA4ONihdl6dHKJChQqKiopSampq0TqbzabU1FRFR0cXu090dLRde0natGnTTdsDAAAAwG/l9Vv14uPjNWTIELVv314dOnTQ3LlzdfHiRQ0dOlSSFBsbq7p16yoxMVGSNGbMGHXp0kWzZs1S3759lZycrIyMDC1atMib3QAAAABQink9OA0aNEg//PCDJk+erNzcXLVt21YbNmxQSEiIJCk7O1t+fv+5MNapUyctX75ckyZN0oQJE3TXXXdp7dq1atWqlbe64HFWq1VTpky54RZEeA5j4F18/97HGHgfY+B9jIH3MQbeV5bGwGIYjsy9BwAAAABll9dfgAsAAAAAvo7gBAAAAAAmCE4AAAAAYILgBAAAAAAmCE5ekJiYqLvvvluBgYGqVauWYmJidPDgQbs2P//8s+Li4lSjRg1VqVJFf/jDH2548e/o0aMVFRUl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",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = pd.read_csv('datasets/full_bike_data.csv', low_memory=True)\n",
"\n",
"df['Departure'] = pd.to_datetime(df['Departure'])\n",
"df['Year'] = df['Departure'].dt.year\n",
"bike_trips_per_year = df.groupby('Year').size().reset_index(name='Number of Trips')\n",
"\n",
"plt.figure(figsize=(10, 6))\n",
"sns.barplot(x=bike_trips_per_year['Year'], y=bike_trips_per_year['Number of Trips'], palette='viridis')\n",
"\n",
"plt.xlabel('Year')\n",
"plt.ylabel('Number of Trips (in millions)')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Model for Predicting Departure Count**"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.08274263164029039\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_3569458/992788154.py:23: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n",
" print(res.forecast('2024-06-15 14:00:00')[-1])\n"
]
}
],
"source": [
"station = 'Kamppi (M)'\n",
"\n",
"data = pd.read_csv('datasets/' + station + '_hourly_aggregate.csv')\n",
"data['Departure'] = pd.to_datetime(data['Departure'], format='mixed')\n",
"\n",
"weather_df = pd.read_csv('datasets/weather_hourly_helsinki.csv', header=2)\n",
"weather_df['time'] = pd.to_datetime(weather_df['time'], format='mixed')\n",
"\n",
"data = pd.merge(weather_df, data, how='inner', left_on='time', right_on='Departure')\n",
"data = data.drop(['time'], axis=1)\n",
"data.set_index(data['temperature_2m (°C)'], inplace=True)\n",
"data.set_index(data['rain (mm)'], inplace=True)\n",
"data.set_index(data['Departure'], inplace=True)\n",
"\n",
"data['temperature_2m (°C)'] = pd.to_numeric(data['temperature_2m (°C)'], errors='coerce')\n",
"data['rain (mm)'] = pd.to_numeric(data['rain (mm)'], errors='coerce')\n",
"data['trip'] = pd.to_numeric(data['trip'], errors='coerce')\n",
"\n",
"data = data.dropna(axis=1)\n",
"\n",
"mod = sm.tsa.statespace.SARIMAX(data['trip'], order=(1, 1, 1), seasonal_order=(0, 1, 0, 24), freq='h')\n",
"res = mod.fit(disp=False)\n",
"print(res.forecast('2024-06-15 14:00:00')[-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Model for Predicting Return Count**"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/elliot/Projects/data-science-project/backend/env/lib/python3.12/site-packages/statsmodels/tsa/base/tsa_model.py:473: ValueWarning: No frequency information was provided, so inferred frequency h will be used.\n",
" self._init_dates(dates, freq)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"2023-11-01 00:00:00 0.332839\n",
"2023-11-01 01:00:00 0.108983\n",
"2023-11-01 02:00:00 1.033872\n",
"2023-11-01 03:00:00 0.008670\n",
"2023-11-01 04:00:00 0.000214\n",
" ... \n",
"2024-06-15 10:00:00 0.075210\n",
"2024-06-15 11:00:00 1.075206\n",
"2024-06-15 12:00:00 2.075204\n",
"2024-06-15 13:00:00 0.075204\n",
"2024-06-15 14:00:00 0.075204\n",
"Freq: h, Name: predicted_mean, Length: 5463, dtype: float64\n"
]
}
],
"source": [
"station = 'Kamppi (M)'\n",
"\n",
"data = pd.read_csv('datasets/' + station + '_return_hourly_aggregate.csv')\n",
"data['Return'] = pd.to_datetime(data['Return'], format='mixed')\n",
"\n",
"weather_df = pd.read_csv('datasets/weather_hourly_helsinki.csv', header=2)\n",
"weather_df['time'] = pd.to_datetime(weather_df['time'], format='mixed')\n",
"\n",
"data = pd.merge(weather_df, data, how='inner', left_on='time', right_on='Return')\n",
"data = data.drop(['time'], axis=1)\n",
"data.set_index(data['temperature_2m (°C)'], inplace=True)\n",
"data.set_index(data['rain (mm)'], inplace=True)\n",
"data.set_index(data['Return'], inplace=True)\n",
"\n",
"data['temperature_2m (°C)'] = pd.to_numeric(data['temperature_2m (°C)'], errors='coerce')\n",
"data['rain (mm)'] = pd.to_numeric(data['rain (mm)'], errors='coerce')\n",
"data['trip'] = pd.to_numeric(data['trip'], errors='coerce')\n",
"\n",
"data = data.dropna(axis=1)\n",
"\n",
"mod = sm.tsa.statespace.SARIMAX(data['trip'], order=(1, 1, 1), seasonal_order=(0, 1, 0, 24), freq='h')\n",
"res = mod.fit(disp=False)\n",
"print(res.forecast('2024-06-15 14:00:00'))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "env",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}