From 141faba04fdd1b495481cba200e2eaba11f105f3 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Mon, 25 Dec 2023 18:48:20 +0200 Subject: [PATCH] calculate mean temp --- main.py | 70 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/main.py b/main.py index 8ac6ad1..06bcfad 100755 --- a/main.py +++ b/main.py @@ -3,7 +3,6 @@ from pathlib import Path import matplotlib.pyplot as plt - import numpy as np import pandas as pd from loguru import logger @@ -21,25 +20,16 @@ WIND_GUSTS_PATH = BASE_PATH.joinpath("data", "vejaAtrumsBrazmas.xlsx") WIND_SPEED_PATH = BASE_PATH.joinpath("data", "vejaAtrumsFaktiskais.xlsx") AIR_TEMP_PATH = BASE_PATH.joinpath("data", "gaisaTemperatura2022.xlsx") +BLUE = "#1f77b4" +ORANGE = "#ff7f0e" +BLACK = "#000000" + def read_data(path: Path) -> pd.DataFrame: - dataframe = pd.read_excel(path, date_parser="Datums", index_col="Datums") + dataframe = pd.read_excel(path, parse_dates=["Datums"], index_col="Datums", date_format="%d.%m.%Y") return dataframe -def get_season(month: int) -> str | None: - if month in [12, 1, 2]: - return "Ziema" - elif month in [3, 4, 5]: - return "Pavasaris" - elif month in [6, 7, 8]: - return "Vasara" - elif month in [9, 10, 11]: - return "Rudens" - else: - return None - - def bar_chart() -> None: df_avg = read_data(WIND_SPEED_PATH).mean(axis=1) df_max = read_data(WIND_GUSTS_PATH).max(axis=1) - df_avg @@ -50,10 +40,10 @@ def bar_chart() -> None: ) df_combined.columns = ["Vidējais", "Maksimālais"] - df_combined.plot.bar(stacked=True, figsize=(12, 8), color=["#ff7f0e", "#1f77b4"], width=0.6) + df_combined.plot.bar(stacked=True, figsize=(12, 8), color=[ORANGE, BLUE], width=0.6) plt.yticks(np.arange(0, df_combined.max().max() + 2.5, 2.5)) - plt.xticks(rotation=45) + plt.xticks(rotation=45) # FIX: don't display time plt.title("Vidējais un maksimālais vēja ātrums 2023. gada augustā") plt.xlabel("Mērījumu Datums") @@ -71,14 +61,56 @@ SEASONS = { def box_plot() -> None: df = read_data(AIR_TEMP_PATH) - df.index = pd.to_datetime(df.index, format="%d.%m.%Y") df["Season"] = df.index.month % 12 // 3 + 1 df["Season"] = df["Season"].map(SEASONS) + df["Average"] = df.iloc[:, 0:24].mean(axis=1) + + df_melted = pd.melt(df, id_vars=["Season"], value_name="Temperature", var_name="Time") # FIX: should be average temperature + df_melted["Season"] = pd.Categorical(df_melted["Season"], categories=SEASONS.values(), ordered=True) + + _, ax = plt.subplots(figsize=(12, 8)) + + box_props = dict(facecolor=BLUE) # box + median_props = dict(color=ORANGE) # median line + whisker_props = dict(color=BLACK) # whiskers (vertical line beween box and min/max) + width = 0.4 + + df_melted[df_melted["Season"] == "Rudens"].boxplot( + by="Season", + ax=ax, + grid=False, + showfliers=0.5, + boxprops=box_props, + medianprops=median_props, + whiskerprops=whisker_props, + patch_artist=True, + widths=width, + ) + + df_melted[df_melted["Season"] != "Rudens"].boxplot( + by="Season", + ax=ax, + grid=False, + showfliers=False, + boxprops=box_props, + medianprops=median_props, + whiskerprops=whisker_props, + patch_artist=True, + widths=width, + ) + + min_value = np.floor(df_melted["Temperature"].min() / 5) * 5 + max_value = np.ceil(df_melted["Temperature"].max() / 5) * 5 + tick_step = 5 + + plt.yticks(np.arange(min_value, max_value, tick_step)) plt.title("Gaisa temperatūra Rīgā četros gadalaikos") + plt.suptitle("") plt.ylabel("Gaisa temperatūra (Celsija grādos)") - # plt.show() + plt.xlabel("") + plt.show() @logger.catch