diff --git a/notebooks/notebook_compare_one_day_data.ipynb b/notebooks/notebook_compare_one_day_data.ipynb index 2f04f25..4c06a91 100644 --- a/notebooks/notebook_compare_one_day_data.ipynb +++ b/notebooks/notebook_compare_one_day_data.ipynb @@ -88,7 +88,9 @@ "metadata": {}, "source": [ "### Velg andre sted til sammenligningen\n", - "Velg det andre stedet som skal brukes i sammenligningen, fortsatt begrenset til Norge." + "Velg det andre stedet som skal brukes i sammenligningen, fortsatt begrenset til Norge.\n", + "\n", + "Det er vanskelig å sammenligne det samme stedet. Derfor har vi lagt inn en while-løkke som sjekker om sted 2 er likt sted 1, og kjører frem til de er forskjellige." ] }, { @@ -132,7 +134,7 @@ "\n", "Vi samler dataen for begge stedene og skriver de til en json fil.\n", "\n", - "Skriv inn navn for til filen du vil lagre med dataen.\n", + "Skriv inn navn til filen du vil lagre med dataen.\n", "\n", "Eks. filnavn: test\n", "\n", @@ -225,9 +227,11 @@ "metadata": {}, "source": [ "### Viser temperaturen\n", - "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebgyd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og 'dt' som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", + "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebygd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og 'dt' som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", + "\n", + "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1.\n", "\n", - "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1." + "Det å regne ut median og standardavvik er ikke innebygd i SQL, i motsetning til gjennomsnitt, maks og min. Derfor regner vi ut disse verdiene manuelt. Vi henter temperatur data fra, grupperer dataen basert på city_name, og bruker den innebygde pandas funksjonen `median()` og `std()`, for hendholdsvis median og standardavvik. Siden verdiene grupperes på city_name, blir det indeksen med medianverdi som verdi. Derfor bruker vi `.reset_index()` for å nullstille og gjøre city_name til en kolonne, som bruker til å koble de to tabellene samen, med funksjonen `merge()`." ] }, { @@ -254,11 +258,26 @@ "\n", "# Extract and stores temperatur data for each city using pandas sql\n", "stat_temp_per_city = sqldf('''\n", - " SELECT city, city_name, AVG(`main.temp`) AS avg_temp, MAX(`main.temp`) AS max_temp, MIN(`main.temp`) AS min_temp\n", + " SELECT city, city_name, ROUND(AVG(`main.temp`), 2) AS avg_temp, ROUND(MAX(`main.temp`), 2) AS max_temp, ROUND(MIN(`main.temp`), 2) AS min_temp\n", " FROM both_cities_df\n", " GROUP BY city_name\n", " ''')\n", "\n", + "# Median and standard deviation cant be calculated with pandasql, therefor we need to add it later\n", + "# We calculate the median, based on the city_name, and reset city_name from index to a column\n", + "median_temp = temp_data.groupby('city_name')['temp'].median().reset_index().round(2)\n", + "# Decides the column name\n", + "median_temp.columns = ['city_name', 'median_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(median_temp, on='city_name')\n", + "\n", + "# We calculate the standard deviation, based on the city_name, and reset city_name from index to a column\n", + "stdev_temp = temp_data.groupby('city_name')['temp'].std().reset_index().round(2)\n", + "# Decides the column name\n", + "stdev_temp.columns = ['city_name', 'stdev_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(stdev_temp, on='city_name')\n", + "\n", "# Display the temperatur stats for both cities\n", "display(stat_temp_per_city)" ] @@ -414,6 +433,10 @@ "temp_mean_city_1 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", "temp_mean_city_2 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", "\n", + "# Getting the median for both cities\n", + "temp_median_city_1 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", + "temp_median_city_2 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", + "\n", "# Extract rain values for both cities\n", "# Because pandas sql returnes the value as a dataframe, we need to get the actual value (all rows, first column)\n", "city_1_rain = sqldf('''SELECT `rain.1h` FROM both_cities_df WHERE city = \"city_1\"''').iloc[:,0]\n", @@ -436,13 +459,15 @@ "# Set the title for the whole plot, above the upper plot\n", "ax1.set_title(f'Weather compare for {city_1} and {city_2} ({date}) ')\n", "\n", - "# Plots the temperature for city_1, with mean temperature\n", + "# Plots the temperature for city_1, with mean temperature and median temperature\n", "ax1.plot(x_axis, temp_city_1, color='#008080', label=f'Temperature {city_1}')\n", "ax1.axhline(temp_mean_city_1, color='#008080', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_1}')\n", + "ax1.axhline(temp_median_city_1, color='#008080', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_1}')\n", "\n", - "# Plots the temperature for city_2s, with mean temperature\n", + "# Plots the temperature for city_2s, with mean temperature and median temperature\n", "ax1.plot(x_axis, temp_city_2, color='#FFA500', label=f'Temperature {city_2}')\n", - "ax1.axhline(temp_mean_city_2, color='#FFA500', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_2}')\n", + "ax1.axhline(temp_mean_city_2, color=\"#B59B6A\", linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_2}')\n", + "ax1.axhline(temp_median_city_2, color='#B59B64', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_2}')\n", "\n", "# Design the y-axis for Temperature\n", "ax1.set_ylabel(\"Temperature (°C)\")\n", diff --git a/notebooks/notebook_compare_one_week_data.ipynb b/notebooks/notebook_compare_one_week_data.ipynb index b8b7b41..a81168e 100644 --- a/notebooks/notebook_compare_one_week_data.ipynb +++ b/notebooks/notebook_compare_one_week_data.ipynb @@ -246,9 +246,11 @@ "metadata": {}, "source": [ "### Viser temperaturen\n", - "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebgyd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og 'dt' som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", + "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebygd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og 'dt' som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", "\n", - "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1." + "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1.\n", + "\n", + "Det å regne ut median og standardavvik er ikke innebygd i SQL, i motsetning til gjennomsnitt, maks og min. Derfor regner vi ut disse verdiene manuelt. Vi henter temperatur data fra, grupperer dataen basert på city_name, og bruker den innebygde pandas funksjonen `median()` og `std()`, for hendholdsvis median og standardavvik. Siden verdiene grupperes på city_name, blir det indeksen med medianverdi som verdi. Derfor bruker vi `.reset_index()` for å nullstille og gjøre city_name til en kolonne, som bruker til å koble de to tabellene samen, med funksjonen `merge()`." ] }, { @@ -276,11 +278,26 @@ "\n", "# Extract and stores temperatur data for each city using pandas sql\n", "stat_temp_per_city = sqldf('''\n", - " SELECT city, city_name, AVG(`main.temp`) AS avg_temp, MAX(`main.temp`) AS max_temp, MIN(`main.temp`) AS min_temp\n", + " SELECT city, city_name, ROUND(AVG(`main.temp`), 2) AS avg_temp, ROUND(MAX(`main.temp`), 2) AS max_temp, ROUND(MIN(`main.temp`), 2) AS min_temp\n", " FROM both_cities_df\n", " GROUP BY city_name\n", " ''')\n", "\n", + "# Median and standard deviation cant be calculated with pandasql, therefor we need to add it later\n", + "# We calculate the median, based on the city_name, and reset city_name from index to a column\n", + "median_temp = temp_data.groupby('city_name')['temp'].median().reset_index().round(2)\n", + "# Decides the column name\n", + "median_temp.columns = ['city_name', 'median_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(median_temp, on='city_name')\n", + "\n", + "# We calculate the standard deviation, based on the city_name, and reset city_name from index to a column\n", + "stdev_temp = temp_data.groupby('city_name')['temp'].std().reset_index().round(2)\n", + "# Decides the column name\n", + "stdev_temp.columns = ['city_name', 'stdev_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(stdev_temp, on='city_name')\n", + "\n", "# Display the temperatur stats for both cities\n", "display(stat_temp_per_city)" ] @@ -446,6 +463,10 @@ "temp_mean_city_1 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", "temp_mean_city_2 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", "\n", + "# Getting the median for both cities\n", + "temp_median_city_1 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", + "temp_median_city_2 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", + "\n", "# Extract rain values for both cities\n", "# Because pandas sql returnes the value as a dataframe, we need to get the actual value (all rows, first column)\n", "city_1_rain = sqldf('''SELECT `rain.1h` FROM both_cities_df WHERE city = \"city_1\"''').iloc[:,0]\n", @@ -468,13 +489,15 @@ "# Set the title for the whole plot, above the upper plot\n", "ax1.set_title(f'Weather compare for {city_1} and {city_2} ({start_date} to {end_date}) ')\n", "\n", - "# Plots the temperature for city_1, with mean temperature\n", + "# Plots the temperature for city_1, with mean temperature and median temperature\n", "ax1.plot(x_axis, temp_city_1, color='#008080', label=f'Temperature {city_1}')\n", "ax1.axhline(temp_mean_city_1, color='#008080', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_1}')\n", + "ax1.axhline(temp_median_city_1, color='#008080', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_1}')\n", "\n", - "# Plots the temperature for city_2s, with mean temperature\n", + "# Plots the temperature for city_2s, with mean temperature and median temperature\n", "ax1.plot(x_axis, temp_city_2, color='#FFA500', label=f'Temperature {city_2}')\n", "ax1.axhline(temp_mean_city_2, color='#FFA500', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_2}')\n", + "ax1.axhline(temp_median_city_2, color='#FFA500', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_2}')\n", "\n", "# Design the y-axis for Temperature\n", "ax1.set_ylabel(\"Temperature (°C)\")\n", diff --git a/notebooks/notebook_compare_statistic_data.ipynb b/notebooks/notebook_compare_statistic_data.ipynb index 1152110..467db6c 100644 --- a/notebooks/notebook_compare_statistic_data.ipynb +++ b/notebooks/notebook_compare_statistic_data.ipynb @@ -211,9 +211,11 @@ "metadata": {}, "source": [ "### Viser temperaturen\n", - "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebgyd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og en sammenslåing av kolonnene måned og dag ('month_day') som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", + "Vi bruker pandas SQL for å hente ut temperaturen for begge stedene, og lagrer de i en tabell. Ved hjelp av 'pivot' , en innebygd funksjon for å rotere tabeller, setter vi den opp for bedre lesbarhet, ved å sette begge byene ved siden av hverandre og en sammenslåing av kolonnene måned og dag ('month_day') som index. Dette gjør det lettere å sammenligne temperaturen for begge stedene til samme tid.\n", "\n", - "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1." + "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur for begge stedene. Senere kan vi bare skrive en SELECT setning til denne variabelen, for å eksepelhvis hente ut gjennomsnitts data for sted 1.\n", + "\n", + "Det å regne ut median og standardavvik er ikke innebygd i SQL, i motsetning til gjennomsnitt, maks og min. Derfor regner vi ut disse verdiene manuelt. Vi henter temperatur data fra, grupperer dataen basert på city_name, og bruker den innebygde pandas funksjonen `median()` og `std()`, for hendholdsvis median og standardavvik. Siden verdiene grupperes på city_name, blir det indeksen med medianverdi som verdi. Derfor bruker vi `.reset_index()` for å nullstille og gjøre city_name til en kolonne, som bruker til å koble de to tabellene samen, med funksjonen `merge()`." ] }, { @@ -265,6 +267,21 @@ " GROUP BY city_name\n", " ''')\n", "\n", + "# Median and standard deviation cant be calculated with pandasql, therefor we need to add it later\n", + "# We calculate the median, based on the city_name, and reset city_name from index to a column\n", + "median_temp = temp_data.groupby('city_name')['temp'].median().reset_index().round(2)\n", + "# Decides the column name\n", + "median_temp.columns = ['city_name', 'median_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(median_temp, on='city_name')\n", + "\n", + "# We calculate the standard deviation, based on the city_name, and reset city_name from index to a column\n", + "stdev_temp = temp_data.groupby('city_name')['temp'].std().reset_index().round(2)\n", + "# Decides the column name\n", + "stdev_temp.columns = ['city_name', 'stdev_temp']\n", + "# Merge the new column into stat_temp_per city\n", + "stat_temp_per_city = stat_temp_per_city.merge(stdev_temp, on='city_name')\n", + "\n", "# Display the temperatur stats for both cities\n", "display(stat_temp_per_city)" ] @@ -297,6 +314,10 @@ "temp_mean_city_1 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", "temp_mean_city_2 = sqldf('''SELECT avg_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", "\n", + "# Getting the median for both cities\n", + "temp_median_city_1 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_1\"''').iloc[0, 0]\n", + "temp_median_city_2 = sqldf('''SELECT median_temp FROM stat_temp_per_city WHERE city = \"city_2\"''').iloc[0, 0]\n", + "\n", "# Extract precipitation values for both cities\n", "# Because pandas sql returnes the value as a dataframe, we need to get the actual value (all rows, first column)\n", "precipitation_city_1 = sqldf('''SELECT `precipitation.mean` FROM both_cities_df WHERE city = \"city_1\"''').iloc[:,0]\n", @@ -319,9 +340,14 @@ "# Add marker at 0 temperature\n", "ax1.axhline(y=0, color='black', linewidth=1.5)\n", "\n", + "# Plotting the mean temperature for both cities\n", "ax1.axhline(y=temp_mean_city_1, color='#008080', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_1}')\n", "ax1.axhline(y=temp_mean_city_2, color='#FFA500', linestyle='dashed', alpha=0.7, label=f'Mean Temperature {city_2}')\n", "\n", + "# Plotting the median temperature for both cities\n", + "ax1.axhline(temp_median_city_1, color='#008080', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_1}')\n", + "ax1.axhline(temp_median_city_2, color='#FFA500', linestyle='dotted', alpha=0.5, label=f'Median Temperature {city_2}')\n", + "\n", "# Plot precipitation as bars on the secondary y-axis\n", "ax2 = ax1.twinx()\n", "\n", @@ -345,7 +371,6 @@ "\n", "ax3.grid(axis = 'x')\n", "\n", - "\n", "# Customize the x-axis to show ticks and labels only at the start of each month\n", "plt.gca().xaxis.set_major_locator(mdates.MonthLocator()) \n", "# Format ticks to show abbreviated month names (e.g., Jan, Feb)\n", diff --git a/notebooks/notebook_interactive_data.ipynb b/notebooks/notebook_interactive_data.ipynb index c8b1c27..b96398f 100644 --- a/notebooks/notebook_interactive_data.ipynb +++ b/notebooks/notebook_interactive_data.ipynb @@ -148,7 +148,7 @@ "source": [ "### Viser temperaturen\n", "Regner ut gjennomsnittst-temperatur ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", - "Plotter gjennomsnittstemperaturen og temperaturen per time for dagen valgt, ved hjelp av matplotlib.\n", + "Plotter gjennomsnittstemperaturen, median temperatur og temperaturen per time for dagen valgt, ved hjelp av matplotlib.\n", "\n", "Ved hjelp av ipywidgets så er dette et interaktivt diagram som brukeren selv kan justere på ønskelige effekter ved diagrammet. Når koden først kjøres vil det komme standard layout men disse er det bare å endre, for eksempel farge og størrelse på plots. \n", "\n", @@ -172,15 +172,17 @@ "\n", "# Widgets\n", "show_mean = widgets.Checkbox(value=True, description='Vis gjennomsnitt')\n", + "show_median = widgets.Checkbox(value=True, description='Vis median')\n", "show_grid = widgets.Checkbox(value=True, description='Vis rutenett')\n", "dot_color = widgets.ColorPicker(value='#d62728', description='Farge på punktene')\n", "mean_color = widgets.ColorPicker(value='#d62728', description='Farge for gjennomsnitt')\n", + "median_color = widgets.ColorPicker(value='#d62728', description='Farge for median')\n", "dot_size = widgets.IntSlider(value=40, min=10, max=100, step=5, description='Punktstørrelse')\n", "\n", - "def plot_temp(show_mean, show_grid, dot_color, mean_color, dot_size):\n", + "def plot_temp(show_mean, show_grid, dot_color, mean_color, median_color, dot_size):\n", " '''\n", " This function creates an interactive plot using jupyter widgets. It makes a scatter diagram of the temperature with the temerature mean dashed line.\n", - " It gives the user oppurtunity to customize color and size of the dots. And weather to show the grid or not, the same with the mean temperature line.\n", + " It gives the user oppurtunity to customize color and size of the dots. And weather to show the grid or not, the same with the mean and median temperature line.\n", " '''\n", " \n", " # Where the figure should be saved when exported\n", @@ -194,8 +196,10 @@ " temp_mean = temp.mean().round(2)\n", " max_temp = temp.max().round(2)\n", " min_temp = temp.min().round(2)\n", + " temp_median = temp.median().round(2)\n", "\n", - " print(f'Mean temperatur: {temp_mean}')\n", + " print(\"Mean temperatur:\", temp_mean)\n", + " print(\"Median temperature:\", temp_median)\n", " print(\"Highest temperature:\", max_temp)\n", " print(\"Lowest temperature:\", min_temp)\n", "\n", @@ -204,6 +208,9 @@ "\n", " if show_mean:\n", " plt.axhline(y=temp_mean, color=mean_color, linestyle=\"dashed\", label=f'Gj.snitt {temp_mean}°C')\n", + " \n", + " if show_median:\n", + " plt.axhline(y=temp_median, color=median_color, linestyle='dotted', label=f'Median Temperature {temp_median}')\n", "\n", " ax = plt.gca()\n", " ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))\n", @@ -226,7 +233,7 @@ " plt.close()\n", "\n", "# Collects widgets in a UI (user interface)\n", - "ui = widgets.VBox([show_mean, show_grid, dot_color, mean_color, dot_size])\n", + "ui = widgets.VBox([show_mean, show_grid, dot_color, mean_color, median_color, dot_size])\n", "\n", "# Connects widgets to plot-functions\n", "out = widgets.interactive_output(plot_temp, {\n", @@ -234,6 +241,7 @@ " 'show_grid': show_grid,\n", " 'dot_color': dot_color,\n", " 'mean_color': mean_color,\n", + " 'median_color': median_color,\n", " 'dot_size': dot_size,\n", "})\n", "\n", diff --git a/notebooks/notebook_one_day_data.ipynb b/notebooks/notebook_one_day_data.ipynb index 19cd48e..007cd55 100644 --- a/notebooks/notebook_one_day_data.ipynb +++ b/notebooks/notebook_one_day_data.ipynb @@ -146,9 +146,9 @@ "metadata": {}, "source": [ "### Viser temperaturen\n", - "Regner ut gjennomsnittst-temperatur ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", + "Regner ut gjennomsnitts-temperatur, median temperatur og standardavvik ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", "\n", - "Plotter gjennomsnittstemperaturen og temperaturen per time for dagen valgt, ved hjelp av matplotlib." + "Plotter gjennomsnittstemperaturen, median temperatur og temperaturen per time for dagen valgt, ved hjelp av matplotlib." ] }, { @@ -163,10 +163,15 @@ "# Stores the temperature values\n", "temp = df['main.temp']\n", "\n", + "# Calculates the average temperature, median temperatur and the standard deviation\n", "temp_mean = temp.mean().round(2)\n", + "temp_median = temp.median().round(2)\n", + "temp_stdev = temp.std().round(2)\n", "\n", - "# Print the average temperature\n", + "# Print the average temperature, median temperatur and the standard deviation\n", "print(f'Mean temperatur: {temp_mean}')\n", + "print(f'Median temperature: {temp_median}')\n", + "print(f'Standard deviation: {temp_stdev}')\n", "\n", "# Find the highest and lowest temperatures\n", "max_temp = df['main.temp'].max().round(2)\n", @@ -185,8 +190,9 @@ "# Scatter plot for each temperature reading\n", "plt.scatter(x_axis, temp, color='tab:red', label='Temperaturmålinger', alpha=0.7)\n", "\n", - "# Add a horizontal line for the mean temperature\n", + "# Add a horizontal line for the mean and median temperature\n", "plt.axhline(y=temp_mean, color='tab:red', linestyle=\"dashed\", label=f'Gj.snitt {temp_mean}°C')\n", + "plt.axhline(y=temp_median, color='tab:red', linestyle=\"dotted\", label=f'Median {temp_median}°C')\n", "\n", "# Get the current axis and store it as ax\n", "ax = plt.gca()\n", @@ -366,6 +372,7 @@ "wind_gust = df['wind.gust']\n", "wind_speed = df['wind.speed']\n", "temp_mean = temp.mean().round(2)\n", + "temp_median = temp.median().round()\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=(14, 6), sharex=True)\n", @@ -378,9 +385,12 @@ "\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", + "# Plots the mean and median temperature\n", + "ax1.axhline(y=temp_mean, color='tab:red', linestyle='dashed', label='Mean temperature (°C)')\n", + "ax1.axhline(y=temp_median, color='tab:red', linestyle='dotted', label='Median temperature (°C)')\n", + "\n", "# Add marker at 0 temperature\n", "ax1.axhline(y=0, color='black', linewidth=1.5)\n", "\n", diff --git a/notebooks/notebook_one_week_data.ipynb b/notebooks/notebook_one_week_data.ipynb index 24992ea..53838e7 100644 --- a/notebooks/notebook_one_week_data.ipynb +++ b/notebooks/notebook_one_week_data.ipynb @@ -190,9 +190,9 @@ "metadata": {}, "source": [ "### Viser temperaturen\n", - "Regner ut gjennomsnittst-temperatur ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", + "Regner ut gjennomsnitts-temperatur, median temperatur og standardavvik ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", "\n", - "VI plotter også temperaturen i et scatter-diagram, med gjennomsnittet på en striplet linje. " + "Plotter gjennomsnittstemperaturen, median temperatur og temperaturen per time for dagen valgt, ved hjelp av matplotlib." ] }, { @@ -207,10 +207,15 @@ "# Stores the temperature values\n", "temp = df['main.temp']\n", "\n", + "# Calculates the average temperature, median temperatur and the standard deviation\n", "temp_mean = temp.mean().round(2)\n", + "temp_median = temp.median().round(2)\n", + "temp_stdev = temp.std().round(2)\n", "\n", - "# Print the average temperature\n", + "# Print the average temperature, median temperatur and the standard deviation\n", "print(f'Mean temperatur: {temp_mean}')\n", + "print(f'Median temperature: {temp_median}')\n", + "print(f'Standard deviation: {temp_stdev}')\n", "\n", "# Find the highest and lowest temperatures\n", "max_temp = df['main.temp'].max().round(2)\n", @@ -229,8 +234,9 @@ "# Scatter plot for each temperature reading\n", "plt.scatter(x_axis, temp, color='tab:red', label='Temperature', alpha=0.7)\n", "\n", - "# Add a horizontal line for the mean temperature\n", + "# Add a horizontal line for the mean and median temperature\n", "plt.axhline(y=temp_mean, color='tab:red', linestyle=\"dashed\", label=f'Gj.snitt {temp_mean}°C')\n", + "plt.axhline(y=temp_median, color='tab:red', linestyle=\"dotted\", label=f'Median {temp_median}°C')\n", "\n", "# Get the current axis and store it as ax\n", "ax = plt.gca()\n", @@ -381,19 +387,22 @@ "wind_gust = df['wind.gust']\n", "wind_speed = df['wind.speed']\n", "temp_mean = temp.mean().round(2)\n", + "temp_median = temp.median().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", "\n", - "\n", "# Set the title for the diagram, above the first axis, with city_name and input_date\n", "ax1.set_title(f'Weather data for {city_name} ({start_date}) to ({end_date}) ')\n", "\n", "# Plot temperature on the primary y-axis\n", "ax1.plot(x_axis, temp, color='tab:red', label='Temperature (°C)')\n", - "ax1.axhline(y=temp_mean, color='tab:red', linestyle='dashed', label='Mean temperature (°C)')\n", "ax1.axhline(y=0, color='black', linewidth=1.5)\n", "\n", + "# Plots the mean and median temperature\n", + "ax1.axhline(y=temp_mean, color='tab:red', linestyle='dashed', label='Mean temperature (°C)')\n", + "ax1.axhline(y=temp_median, color='tab:red', linestyle='dotted', label='Median temperature (°C)')\n", + "\n", "# Design the y-axis for temperatur\n", "ax1.set_ylabel('Temperature (°C)', color='tab:red')\n", "ax1.tick_params(axis='y', labelcolor='tab:red')\n", @@ -507,7 +516,7 @@ "plt.savefig(plot_path) # Save the plot as a PNG file\n", "\n", "# Show the plot\n", - "plt.show()\n" + "plt.show()" ] } ], diff --git a/notebooks/notebook_statistic_data.ipynb b/notebooks/notebook_statistic_data.ipynb index db56597..20abaf2 100644 --- a/notebooks/notebook_statistic_data.ipynb +++ b/notebooks/notebook_statistic_data.ipynb @@ -149,7 +149,9 @@ "### Viser temperaturen\n", "Vi bruker pandas SQL for å hente ut ønsket tempeartur fra statistic_data og lagrer den i en tabell.\n", "\n", - "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur. Senere kan vi bare skrive en SELECT setning til denne variabelen." + "Ved hjelp av en pandas SQL setning kan vi hente og lagre gjennomsnitt, maksimalt og minste målte temperatur. Senere kan vi bare skrive en SELECT setning til denne variabelen.\n", + "\n", + "Det å regne ut median og standardavvik er ikke innebygd i SQL, i motsetning til gjennomsnitt, maks og min. Derfor regner vi ut disse verdiene manuelt. Vi henter temperatur data fra, og bruker den innebygde pandas og numpy funksjonen `median()` og `std()`, for hendholdsvis median og standardavvik. Vi legger de deretter til som nye kolonner i stat_data." ] }, { @@ -182,10 +184,21 @@ "\n", "# Extract and stores temperatur data for each city using pandas sql\n", "stat_temp = sqldf('''\n", - " SELECT AVG(`temp.mean_celsius`) AS avg_temp, MAX(`temp.max_celsius`) AS max_temp, MIN(`temp.min_celsius`) AS min_temp\n", + " SELECT ROUND(AVG(`temp.mean_celsius`), 2) AS avg_temp, ROUND(MAX(`temp.max_celsius`), 2) AS max_temp, ROUND(MIN(`temp.min_celsius`), 2) AS min_temp\n", " FROM df\n", " ''')\n", "\n", + "# Median and standard deviation cant be calculated with pandasql, therefor we need to add it later\n", + "# We calculate the median, based on the temp_data\n", + "median_temp = temp_data['temp'].median().round(2)\n", + "# Add as a new column in stat_temp\n", + "stat_temp['median_temp'] = median_temp\n", + "\n", + "# We calculate the standard deviation, based on the temp_data\n", + "stdev_temp = temp_data['temp'].std().round(2)\n", + "# Add as a new column in stat_temp\n", + "stat_temp['stdev_temp'] = stdev_temp\n", + "\n", "display(stat_temp)" ] }, @@ -212,9 +225,11 @@ "# Create the folder if it doesn't exist\n", "os.makedirs(output_folder, exist_ok=True)\n", "\n", - "\n", "temp = df['temp.mean_celsius']\n", + "\n", + "# Gets the mean and median temperature from stat_temp\n", "temp_mean = sqldf('''SELECT avg_temp FROM stat_temp''').iloc[0, 0]\n", + "temp_median = sqldf('''SELECT median_temp FROM stat_temp''').iloc[0, 0]\n", "\n", "# Extract precipitation values for both cities\n", "# Because pandas sql returnes the value as a dataframe, we need to get the actual value (all rows, first column)\n", @@ -233,7 +248,9 @@ "\n", "# Add marker at 0 temperature\n", "ax1.axhline(y=0, color='black', linewidth=1.5)\n", + "# Plots both mean and median temperature\n", "ax1.axhline(y=temp_mean, color='red', linestyle=\"dashed\", label=\"Temperature mean (°C)\")\n", + "ax1.axhline(y=temp_median, color='red', linestyle=\"dotted\", label=\"Temperature median (°C)\")\n", "\n", "# Plot precipitation as bars on the secondary y-axis\n", "ax2 = ax1.twinx()\n", @@ -291,7 +308,6 @@ "outputs": [], "source": [ "import seaborn as sns\n", - "import sys\n", "import os\n", "\n", "output_folder = \"../data/figures/output_fig_statistic\"\n", @@ -463,9 +479,12 @@ " # Calculates the standard deviation for the season\n", " season_stdev = temp_season.std()\n", "\n", + " # Standard deviation limit\n", + " threshold = 3\n", + "\n", " # Calculates the limits for 3 standard deviation from the mean\n", - " upper_limit = season_mean + (season_stdev * 3)\n", - " lower_limit = season_mean - (season_stdev * 3)\n", + " upper_limit = season_mean + (season_stdev * threshold)\n", + " lower_limit = season_mean - (season_stdev * threshold)\n", "\n", " # Creates a mask for the temperatures above or below the upper/lower limit\n", " outliers_mask = (temp_season > upper_limit) | (temp_season < lower_limit)\n",