Remplacement des null par '' close #18

This commit is contained in:
Colin Maudry
2025-06-10 10:01:11 +02:00
parent 804f6e7883
commit c66bf97572
2 changed files with 46 additions and 3 deletions
+23 -2
View File
@@ -7,7 +7,12 @@ from dash import Input, Output, State, callback, dash_table, dcc, html, register
from dotenv import load_dotenv from dotenv import load_dotenv
from polars.exceptions import ComputeError from polars.exceptions import ComputeError
from src.utils import add_annuaire_link, split_filter_part from src.utils import (
add_annuaire_link,
booleans_to_strings,
numbers_to_strings,
split_filter_part,
)
logger = logging.getLogger("decp.info") logger = logging.getLogger("decp.info")
logging.basicConfig( logging.basicConfig(
@@ -41,6 +46,13 @@ lf = lf.drop(
["titulaire_siren", "acheteur_siren", "typeGroupementOperateurs", "sourceOpenData"] ["titulaire_siren", "acheteur_siren", "typeGroupementOperateurs", "sourceOpenData"]
) )
# Convertir les colonnes booléennes en chaînes de caractères
lf = booleans_to_strings(lf)
# Remplacer les valeurs manquantes par des chaînes vides
lf = lf.fill_null("")
# Ajout des liens vers l'annuaire # Ajout des liens vers l'annuaire
lf = add_annuaire_link(lf) lf = add_annuaire_link(lf)
@@ -56,7 +68,13 @@ datatable = dash_table.DataTable(
filter_action="custom", filter_action="custom",
filter_options={"case": "insensitive", "placeholder_text": "Filtrer..."}, filter_options={"case": "insensitive", "placeholder_text": "Filtrer..."},
columns=[ columns=[
{"name": i, "id": i, "presentation": "markdown"} {
"name": i,
"id": i,
"presentation": "markdown",
"type": "text",
"format": {"nully": "N/A"},
}
for i in lf.collect_schema().names() for i in lf.collect_schema().names()
], ],
selected_columns=[], selected_columns=[],
@@ -173,6 +191,9 @@ def update_table(page_current, page_size, filter_query, data_timestamp):
start_row = page_current * page_size start_row = page_current * page_size
# end_row = (page_current + 1) * page_size # end_row = (page_current + 1) * page_size
# Remplacement des valeurs numériques par des chaînes de caractères
lff = numbers_to_strings(lff)
dff = lff.slice(start_row, page_size).collect() dff = lff.slice(start_row, page_size).collect()
# print("dff_sliced:", lff.select("titulaire.typeId")) # print("dff_sliced:", lff.select("titulaire.typeId"))
dff = dff.to_dicts() dff = dff.to_dicts()
+23 -1
View File
@@ -1,4 +1,5 @@
import polars as pl import polars as pl
import polars.selectors as cs
operators = [ operators = [
["s<", "<"], ["s<", "<"],
@@ -28,7 +29,7 @@ def add_annuaire_link(df: pl.LazyFrame):
pl.col("titulaire_id") pl.col("titulaire_id")
+ ' <a href="https://annuaire-entreprises.data.gouv.fr/etablissement/' + ' <a href="https://annuaire-entreprises.data.gouv.fr/etablissement/'
+ pl.col("titulaire_id") + pl.col("titulaire_id")
+ '" target="_blank">📑</a>' + '">📑</a>'
) )
.otherwise(pl.col("titulaire_id")) .otherwise(pl.col("titulaire_id"))
.alias("titulaire_id") .alias("titulaire_id")
@@ -42,3 +43,24 @@ def add_annuaire_link(df: pl.LazyFrame):
).alias("acheteur_id") ).alias("acheteur_id")
) )
return df return df
def booleans_to_strings(lf: pl.LazyFrame) -> pl.LazyFrame:
"""
Convert all boolean columns to string type.
"""
lf = lf.with_columns(
pl.col(cs.Boolean)
.cast(pl.String)
.str.replace("true", "oui")
.str.replace("false", "non")
)
return lf
def numbers_to_strings(lf: pl.LazyFrame) -> pl.LazyFrame:
"""
Convert all numeric columns to string type.
"""
lf = lf.with_columns(pl.col(pl.Float64, pl.Int16).cast(pl.String).fill_null(""))
return lf