From 40d09e63bde346d2790d386e13649181fd258586 Mon Sep 17 00:00:00 2001 From: toravest Date: Sun, 30 Mar 2025 12:32:46 +0200 Subject: [PATCH] =?UTF-8?q?handel=20nordic(=C3=A6=C3=B8=C3=A5),=20handel?= =?UTF-8?q?=20missing=20values,=20data=20cleaning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notebooks/notebook_one_day_data.ipynb | 62 +++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/notebooks/notebook_one_day_data.ipynb b/notebooks/notebook_one_day_data.ipynb index 1083d65..5cbc500 100644 --- a/notebooks/notebook_one_day_data.ipynb +++ b/notebooks/notebook_one_day_data.ipynb @@ -74,9 +74,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Velg en by i Norge og få data\n", + "### Velg et sted i Norge og få data\n", "\n", - "Skriv inn en by du ønsker data fra, foreløpig er det begrenset til Norge\n", + "Skriv inn et sted du ønsker data fra, foreløpig er det begrenset til Norge\n", "\n", "Programmet vil deretter hente data å lagre det i en json fil" ] @@ -99,6 +99,12 @@ "# User choose a city they want the weather data from\n", "city_name = input(\"Enter city name: \")\n", "\n", + "for letter in city_name:\n", + " if letter in 'æøå':\n", + " city_name = city_name.replace('æ', 'ae')\n", + " city_name = city_name.replace('ø', 'o')\n", + " city_name = city_name.replace('å', 'aa')\n", + "\n", "# Start_date is the first timestamp, end_date is the last\n", "start_date, end_date = timestamps[0], timestamps[-1]\n", "\n", @@ -358,7 +364,11 @@ "### Endre manglende verdier\n", "I de fleste tilfeller virker dataene å være tilnærmet \"perfekte\", men de inkluderer bare snø og regn dersom det er snø eller regn. Derfor vil vi fa NaN verdier i de målingene det ikke har regnet/snødd. \n", "\n", - "Under sjekker vi først om regn eller snø er i målingen, og hvis den er, bytter vi ut NaN med 0." + "Under sjekker vi først om regn eller snø er i målingen, og hvis de er, bytter vi ut NaN med 0. \n", + "\n", + "Så sjekker vi om alle verdiene i en kolonne er 'NaN', isåfall så fjerner vi hele kolonnen. Grunne til at dette ikke inkluderer snø og regn, er fordi vi senere plotter disse verdiene, og da får vi ikke feil om verdien er 0, men vil få om hele kolonnen mangler.\n", + "\n", + "Deretter sjekker vi andre verdier, og bytter enten 'NaN' med 0, eller med verdien før. Verdiene vi setter til 0 gjelder da snø, regn og vind, resten blir satt til verdien før." ] }, { @@ -379,7 +389,49 @@ "except KeyError:\n", " print(\"['snow.1h'], not in df\")\n", "\n", - "# Display the df, now without NaN (atleast for rain and snow)\n", + "# Drops all the columns, if it has 'NaN' value.\n", + "df = df.dropna(axis='columns', how='all')\n", + "\n", + "# If wind_gust is stored, fill the NaN with 0\n", + "try: \n", + " df['wind.gust'] = df['wind.gust'].fillna(0)\n", + "except KeyError:\n", + " print(\"['wind.gust'], not in df\")\n", + "\n", + "# If wind_deg is stored, fill the NaN with 0\n", + "try: \n", + " df['wind.deg'] = df['wind.deg'].fillna(0)\n", + "except KeyError:\n", + " print(\"['wind.deg'], not in df\")\n", + "\n", + "# If wind_speed is stored, fill the NaN with 0\n", + "try: \n", + " df['wind.speed'] = df['wind.speed'].fillna(0)\n", + "except KeyError:\n", + " print(\"['wind.speed'], not in df\")\n", + "\n", + "# If temperature is missing, take the same as the one before\n", + "df['main.temp'] = df['main.temp'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values in what the temperature feels like\n", + "df['main.feels_like'] = df['main.feels_like'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values in the pressure\n", + "df['main.pressure'] = df['main.pressure'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values in the humidity\n", + "df['main.humidity'] = df['main.humidity'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values in the lowest temperature \n", + "df['main.temp_min'] = df['main.temp_min'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values in the highest temperature \n", + "df['main.temp_max'] = df['main.temp_max'].fillna('obj.ffill()')\n", + "\n", + "# Forward fill missing values of clouds\n", + "df['clouds.all'] = df['clouds.all'].fillna('obj.ffill()')\n", + "\n", + "# Display the df, now without NaN\n", "display(df)" ] }, @@ -440,6 +492,7 @@ "snow = df['snow.1h']\n", "wind_gust = df['wind.gust']\n", "wind_speed = df['wind.speed']\n", + "temp_mean = temp.mean().round(2)\n", "\n", "# Two vertically stacked axis, (2 rows, 1 column), width and height of the figure, and the axis share the same x_axis\n", "fig, (ax1, ax3) = plt.subplots(2, 1,figsize=(15, 8), sharex=True)\n", @@ -452,6 +505,7 @@ "\n", "# Design the y-axis for temperatur\n", "ax1.set_ylabel('Temperature (°C)', color='tab:red')\n", + "ax1.axhline(y=temp_mean, color='tab:red', linestyle='dashed', label='Mean temperature (°C)')\n", "ax1.tick_params(axis='y', labelcolor='tab:red')\n", "\n", "# Plot Precipitation as bars on the secondary y-axis\n",