Page stats avec nb de marchés par département close #21
This commit is contained in:
+2
-1
@@ -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]
|
||||||
|
|||||||
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user