Mais coisas, estatisticas

This commit is contained in:
2026-01-04 18:51:36 -01:00
parent 1d1826ebe5
commit c275bc7065
6 changed files with 262 additions and 29 deletions

154
ev2.py
View File

@@ -1,12 +1,152 @@
import logging import logging
import os
from enum import Enum
from utilsv2 import mongo from utilsv2 import mongo, stats
from utilsv2.log import logger from utilsv2.log import logger
from utilsv2.parser import parse from utilsv2.parser import parse
from utilsv2.utils import toDateTime, toFloat, toInt
OS = os.name
MAIN_MENU = {
"1": "Adicionar novos dados",
"2": "Aplicar filtros",
"3": "Estatísticas",
"4": "Limpar filtros",
"q": "Sair",
}
FILTER_MENU = {
"1": "Data início",
"2": "Magnitudes",
"3": "Profundidade",
"4": "GAP",
"6": "Limpar filtros",
"7": "Mostrar filtros",
"q": "Voltar ao menu principal",
}
def clear_screen():
os.system("cls" if OS == "nt" else "clear")
def print_menu(menu: dict[str, str]):
clear_screen()
for k, v in menu.items():
print(f"[{k}]: {v}")
def filter_menu(old_fiters):
filters = old_fiters
while True:
print_menu(FILTER_MENU)
usrIn = input()
match usrIn:
# datas
case "1":
clear_screen()
print(
"Formato da data: YYYY-MM-DD\nInserir datas de corte, separadas por uma vírgula(,)"
)
aux = input()
d1, d2 = aux.split(",", maxsplit=1)
d1 = toDateTime(d1)
d2 = toDateTime(d2)
filters["DateTime"] = {}
if d1 != -1:
filters["DateTime"]["$gte"] = d1
if d2 != -1:
filters["DateTime"]["$lte"] = d2
# magnitudes
case "2":
clear_screen()
print("Inserir magnitudes de corte, separadas por uma vírgula(,)")
aux = input()
d1, d2 = aux.split(",", maxsplit=1)
d1 = toFloat(d1)
d2 = toFloat(d2)
filters["Magnitudes.L.Magnitude"] = {}
if d1 != -1:
filters["Magnitudes.L.Magnitude"]["$gte"] = d1
if d2 != -1:
filters["Magnitudes.L.Magnitude"]["$lte"] = d2
case "2":
clear_screen()
print("Inserir profundidades de corte, separadas por uma vírgula(,)")
aux = input()
d1, d2 = aux.split(",", maxsplit=1)
d1 = toFloat(d1)
d2 = toFloat(d2)
filters["Depth"] = {}
if d1 != -1:
filters["Depth"]["$gte"] = d1
if d2 != -1:
filters["Depth"]["$lte"] = d2
case "4":
clear_screen()
print("Inserir GAP")
aux = input()
gap = toInt(aux)
if aux:
filters["GAP"]["$lte"] = gap
case "6":
fliters = {}
case "7":
print(filters)
case "q":
return filters
def graph_menu():
pass
def main(): def main():
pass cli = mongo.connect("mongodb://localhost:27017")
filters = {}
while True:
print_menu(MAIN_MENU)
usrIn = input()
match usrIn:
case "1":
raise NotImplementedError
case "2":
filters = filter_menu(filters)
case "3":
print(filters)
v = mongo.filter_query(cli, "quakes", filters, "test")
stats.calculate_stats(v, filters)
input()
case "q":
break
mongo.close(cli)
if __name__ == "__main__": if __name__ == "__main__":
@@ -14,13 +154,5 @@ if __name__ == "__main__":
# initialization # initialization
logger.info("Started") logger.info("Started")
cli = mongo.connect("mongodb://localhost:27017") main()
evs, stats = parse("dados.txt")
mongo.add_events(cli, "quakes", evs)
mongo.add_stations(cli, "stations", stats)
# cleanup
mongo.close(cli)
logger.info("Ended") logger.info("Ended")

View File

@@ -1,5 +1,3 @@
dash==3.3.0
matplotlib==3.10.8 matplotlib==3.10.8
numpy==2.3.5 numpy==2.4.0
pandas==2.3.3 pymongo==4.15.5
plotly==6.5.0

17
utilsv2/graphs.py Normal file
View File

@@ -0,0 +1,17 @@
from matplotlib import pyplot as plt
class Plotter:
pass
def plot_bars(self):
pass
def plot_lin(self):
pass
def plot_box(self):
pass
def adjust_x(self):
pass

View File

