Page stats avec nb de marchés par département close #21

This commit is contained in:
Colin Maudry
2025-06-13 13:17:40 +02:00
parent 859506c4aa
commit 01e714dba5
4 changed files with 49 additions and 27 deletions
+2 -1
View File
@@ -12,7 +12,8 @@ dependencies = [
"gunicorn", "gunicorn",
"dash-bootstrap-components", "dash-bootstrap-components",
"python-dotenv", "python-dotenv",
"xlsxwriter" "xlsxwriter",
"plotly[express]",
] ]
[project.optional-dependencies] [project.optional-dependencies]
+9
View File
@@ -1,8 +1,17 @@
import logging
import dash_bootstrap_components as dbc import dash_bootstrap_components as dbc
from dash import Dash, dcc, html, page_container, page_registry from dash import Dash, dcc, html, page_container, page_registry
app = Dash(external_stylesheets=[dbc.themes.UNITED], title="decp.info", use_pages=True) app = Dash(external_stylesheets=[dbc.themes.UNITED], title="decp.info", use_pages=True)
logger = logging.getLogger("decp.info")
logging.basicConfig(
format="%(asctime)s %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
app.index_string = """ app.index_string = """
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
+2 -26
View File
@@ -1,45 +1,21 @@
import logging
import os
from datetime import datetime from datetime import datetime
from time import sleep
import polars as pl import polars as pl
from dash import Input, Output, State, callback, dash_table, dcc, html, register_page from dash import Input, Output, State, callback, dash_table, dcc, html, register_page
from dotenv import load_dotenv from dotenv import load_dotenv
from polars.exceptions import ComputeError
from src.utils import ( from src.utils import (
add_annuaire_link, add_annuaire_link,
booleans_to_strings, booleans_to_strings,
df,
format_number, format_number,
logger,
numbers_to_strings, numbers_to_strings,
split_filter_part, split_filter_part,
) )
logger = logging.getLogger("decp.info")
logging.basicConfig(
format="%(asctime)s %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
load_dotenv() load_dotenv()
# Chargement du fichier parquet
# Le fichier est chargé en mémoire, ce qui est plus rapide qu'une base de données pour le moment.
# On utilise polars pour la rapidité et la facilité de manipulation des données.
try:
logger.info(
f"Lecture du fichier parquet ({os.getenv('DATA_FILE_PARQUET_PATH')})..."
)
df: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
except ComputeError:
# Le fichier est probablement en cours de mise à jour
logger.info("Échec, nouvelle tentative dans 10s...")
sleep(seconds=10)
df: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
schema = df.schema schema = df.schema
df_filtered = pl.DataFrame() df_filtered = pl.DataFrame()
lf: pl.LazyFrame = df.lazy() lf: pl.LazyFrame = df.lazy()
+36
View File
@@ -1,5 +1,13 @@
import logging
import os
from time import sleep
import polars as pl import polars as pl
import polars.selectors as cs import polars.selectors as cs
from dotenv import load_dotenv
from polars.exceptions import ComputeError
load_dotenv()
operators = [ operators = [
["s<", "<"], ["s<", "<"],
@@ -7,6 +15,13 @@ operators = [
["icontains", "contains"], ["icontains", "contains"],
] ]
logger = logging.getLogger("decp.info")
logging.basicConfig(
format="%(asctime)s %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
def split_filter_part(filter_part): def split_filter_part(filter_part):
print("filter part", filter_part) print("filter part", filter_part)
@@ -69,3 +84,24 @@ def numbers_to_strings(lf: pl.LazyFrame) -> pl.LazyFrame:
def format_number(number) -> str: def format_number(number) -> str:
number = "{:,}".format(number).replace(",", " ") number = "{:,}".format(number).replace(",", " ")
return number return number
def get_decp_data() -> pl.DataFrame:
# Chargement du fichier parquet
# Le fichier est chargé en mémoire, ce qui est plus rapide qu'une base de données pour le moment.
# On utilise polars pour la rapidité et la facilité de manipulation des données.
try:
logger.info(
f"Lecture du fichier parquet ({os.getenv('DATA_FILE_PARQUET_PATH')})..."
)
ddf: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
except ComputeError:
# Le fichier est probablement en cours de mise à jour
logger.info("Échec, nouvelle tentative dans 10s...")
sleep(10)
ddf: pl.DataFrame = pl.read_parquet(os.getenv("DATA_FILE_PARQUET_PATH"))
return ddf
df = get_decp_data()