177 lines
4.8 KiB
Python
177 lines
4.8 KiB
Python
# pyright: basic
|
|
|
|
import datetime
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
import utils
|
|
|
|
|
|
def stats(df: pd.DataFrame) -> None:
|
|
"""Estatisticas para a DataFrame
|
|
:param df: DataFrame em questão"""
|
|
|
|
mags = mags_avg_std(df)
|
|
depth = depth_avg_std(df)
|
|
|
|
median_mags = median_mags(df)
|
|
|
|
|
|
def mags_avg_std(data: pd.DataFrame) -> tuple[np.floating, np.floating]:
|
|
"""Media e desvio-padrao das magnitudes
|
|
:param data: Dataframe com dados a filtrar
|
|
:returns: Tuple com a media e desvio-padrao
|
|
"""
|
|
filtered_data: pd.DataFrame = filter_mags(data)
|
|
vals = filtered_data["MagL"].to_numpy()
|
|
return (np.average(vals), np.std(vals))
|
|
|
|
|
|
def depth_avg_std(data: pd.DataFrame) -> tuple[np.floating, np.floating]:
|
|
"""Media e desvio-padrao das profundidades
|
|
:param data: Dataframe com dados a filtrar
|
|
:returns: Tuple com a media e desvio-padrao
|
|
"""
|
|
filtered_data: pd.DataFrame = filter_depth(data)
|
|
vals = np.average(filtered_data["Profundidade"].to_numpy())
|
|
return (np.average(vals), np.std(vals))
|
|
|
|
|
|
def median_mags(data: pd.DataFrame):
|
|
filtered_data: pd.DataFrame = filter_mags(data)
|
|
vals = sorted(filtered_data["MagL"].to_numpy())
|
|
|
|
quartil = len(vals) // 4
|
|
|
|
return (
|
|
filtered_data[quartil, :]["MagL"],
|
|
filtered_data[quartil * 2, :]["MagL"],
|
|
filtered_data[quartil * 3, :]["MagL"],
|
|
)
|
|
|
|
|
|
def filter_mags(data, more_than=None, less_than=None) -> pd.DataFrame:
|
|
"""Filters by magnitudes a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:param more_than(optional): Filter for magnitudes above threshold
|
|
:param after(optional): Filters for dates after set date
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data.drop_duplicates(subset="ID", keep="first")
|
|
_dict = {"Data": [], "MagL": []}
|
|
for idx, c in v.iterrows():
|
|
_dict["Data"].append(str(c.Data))
|
|
_dict["MagL"].append(utils.extract_mag_l(c.Magnitudes))
|
|
|
|
_df = pd.DataFrame.from_dict(_dict)
|
|
if more_than:
|
|
_df = _df[_df["MagL"] >= more_than]
|
|
|
|
if less_than:
|
|
_df = _df[_df["MagL"] <= less_than]
|
|
return _df
|
|
|
|
|
|
def filter_date(
|
|
data: pd.DataFrame,
|
|
before: datetime.datetime | None = None,
|
|
after: datetime.datetime | None = None,
|
|
) -> pd.DataFrame:
|
|
"""Filters by date a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:param before(optional): Filter for dates before set date
|
|
:param after(optional): Filters for dates after set date
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data
|
|
for idx, c in v.iterrows():
|
|
v.at[idx, "Data"] = datetime.datetime.fromisoformat(c.Data)
|
|
|
|
if after:
|
|
v = v[v["Data"] >= after]
|
|
|
|
if before:
|
|
v = v[v["Data"] >= before]
|
|
return v
|
|
|
|
|
|
def filter_depth(
|
|
data: pd.DataFrame,
|
|
less_than: float | None = None,
|
|
more_than: float | None = None,
|
|
) -> pd.DataFrame:
|
|
"""Filters by the depth a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:param less_than(optional): Filter for depths below the threshold
|
|
:param after(optional): Filters for depths deeper than threshold
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data.drop_duplicates(subset="ID", keep="first")
|
|
|
|
if more_than:
|
|
v = v[v["Profundidade"] >= more_than]
|
|
|
|
if less_than:
|
|
v = v[v["Profundidade"] >= less_than]
|
|
return v
|
|
|
|
|
|
def filter_gap(
|
|
data: pd.DataFrame,
|
|
threshold: int,
|
|
) -> pd.DataFrame:
|
|
"""Filters by the depth a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:param threshold: Filter for GAPS below the threshold
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data.drop_duplicates(subset="ID", keep="first")
|
|
v = v[v["Gap"] <= threshold]
|
|
return v
|
|
|
|
|
|
def filter_sz(
|
|
data: pd.DataFrame,
|
|
) -> pd.DataFrame:
|
|
"""Filters by SZ plane a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data[data["SZ"].notna()]
|
|
return v
|
|
|
|
|
|
def filter_vz(
|
|
data: pd.DataFrame,
|
|
) -> pd.DataFrame:
|
|
"""Filters by VZ plane a DataFrame into a new Dataframe
|
|
|
|
:param data: Raw pandas DataFrame
|
|
:returns: Returns a filtered pandas DataFrame
|
|
"""
|
|
v = data[data["VZ"].notna()]
|
|
return v
|
|
|
|
|
|
def _preprare_days(data):
|
|
c = data.Data.to_list()
|
|
for idx, d in enumerate(c):
|
|
aux = datetime.datetime.fromisoformat(d)
|
|
c[idx] = datetime.datetime.strftime(aux, "%Y-%m-%d")
|
|
|
|
return c
|
|
|
|
|
|
def _preprare_months(data):
|
|
c = data.Data.to_list()
|
|
for idx, d in enumerate(c):
|
|
aux = datetime.datetime.fromisoformat(d)
|
|
c[idx] = datetime.datetime.strftime(aux, "%Y-%m")
|
|
|
|
return c
|