@@ -14,7 +14,7 @@ except ModuleNotFoundError:
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def connect(uri) -> MongoClient: def connect(uri: str) -> MongoClient:
try: try:
client = MongoClient(uri) client = MongoClient(uri)
logger.info("Connected to the DB") logger.info("Connected to the DB")
@@ -26,10 +26,9 @@ def connect(uri) -> MongoClient:
def add_events( def add_events(
client: MongoClient, collection: str, data: list[dict[str, Any]] client: MongoClient, collection: str, data: list[dict[str, Any]], db: str = "main"
) -> None: ) -> None:
db = client["main"] coll: Collection = client[db][collection]
coll = db[collection]
_res = coll.insert_many(data) _res = coll.insert_many(data)
@@ -40,10 +39,9 @@ def add_events(
def add_stations( def add_stations(
client: MongoClient, collection: str, data: list[dict[str, Any]] client: MongoClient, collection: str, data: list[dict[str, Any]], db: str = "main"
) -> None: ) -> None:
db = client["main"] coll: Collection = client[db][collection]
coll = db[collection]
_res = coll.insert_many(data) _res = coll.insert_many(data)
@@ -62,19 +60,28 @@ def close(client: MongoClient) -> None:
logger.info("Closed the DB.") logger.info("Closed the DB.")
def query_all(cli: MongoClient, collection: str) -> Any: def query_all(client: MongoClient, collection: str, db: str = "main") -> Any:
coll: Collection = cli.main[collection] coll: Collection = client[db][collection]
result = coll.find({}) result = coll.find({})
for doc in result: return list(result)
print(doc)
def filter_query(cli: MongoClient, collection: str, filter_by): def filter_query(
coll: Collection = cli.main[collection] client: MongoClient, collection: str, filter_by: dict[str, Any], db: str = "main"
):
coll: Collection = client[db][collection]
res = coll.find({""}) res = coll.find(
filter_by, {"DateTime": 1, "Magnitudes": 1, "Depth": 1, "GAP": 1}
).sort({"DateTime": 1})
if not res._empty:
res = list(res)
logger.info(f"Retrieved {len(res)} elements.")
return res
if __name__ == "__main__": if __name__ == "__main__":

49
utilsv2/stats.py Normal file
View File

@@ -0,0 +1,49 @@
import time
import numpy as np
from pymongo import MongoClient
def print_filters(filters):
_res = ""
for k, v in filters.items():
_res += f"{k}: {v}\n"
def calculate_stats(data: list, filters):
_stats_txt = "Estatísticas\n"
_stats_txt += f"Número de eventos: {len(data)}\n"
_res = calc_mag(data)
_stats_txt += f"Magnitudes:\n\tMédia: {_res[0]} \u00b1 {_res[1]}\n\tMediana: {_res[2]}\n\tValor Mínimo: {_res[3]}\n\tValor Máximo: {_res[4]}\n"
_res = calc_depth(data)
_stats_txt += f"\nProfundidade:\n\tMédia: {_res[0]} \u00b1 {_res[1]}\n\tMediana: {_res[2]}\n\tValor Mínimo: {_res[3]}\n\tValor Máximo: {_res[4]}\n"
fname = f"stats-{time.time_ns()}.txt"
with open(fname, "wb") as fp:
fp.write(_stats_txt.encode("utf-8"))
print(_stats_txt)
def get_data(client: MongoClient):
pass
def calc_depth(data):
if len(data) == 0:
return 0
depths = np.array([v["Depth"] for v in data], dtype=float)
return (
np.average(depths),
np.std(depths),
np.median(depths),
np.min(depths),
np.max(depths),
)
def calc_mag(data):
if len(data) == 0:
return 0
mags = np.array([v["Magnitudes"]["L"]["Magnitude"] for v in data], dtype=float)
return (np.average(mags), np.std(mags), np.median(mags), np.min(mags), np.max(mags))

View File

@@ -1,2 +1,32 @@
from datetime import datetime
def is_empty(_str: str) -> bool: def is_empty(_str: str) -> bool:
return len(_str.strip(" ")) == 0 return len(_str.strip(" ")) == 0
def toDateTime(dt: str) -> datetime | int:
if len(dt) == 0:
return -1
try:
return datetime.strptime(dt, "%Y-%m-%d")
except ValueError:
return -1
def toFloat(v: str) -> float:
if len(v) == 0:
return -1.0
try:
return float(v)
except ValueError:
return -1.0
def toInt(v: str) -> int | None:
if len(v) == 0:
return None
try:
return int(v)
except ValueError:
return None