-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
👪 CLUSTERING: toujours ajouter parents existants des acteurs types (#…
…1268) * cluster acteurs: ajout parents acteur types * cluster acteurs: ajout des parents à la tâche de sélection * suppresion legacy code clustering * mise à jour de l'init cluster business logic * suppression de la restriction 1 source * correction des tests suite suppression legacy code_postal * cluster acteurs: finalisation fonction, modèle et tests
- Loading branch information
1 parent
66695b9
commit 41579f7
Showing
10 changed files
with
386 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
""" | ||
Code nécessaire pour le formattage de la UI Airflow, | ||
qu'on déplace dans ce fichier pour ne pas encombrer | ||
le DAG | ||
""" | ||
|
||
UI_PARAMS_SEPARATOR_SELECTION_ACTEURS = r""" | ||
--- | ||
# 🔎 Paramètres **sélection acteurs non-parent** | ||
Les paramètres suivants décident des acteurs non-parent à inclure | ||
ou exclure comme candidats au clustering. Ce n'est pas | ||
parce qu'un acteur est selectionné qu'il sera forcément clusterisé | ||
(ex: si il se retrouve tout seul sachant qu'on supprime | ||
les clusters de taille 1) | ||
""" | ||
|
||
UI_PARAMS_SEPARATOR_SELECTION_PARENTS = r""" | ||
--- | ||
# 🔎 Paramètres **sélection parents existants** | ||
Les paramètres suivants décident des parents à inclure | ||
ou exclure comme candidats au clustering. | ||
- 💯 Par défault on prend **TOUS les parents** des **mêmes acteur-types | ||
utilisés pour les acteurs** | ||
- Et on filtre ces parents avec les paramètres suivants: | ||
""" | ||
|
||
UI_PARAMS_SEPARATOR_NORMALIZATION = r""" | ||
--- | ||
# 🧹 Paramètres de **normalisation acteurs + parents** | ||
Les paramètres suivants définissent comment les valeurs | ||
des champs vont être transformées avant le clustering. | ||
""" | ||
|
||
UI_PARAMS_SEPARATOR_CLUSTERING = r""" | ||
--- | ||
# 📦 Paramètres de **clustering acteurs + parents** | ||
Les paramètres suivants définissent comment les acteurs | ||
vont être regroupés en clusters. | ||
""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
57 changes: 57 additions & 0 deletions
57
dags/cluster/tasks/business_logic/cluster_acteurs_selection_acteur_type_parents.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
import pandas as pd | ||
from shared.tasks.business_logic import normalize | ||
from utils.django import django_model_queryset_to_df, django_setup_full | ||
|
||
django_setup_full() | ||
from qfdmo.models import ActeurType, DisplayedActeur # noqa: E402 | ||
from qfdmo.models.acteur import ActeurStatus # noqa: E402 | ||
|
||
|
||
def cluster_acteurs_selection_acteur_type_parents( | ||
acteur_type_ids: list[int], | ||
fields: list[str], | ||
include_only_if_regex_matches_nom: str | None = None, | ||
) -> pd.DataFrame: | ||
"""Sélectionne tous les parents des acteurs types donnés, | ||
pour pouvoir notamment permettre de clusteriser avec | ||
ces parents existant indépendemment des critères de sélection | ||
des autres acteurs qu'on cherche à clusteriser (ex: si on cherche | ||
à clusteriser les acteurs commerce de source A MAIS en essayant | ||
de rattacher au maximum avec tous les parents commerce existants)""" | ||
|
||
# Ajout des champs nécessaires au fonctionnement de la fonction | ||
# si manquant | ||
if "nom" not in fields: | ||
fields.append("nom") | ||
|
||
# Petite validation (on ne fait pas confiance à l'appelant) | ||
ids_in_db = list(ActeurType.objects.values_list("id", flat=True)) | ||
ids_invalid = set(acteur_type_ids) - set(ids_in_db) | ||
if ids_invalid: | ||
raise ValueError(f"acteur_type_ids {ids_invalid} pas trouvés en DB") | ||
|
||
# On récupère les parents des acteurs types donnés | ||
# qui sont censés être des acteurs sans source | ||
parents = DisplayedActeur.objects.filter( | ||
acteur_type__id__in=acteur_type_ids, | ||
statut=ActeurStatus.ACTIF, | ||
source__id__isnull=True, | ||
) | ||
|
||
df = django_model_queryset_to_df(parents, fields) | ||
|
||
# Si une regexp de nom est fournie, on l'applique | ||
# pour filtrer la df, sinon on garde toute la df | ||
if include_only_if_regex_matches_nom: | ||
print(f"{include_only_if_regex_matches_nom=}") | ||
print(df["nom"].map(normalize.string_basic).tolist()) | ||
df = df[ | ||
df["nom"] | ||
# On applique la normalisation de base à la volée | ||
# pour simplifier les regex | ||
.map(normalize.string_basic).str.contains( | ||
include_only_if_regex_matches_nom, na=False, regex=True | ||
) | ||
].copy() | ||
|
||
return df |
Oops, something went wrong.