diff --git a/src/figures.py b/src/figures.py index 8796e96..9a5957d 100644 --- a/src/figures.py +++ b/src/figures.py @@ -5,6 +5,8 @@ import plotly.express as px import polars as pl from dash import dash_table, dcc, html +from src.utils import format_number + def get_map_count_marches(df: pl.DataFrame): lf = df.lazy() @@ -56,6 +58,25 @@ def get_map_count_marches(df: pl.DataFrame): return fig +def get_yearly_statistics(statistics, today_str) -> html.Div: + children = [] + + for year in reversed(range(2018, int(today_str.split("/")[-1]) + 1)): + year = str(year) + stat_year = statistics[year] + md = dcc.Markdown(f""" + #### {year} + + - Nombre de marchés publics et accords-cadres : {format_number(stat_year["nb_notifications_marches"])} + - Nombre d'acheteurs publics : {format_number(stat_year["nb_acheteurs_uniques"])} + - Nombre de titulaires : {format_number(stat_year["nb_titulaires_uniques"])} + + """) + children.append(md) + + return html.Div(children=children) + + def get_barchart_sources(df: pl.DataFrame, type_date: str): lf = df.lazy() labels = { diff --git a/src/pages/statistiques.py b/src/pages/statistiques.py index 1caa4d4..44ddf78 100644 --- a/src/pages/statistiques.py +++ b/src/pages/statistiques.py @@ -1,7 +1,13 @@ +from datetime import datetime + from dash import dcc, html, register_page -from src.figures import get_barchart_sources, get_map_count_marches -from src.utils import df, meta_content +from src.figures import ( + get_barchart_sources, + get_map_count_marches, + get_yearly_statistics, +) +from src.utils import df, format_number, get_statistics, meta_content name = "Statistiques" @@ -15,6 +21,8 @@ register_page( order=3, ) +statistics: dict = get_statistics() +today_str = datetime.fromisoformat(statistics["datetime"]).strftime("%d/%m/%Y") layout = [ html.Div( @@ -38,6 +46,20 @@ layout = [ toutes les [contributions](/a-propos#contribuer) sont les bienvenues pour atteindre l'exhaustivité. """), dcc.Graph(figure=get_map_count_marches(df)), + html.H2( + f"Statistiques générales sur les marchés (au {today_str})", + id="marches", + ), + html.P( + "À noter qu'une fois un marché attribué ses données essentielles peuvent malheureusement mettre plusieurs mois à être publiées par l'acheteur." + ), + html.H4("Statistiques cumulées"), + dcc.Markdown(f""" + - Nombre de marchés publics et accords-cadres : {format_number(statistics["nb_marches"])} + - Nombre d'acheteurs publics : {format_number(statistics["nb_acheteurs_uniques"])} + - Nombre de titulaires uniques : {format_number(statistics["nb_titulaires_uniques"])} + """), + get_yearly_statistics(statistics, today_str), dcc.Graph( figure=get_barchart_sources(df, "dateNotification") ), diff --git a/src/utils.py b/src/utils.py index add2e81..f1e31f4 100644 --- a/src/utils.py +++ b/src/utils.py @@ -240,6 +240,17 @@ def get_org_data(dff: pl.DataFrame, org_type: str) -> pl.DataFrame: return lff.collect() +def get_statistics() -> dict: + return ( + get( + "https://www.data.gouv.fr/api/1/datasets/r/0ccf4a75-f3aa-4b46-8b6a-18aeb63e36df", + follow_redirects=True, + ) + .raise_for_status() + .json() + ) + + def get_departements() -> dict: with open("data/departements.json", "rb") as f: data = json.load(f)