import pandas as pd from datetime import datetime import os import sys def filter_by_date(df: pd.DataFrame, start_date: str, end_date: str) -> pd.DataFrame: # filtra o dataframe por intervalo de datas (strings em formato ISO) mask = (df['Data'] >= start_date) & (df['Data'] <= end_date) return df.loc[mask] def filter_by_depth(df: pd.DataFrame, min_depth: float, max_depth: float) -> pd.DataFrame: mask = (df['Profundidade'] >= min_depth) & (df['Profundidade'] <= max_depth) return df.loc[mask] def filter_by_magnitude(df: pd.DataFrame, min_mag: float, max_mag: float, mag_type: str = 'L') -> pd.DataFrame: def filter_mag(mags): # Filtrar por tipo de magnitude específico vals = [float(m['Magnitude']) for m in mags if m.get('Tipo') == mag_type] if not vals: return False # Se houver múltiplas magnitudes do mesmo tipo, usa o máximo para filtragem mx = max(vals) return min_mag <= mx <= max_mag mask = df['Magnitudes'].apply(filter_mag) return df.loc[mask] # -- t7 filters def filter_by_gap(df: pd.DataFrame, max_gap: float) -> pd.DataFrame: # Filtra onde Gap <= max_gap return df[df['Gap'] <= max_gap] def filter_by_quality(df: pd.DataFrame, quality: str) -> pd.DataFrame: return df[df['Pub'] == quality] def filter_by_zone(df: pd.DataFrame, zone_type: str, zone_val: str) -> pd.DataFrame: return df[df[zone_type] == zone_val] FILTER_MENU = """[1] Filtrar por Data (Inicio:Fim) [2] Filtrar por Gap (< Valor) [3] Filtrar por Qualidade (EPI) [4] Filtrar por Zona SZ [5] Filtrar por Zona VZ [6] Filtrar por Magnitude (Min:Max) [7] Filtrar por Profundidade (Min:Max) [R] Reset Filtros [Q] Voltar """ def filter_menu(db: pd.DataFrame, original_db: pd.DataFrame): currDb = db while True: os.system("cls" if sys.platform == "windows" else "clear") print("=== T7: Filtros ===") print(f"Linhas actuais: {len(currDb)}") print(FILTER_MENU) usrIn = input("Opção: ").lower() match usrIn: case "1": start = input("Data Inicio (YYYY-MM-DD): ") end = input("Data Fim (YYYY-MM-DD): ") currDb = filter_by_date(currDb, start, end) case "2": val = float(input("Gap Máximo: ")) currDb = filter_by_gap(currDb, val) case "3": confirm = input("Filtrar apenas eventos com Qualidade EPI? (s/n): ").lower() if confirm == 's': currDb = filter_by_quality(currDb, "EPI") else: print("Filtro não aplicado.") case "4": val = input("Zona SZ (ex: SZ31): ") currDb = filter_by_zone(currDb, "SZ", val) case "5": val = input("Zona VZ (ex: VZ14): ") currDb = filter_by_zone(currDb, "VZ", val) case "6": print("Filtrar por Magnitude Tipo 'L'") min_m = float(input("Min Mag L: ")) max_m = float(input("Max Mag L: ")) currDb = filter_by_magnitude(currDb, min_m, max_m, "L") case "7": min_d = float(input("Min Profundidade: ")) max_d = float(input("Max Profundidade: ")) currDb = filter_by_depth(currDb, min_d, max_d) case "r": currDb = original_db.copy() case "q": return currDb case _: pass