This commit is contained in:
2025-11-09 20:50:24 -01:00
parent d9ddd5b3ed
commit 8fa3b1ec10
3 changed files with 111 additions and 19 deletions

View File

@@ -146,7 +146,7 @@ def main():
case "8": case "8":
if db is not None: if db is not None:
pass stats.stat_menu(db)
else: else:
retInfo = "Base de dados não encontrada!" retInfo = "Base de dados não encontrada!"
@@ -180,6 +180,9 @@ def _get_usr_input(msg:str, asType=str):
return None return None
return asType(usrIn) 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__': if __name__ == '__main__':
main() main()

View File

@@ -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} FUNCS = {1: _parse_type_1, 3: _parse_type_3, 6: _parse_type_6, "E": _parse_type_e, "I": _parse_type_i}
parse("dados.txt")

View File

@@ -5,45 +5,119 @@ import os
import pandas as pd import pandas as pd
import numpy as np import numpy as np
STAT_MENU = """=== Earthquakes === STAT_HEADER ="""=== Earthquakes ===
== Estatísticas == == Estatísticas ==
[1] Média """
STAT_MENU = """[1] Média
[2] Variância [2] Variância
[3] Desvio padrão [3] Desvio padrão
[4] Máximo [4] Máximo
[5] Mínimo [5] Mínimo
[6] Moda
[Q] Voltar ao menu principal [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): def stat_menu(df: pd.DataFrame):
inStats = True inStats = True
while inStats: while inStats:
os.system("cls") os.system("cls")
print(STAT_MENU) print(STAT_HEADER + "\n" + STAT_MENU)
usrIn = input("Opção: ").lower() usrIn = input("Opção: ").lower()
match usrIn: match usrIn:
case "1": 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": 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": 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": 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": 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": case "q":
inStats = False inStats = False
pass continue
case _: case _:
pass pass
input("Clica Enter para continuar")
def average(df: pd.DataFrame, filter_by): 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": if filter_by == "Magnitudes":
values = _unpack_mags(values) values = _unpack_mags(values)
@@ -52,7 +126,8 @@ def average(df: pd.DataFrame, filter_by):
def variance(df, 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": if filter_by == "Magnitudes":
values = _unpack_mags(values) values = _unpack_mags(values)
@@ -61,7 +136,8 @@ def variance(df, filter_by):
def std_dev(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": if filter_by == "Magnitudes":
values = _unpack_mags(values) values = _unpack_mags(values)
@@ -69,8 +145,9 @@ def std_dev(df, filter_by):
return np.std(values) return np.std(values)
def max(df, filter_by): def max_v(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": if filter_by == "Magnitudes":
values = _unpack_mags(values) values = _unpack_mags(values)
@@ -78,19 +155,32 @@ def max(df, filter_by):
return np.max(values) return np.max(values)
def min(df, filter_by): def min_v(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": if filter_by == "Magnitudes":
values = _unpack_mags(values) values = _unpack_mags(values)
return np.min(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): def _unpack_mags(arr: np.ndarray):
newVals = np.empty(0) newVals = np.empty(0)
for v in arr: for v in arr:
for m in v: for m in v:
newVals = np.append(newVals, np.float32(m["Magnitude"])) newVals = np.append(newVals, float(m["Magnitude"]))
return newVals return newVals