Skip to content

Commit

Permalink
add median, also plot, and standard deviation
Browse files Browse the repository at this point in the history
  • Loading branch information
toravest committed May 25, 2025
1 parent d29ae70 commit a541415
Show file tree
Hide file tree
Showing 7 changed files with 158 additions and 39 deletions.
41 changes: 33 additions & 8 deletions notebooks/notebook_compare_one_day_data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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."
]
},
{
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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()`."
]
},
{
Expand All @@ -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)"
]
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down
33 changes: 28 additions & 5 deletions notebooks/notebook_compare_one_week_data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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()`."
]
},
{
Expand Down Expand Up @@ -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)"
]
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down
31 changes: 28 additions & 3 deletions notebooks/notebook_compare_statistic_data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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()`."
]
},
{
Expand Down Expand Up @@ -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)"
]
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down
Loading

0 comments on commit a541415

Please sign in to comment.