From 8fa3b1ec106f88cd919a7adbae1688928a268389 Mon Sep 17 00:00:00 2001 From: Shino Date: Sun, 9 Nov 2025 20:50:24 -0100 Subject: [PATCH] Misc --- earthquakes.py | 5 +- utils/parser.py | 1 - utils/stats.py | 124 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 111 insertions(+), 19 deletions(-) diff --git a/earthquakes.py b/earthquakes.py index 23ec6b0..2d67d88 100644 --- a/earthquakes.py +++ b/earthquakes.py @@ -146,7 +146,7 @@ def main(): case "8": if db is not None: - pass + stats.stat_menu(db) else: retInfo = "Base de dados não encontrada!" @@ -180,6 +180,9 @@ def _get_usr_input(msg:str, asType=str): return None return asType(usrIn) +def _prettify_event(df): + preambleInfo = df.drop_duplicates(subset="ID", keep="first") + stations = df[["Estacao", "Componente", "Tipo Onda", "Amplitude"]] if __name__ == '__main__': main() diff --git a/utils/parser.py b/utils/parser.py index 8687e10..49cb9e8 100644 --- a/utils/parser.py +++ b/utils/parser.py @@ -191,4 +191,3 @@ def _parse_type_i(data: list[str]): FUNCS = {1: _parse_type_1, 3: _parse_type_3, 6: _parse_type_6, "E": _parse_type_e, "I": _parse_type_i} -parse("dados.txt") diff --git a/utils/stats.py b/utils/stats.py index c010690..a5155ed 100644 --- a/utils/stats.py +++ b/utils/stats.py @@ -5,45 +5,119 @@ import os import pandas as pd import numpy as np -STAT_MENU = """=== Earthquakes === +STAT_HEADER ="""=== Earthquakes === == Estatísticas == -[1] Média +""" + +STAT_MENU = """[1] Média [2] Variância [3] Desvio padrão [4] Máximo [5] Mínimo +[6] Moda [Q] Voltar ao menu principal """ +FILTER_CHOICES = """[1] Magnitudes +[2] Distância +[3] Profundidade + +""" + +CHOICE = {"1": "Magnitudes", "2": "Distancia","3": "Prof"} + + +def filter_submenu(type: str): + os.system("cls") + print(f"{STAT_HEADER}\n = {type} = ") + print(FILTER_CHOICES) + + choice = input("Qual dos valores: ") + + try: + usrChoice = CHOICE[choice] + return usrChoice + except KeyError: + return None + def stat_menu(df: pd.DataFrame): inStats = True while inStats: os.system("cls") - print(STAT_MENU) + print(STAT_HEADER + "\n" + STAT_MENU) usrIn = input("Opção: ").lower() match usrIn: case "1": - pass + # TODO: verificar se estamos a tratar de numeros ou strings + c = filter_submenu("Média") + + if c is not None: + retValue = average(df, c) + print(f"A média de {c} é {retValue}") + else: + continue + case "2": - pass + c = filter_submenu("Variância") + + if c is not None: + retValue = variance(df, c) + print(f"A variância dos dados de {c} é {retValue}") + else: + continue + case "3": - pass + # TODO: verificar se estamos a tratar de numeros ou strings + c = filter_submenu("Desvio Padrão") + + if c is not None: + retValue = std_dev(df, c) + print(f"O desvio padrão de {c} é {retValue}") + else: + continue + case "4": - pass + c = filter_submenu("Máximo") + + if c is not None: + retValue = max_v(df, c) + print(f"O valor máximo em {c} é {retValue}") + else: + continue + case "5": - pass + c = filter_submenu("Mínimo") + + if c is not None: + retValue = min_v(df, c) + print(f"O valor mínimo em {c} é {retValue}") + else: + continue + + case "6": + c = filter_submenu("Mínimo") + + if c is not None: + retValue = moda(df, c) + print(f"O valor moda em {c} é {retValue}") + else: + continue + case "q": inStats = False - pass + continue + case _: pass + input("Clica Enter para continuar") def average(df: pd.DataFrame, filter_by): - values = df[filter_by].to_numpy() + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() if filter_by == "Magnitudes": values = _unpack_mags(values) @@ -52,7 +126,8 @@ def average(df: pd.DataFrame, filter_by): def variance(df, filter_by): - values = df[filter_by].to_numpy() + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() if filter_by == "Magnitudes": values = _unpack_mags(values) @@ -61,7 +136,8 @@ def variance(df, filter_by): def std_dev(df, filter_by): - values = df[filter_by].to_numpy() + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() if filter_by == "Magnitudes": values = _unpack_mags(values) @@ -69,8 +145,9 @@ def std_dev(df, filter_by): return np.std(values) -def max(df, filter_by): - values = df[filter_by].to_numpy() +def max_v(df, filter_by): + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() if filter_by == "Magnitudes": values = _unpack_mags(values) @@ -78,19 +155,32 @@ def max(df, filter_by): return np.max(values) -def min(df, filter_by): - values = df[filter_by].to_numpy() +def min_v(df, filter_by): + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() if filter_by == "Magnitudes": values = _unpack_mags(values) return np.min(values) +def moda(df, filter_by): + events = df.drop_duplicates(subset="ID", keep='first') + values = events[filter_by].to_numpy() + + if filter_by == "Magnitudes": + values = _unpack_mags(values) + + uniques, count = np.unique(values, return_counts=True) + uniques_list = list(zip(uniques, count)) + + return sorted(uniques_list, reverse=True ,key=lambda x: x[1])[0][0] + def _unpack_mags(arr: np.ndarray): newVals = np.empty(0) for v in arr: for m in v: - newVals = np.append(newVals, np.float32(m["Magnitude"])) + newVals = np.append(newVals, float(m["Magnitude"])) return newVals