fhiiiofhweoi
aaaaaaaa
This commit is contained in:
136
utils/stats.py
136
utils/stats.py
@@ -1,5 +1,3 @@
|
||||
# pyright: basic
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
@@ -16,6 +14,7 @@ STAT_MENU = """[1] Média
|
||||
[4] Máximo
|
||||
[5] Mínimo
|
||||
[6] Moda
|
||||
[T] Estatísticas Temporais (T5)
|
||||
|
||||
[Q] Voltar ao menu principal
|
||||
"""
|
||||
@@ -43,6 +42,120 @@ def filter_submenu(type: str):
|
||||
return None
|
||||
|
||||
|
||||
|
||||
# -- t5 funcs
|
||||
|
||||
def _get_unique_events(df: pd.DataFrame) -> pd.DataFrame:
|
||||
return df.drop_duplicates(subset="ID", keep='first')
|
||||
|
||||
def convert_to_datetime(df: pd.DataFrame) -> pd.DataFrame:
|
||||
# Converte coluna Data para objetos datetime
|
||||
df = df.copy()
|
||||
df['Data'] = pd.to_datetime(df['Data'], format='mixed')
|
||||
return df
|
||||
|
||||
def events_per_period(df: pd.DataFrame, period: str):
|
||||
# Calcula o número de eventos por dia ('D') ou mês ('M')
|
||||
df = convert_to_datetime(df)
|
||||
events = _get_unique_events(df)
|
||||
|
||||
if period == 'M':
|
||||
period = 'ME'
|
||||
|
||||
res = events.set_index('Data').resample(period).size()
|
||||
return res.index, res.values
|
||||
|
||||
def stats_depth_month(df: pd.DataFrame):
|
||||
# Calcula estatísticas de Profundidade por Mês
|
||||
df = convert_to_datetime(df)
|
||||
events = _get_unique_events(df)
|
||||
|
||||
grouped = events.set_index('Data').resample('ME')['Profundidade']
|
||||
|
||||
stats_df = pd.DataFrame({
|
||||
'Mean': grouped.mean(),
|
||||
'Std': grouped.std(),
|
||||
'Median': grouped.median(),
|
||||
'Q1': grouped.quantile(0.25),
|
||||
'Q3': grouped.quantile(0.75),
|
||||
'Min': grouped.min(),
|
||||
'Max': grouped.max()
|
||||
})
|
||||
return stats_df
|
||||
|
||||
def stats_mag_month(df: pd.DataFrame):
|
||||
# Calcula estatísticas de Magnitude por Mês
|
||||
df = convert_to_datetime(df)
|
||||
events = _get_unique_events(df)
|
||||
|
||||
def get_max_mag(mags):
|
||||
vals = [float(m['Magnitude']) for m in mags if 'Magnitude' in m]
|
||||
return max(vals) if vals else np.nan
|
||||
|
||||
events = events.copy()
|
||||
events['MaxMag'] = events['Magnitudes'].apply(get_max_mag)
|
||||
|
||||
grouped = events.set_index('Data').resample('ME')['MaxMag']
|
||||
|
||||
stats_df = pd.DataFrame({
|
||||
'Mean': grouped.mean(),
|
||||
'Std': grouped.std(),
|
||||
'Median': grouped.median(),
|
||||
'Q1': grouped.quantile(0.25),
|
||||
'Q3': grouped.quantile(0.75),
|
||||
'Min': grouped.min(),
|
||||
'Max': grouped.max()
|
||||
})
|
||||
return stats_df
|
||||
|
||||
|
||||
# -- t5 menu
|
||||
|
||||
T5_MENU = """[1] Número de eventos por dia
|
||||
[2] Número de eventos por mês
|
||||
[3] Estatísticas Profundidade por mês
|
||||
[4] Estatísticas Magnitude por mês
|
||||
|
||||
[Q] Voltar
|
||||
"""
|
||||
|
||||
def t5_menu(df: pd.DataFrame):
|
||||
while True:
|
||||
os.system("cls" if sys.platform == "windows" else "clear")
|
||||
print(STAT_HEADER + "\n" + " == T5: Estatísticas Temporais ==\n" + T5_MENU)
|
||||
usrIn = input("Opção: ").lower()
|
||||
|
||||
match usrIn:
|
||||
case "1":
|
||||
dates, counts = events_per_period(df, 'D')
|
||||
print("\nEventos por Dia:")
|
||||
print(pd.DataFrame({'Data': dates, 'Contagem': counts}).to_string(index=False))
|
||||
|
||||
case "2":
|
||||
dates, counts = events_per_period(df, 'M')
|
||||
print("\nEventos por Mês:")
|
||||
print(pd.DataFrame({'Data': dates, 'Contagem': counts}).to_string(index=False))
|
||||
|
||||
case "3":
|
||||
st = stats_depth_month(df)
|
||||
print("\nEstatísticas Profundidade por Mês:")
|
||||
print(st.to_string())
|
||||
|
||||
case "4":
|
||||
st = stats_mag_month(df)
|
||||
print("\nEstatísticas Magnitude por Mês:")
|
||||
print(st.to_string())
|
||||
|
||||
case "q":
|
||||
return
|
||||
case _:
|
||||
pass
|
||||
|
||||
input("\n[Enter] para continuar...")
|
||||
|
||||
|
||||
# -- stat menu
|
||||
|
||||
def stat_menu(df: pd.DataFrame):
|
||||
inStats = True
|
||||
while inStats:
|
||||
@@ -51,6 +164,10 @@ def stat_menu(df: pd.DataFrame):
|
||||
usrIn = input("Opção: ").lower()
|
||||
|
||||
match usrIn:
|
||||
case "t":
|
||||
t5_menu(df)
|
||||
continue
|
||||
|
||||
case "1":
|
||||
c = filter_submenu("Média")
|
||||
|
||||
@@ -106,7 +223,7 @@ def stat_menu(df: pd.DataFrame):
|
||||
continue
|
||||
|
||||
case "6":
|
||||
c = filter_submenu("Mínimo")
|
||||
c = filter_submenu("Moda")
|
||||
|
||||
if c is not None:
|
||||
retValue = moda(df, c)
|
||||
@@ -120,11 +237,12 @@ def stat_menu(df: pd.DataFrame):
|
||||
|
||||
case _:
|
||||
pass
|
||||
|
||||
input("Clica `Enter` para continuar")
|
||||
|
||||
|
||||
def average(df: pd.DataFrame, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
@@ -136,7 +254,7 @@ def average(df: pd.DataFrame, filter_by):
|
||||
|
||||
|
||||
def variance(df, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
@@ -149,7 +267,7 @@ def variance(df, filter_by):
|
||||
|
||||
|
||||
def std_dev(df, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
@@ -162,7 +280,7 @@ def std_dev(df, filter_by):
|
||||
|
||||
|
||||
def max_v(df, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
@@ -172,7 +290,7 @@ def max_v(df, filter_by):
|
||||
|
||||
|
||||
def min_v(df, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
@@ -182,7 +300,7 @@ def min_v(df, filter_by):
|
||||
|
||||
|
||||
def moda(df, filter_by):
|
||||
events = df.drop_duplicates(subset="ID", keep='first')
|
||||
events = _get_unique_events(df)
|
||||
values = events[filter_by].to_numpy()
|
||||
|
||||
if filter_by == "Magnitudes":
|
||||
|
||||
Reference in New Issue
Block a user