Aller au contenu principal

Colonnes

La brick Colonnes (catégorie Transform) applique une liste ordonnée d'opérations sur les colonnes du flux : renommer, supprimer, convertir un type, arrondir, réordonner, ajouter des colonnes calculées ou de métadonnées… Une seule brick suffit là où il fallait auparavant en chaîner une dizaine. Elle prend un flux en entrée (in) et produit un flux en sortie (out).

remarque

Les opérations s'appliquent dans l'ordre déclaré. Une colonne renommée par la première opération doit être référencée par son nouveau nom dans les suivantes. Sans opération configurée, la brick laisse passer les données telles quelles.

Opérations disponibles​

Chaque opération s'ajoute depuis le panneau de configuration de la brick, avec ses propres paramètres.

rename : renommer une colonne​

ParamètreTypeDescription
fromtexteNom actuel de la colonne (requis)
totexteNouveau nom (requis)

Si la colonne from n'existe pas, l'opération est ignorée avec un avertissement dans les logs.

Avant → après (from: cust_id, to: customer_id) :

cust_idmontantcustomer_idmontant
1742.5→1742.5
1812.0→1812.0

remove : supprimer des colonnes​

ParamètreTypeDescription
columnsliste de textesColonnes à supprimer

Les colonnes absentes sont ignorées (avertissement dans les logs).

Avant → après (columns: [_tmp]) :

idnom_tmpidnom
1Adax→1Ada
2Boby→2Bob

keep : ne garder que les colonnes choisies​

ParamètreTypeDescription
columnsliste de textesColonnes à garder — les autres sont écartées

Le pendant positif de remove. On choisit celui dont la liste ne bougera pas : garder 4 colonnes sur 40, c'est en nommer 4 ; les retirer, c'est en nommer 36 — et une colonne ajoutée en amont traverserait alors en silence, là où keep l'arrête. Une sélection de sortie se dit en positif.

Avant → après (columns: [id, nom]) :

idnom_tmpinterneidnom
1Adaxa→1Ada
2Bobyb→2Bob

L'ordre reste celui du flux, pas celui des cases cochées : déplacer une colonne est le geste de reorder, et une opération qui ferait les deux obligerait à deviner laquelle elle vient de faire.

Les colonnes absentes sont ignorées, en étant nommées dans les logs.

Une sélection vide ne garde pas « rien »

Une opération qu'on vient d'ajouter n'a encore rien de coché. Prise au mot, elle jetterait toutes les colonnes entre le moment où on la pose et celui où on la règle. Elle ne fait donc rien, et le dit — de même si aucune des colonnes choisies n'est présente.

cast : convertir le type d'une colonne​

ParamètreTypeDescription
castslisteLe tableau : une ligne par colonne — {column, type, try, null_bloque}
trybooléenfalse (défaut) — le défaut des lignes qui ne se prononcent pas
error_columntexteNom de la colonne de motif (défaut _cast_error)

Formes précédentes, toujours lues parce que des pipelines les portent : columns + un type commun, et column au singulier. Une seule lecture pour les trois — deux finiraient par donner deux avis.

Une conversion porte rarement sur des colonnes de même nature : un identifiant en texte et un montant décimal se déclarent ensemble, pas en deux opérations. Le vide et le mode TRY n'y ont pas non plus le même statut — un identifiant vide est une anomalie qu'on refuse, un montant illisible une ligne qu'on met de côté. D'où le tableau, et try comme null_bloque ligne par ligne.

Les deux réactions cohabitent donc sur une même ligne de données :

colonne sans TRYcolonne avec TRY
valeur illisiblela brick s'arrêtela ligne part en rejet
vide, null_bloquela brick s'arrêtela ligne part en rejet

Les colonnes strictes sont traitées en premier : si l'une tombe, il n'y a pas lieu de trier les autres — le run s'arrête de toute façon.

Les deux modes acceptent les mêmes types

Le chemin strict passe par TYPE_MAP, le mode TRY par la conversion tolérante — qui en connaît davantage. Un type hors de TYPE_MAP marchait donc en TRY et tombait sans lui : le même réglage, deux comportements selon une case à cocher. Il est désormais refusé des deux côtés, en étant nommé.

Ce qu'on fait d'une valeur illisible​

Sans TRY, la brick s'arrête en nommant la colonne. Avec, la ligne part sur la sortie « Non convertible » et les autres continuent converties.

C'est une case, pas une liste : il n'y a que deux issues, et une énumération de deux entrées pour dire oui ou non se lit moins bien. on_cast_error: ecarter reste lu.

Dans l'écran, l'en-tête de la colonne TRY bascule toutes les lignes d'un geste : c'est ce que le réglage d'opération faisait, mais en le montrant.

Arrêter est le défaut : sur un flux interne, un mauvais type est un défaut de programme. Sur des données venues du dehors, non — dix mille factures dont trente portent un montant illisible ne doivent pas être perdues tout entières.

La sortie « Non convertible » porte les valeurs telles qu'elles sont arrivées, plus une colonne _cast_error qui dit pourquoi. Les motifs d'une même ligne y sont réunis, séparés par ; :

« QUANTITE » ne se lit pas comme « integer » : 'beaucoup'; « MONTANT » ne se lit pas comme « integer » : 'cher'
Une case vide n'est pas une case illisible

Il n'y avait rien à convertir, donc rien n'a échoué. null_bloque à vrai, sur la ligne de cette colonne, la rejette au contraire — avec un motif qui dit « est vide ». L'ancien réglage global cast_empty_ok reste lu et s'applique alors à toutes les lignes du tableau.

La sortie est toujours émise, même vide : une sortie qui n'existerait que les jours de rejet obligerait l'aval à se demander si rien n'a été écarté ou si la branche n'a pas tourné.

Particularités :

  • vers int / float : si la colonne est textuelle, la virgule décimale (12,5) est automatiquement normalisée en point (12.5) ; une valeur non numérique fait échouer l'opération ;
  • vers datetime : les valeurs non parsables deviennent null (pas d'erreur) ;
  • les entiers utilisent le type nullable de pandas (les null sont conservés).

Avant → après (column: prix, type: float) :

prix (texte)prix (float)
12,50→12.5
8.00→8.0

declare : récupérer une colonne dynamique​

ParamètreTypeDescription
columntexteNom de la colonne à récupérer (requis)
typetexteType à lui donner : int, float, string, bool, datetime (défaut string)

Un schéma ouvert — celui qui porte la colonne DYNAMIC — laisse passer des colonnes qu'il ne nomme pas. Elles traversent bien les bricks, mais elles n'existent nulle part pour le studio : aucun sélecteur ne les propose, aucun aperçu ne les liste, et l'aval ne peut pas s'en servir.

declare en sort une : on la nomme, on dit son type, et elle devient une colonne comme les autres pour toute la suite du flux.

Le nom se tape — il ne se choisit pas dans une liste. C'est la raison d'être de l'opération : désigner ce que le schéma ne déclare pas. Les colonnes déjà connues restent suggérées, car on peut vouloir figer le type de l'une d'elles au passage.

La colonne est créée si elle manque

Le schéma l'annonce désormais. Ne rien poser laisserait tout l'aval — jusqu'aux contrats verrouillés — compter sur une colonne absente.

Elle est donc créée vide, et l'exécution le dit en nommant la colonne et en listant celles qui étaient disponibles. Mieux vaut un avertissement précis qu'une chaîne qui se casse trois bricks plus loin.

Avant → après (column: name, type: string) :

Schéma d'entréeSchéma de sortie
id, DYNAMIC→id, name, DYNAMIC

reorder : réordonner les colonnes​

ParamètreTypeDescription
columnsliste de textesOrdre souhaité

Les colonnes listées passent en tête, dans l'ordre donné ; les colonnes non listées sont conservées et ajoutées à la suite.

add_computed : ajouter une colonne calculée​

ParamètreTypeDescription
nametexteNom de la nouvelle colonne (requis)
expressiontexteExpression évaluée ligne à ligne, les colonnes servant de variables (requis)

Exemples d'expressions : prix * quantite, nom + ' ' + prenom, montant_ht * 1.2.

Avant → après (name: total, expression: prix * quantite) :

prixquantiteprixquantitetotal
103→10330
52→5210
astuce

Pour concaténer des colonnes non textuelles dans une expression (`id + '-'

  • code), ajoutez d'abord une opération castversstring` sur ces colonnes ; le message d'erreur de la brick vous le rappelle le cas échéant.

add_constant : ajouter une colonne constante​

ParamètreTypeDescription
nametexteNom de la colonne (requis)
valuevaleurValeur affectée à toutes les lignes
typetexteType cible optionnel (int, float, string, bool, datetime ; défaut string)

add_flag : ajouter un indicateur booléen​

ParamètreTypeDescription
nametexteNom de la colonne (requis)
conditiontexteCondition évaluée ligne à ligne (requis)

Avant → après (name: gros_client, condition: ca > 1000) :

clientcaclientcagros_client
Ada1500→Ada1500true
Bob200→Bob200false

add_metadata : ajouter une métadonnée d'exécution​

ParamètreTypeDescription
nametexteNom de la colonne (requis)
sourcetextepipeline_name, pipeline_id, exec_id, exec_timestamp ou now (défaut now)

exec_timestamp et now produisent l'horodatage UTC de l'exécution (ISO 8601). Toute autre valeur de source est insérée telle quelle (valeur littérale). Pratique pour tracer l'origine des lignes chargées.

coalesce : première valeur non nulle​

ParamètreTypeDescription
output_nametexteColonne de sortie (requis)
columnsliste de textesColonnes sources, examinées dans l'ordre (requis)

Avant → après (output_name: tel, columns: [mobile, fixe]) :

mobilefixemobilefixetel
06…01…→06…01…06…
null01…→null01…01…

fill_null : remplir les valeurs manquantes​

ParamètreTypeDescription
columnsliste de textesColonnes ciblées (défaut : toutes)
modetextevalue (défaut), forward (propage la valeur précédente) ou backward (la suivante)
fill_valuevaleurValeur de remplacement en mode value (défaut : chaîne vide)

hash : calculer une empreinte​

ParamètreTypeDescription
columntexteColonne source (requis)
algotextemd5 (défaut), sha1 ou sha256
output_nametexteColonne de sortie (défaut : <colonne>_hash)

Les valeurs null restent null. Utile pour pseudonymiser un identifiant ou détecter des changements entre deux chargements.

Nombres​

Trois opérations travaillent la valeur d'une colonne numérique. Deux règles leur sont communes :

  • une colonne qui n'est pas numérique n'est pas touchée. Elle est nommée dans les logs, et rien n'est écrit. Convertir d'abord se demande avec cast — une conversion silencieuse changerait ABC en vide, et la ligne survivrait sans sa valeur ;
  • le type ne change pas. Un nombre à virgule arrondi reste à virgule : 2.0, pas 2. Enchaînez un cast pour en faire un entier.

Les valeurs vides restent vides — un vide n'est pas un zéro.

round : arrondir​

ParamètreTypeDescription
columnslisteColonnes à arrondir (requis)
modetextehalf_up (défaut), half_even, floor, ceil, trunc
decimalsentierNombre de décimales (défaut : 0)
Mode2,5−2,52,7−2,7
half_up — au plus proche, 0,5 au-dessus3−33−3
half_even — arrondi bancaire2−23−3
floor — inférieur2−32−3
ceil — supérieur3−23−2
trunc — vers zéro2−22−2
Le défaut n'est pas celui de pandas

Series.round applique l'arrondi bancaire : à mi-chemin, on va vers le pair — 0,5 → 0, 1,5 → 2, 2,5 → 2. C'est statistiquement plus juste sur un grand nombre de valeurs, et parfaitement inattendu sur une facture : personne ne s'attend à ce que 2,50 € fasse 2 €.

Le défaut de l'opération est donc half_up, l'arrondi qu'on apprend à l'école. half_even reste disponible, nommé pour ce qu'il est.

floor et trunc ne sont pas la même chose

Sur un positif, si. Sur un négatif, floor descend (−2,7 → −3) tandis que trunc coupe ce qui dépasse (−2,7 → −2). C'est la distinction qui compte sur des écarts.

L'arrondi passe par des décimaux exacts : 2,675 arrondi à deux décimales donne bien 2,68, là où le calcul binaire direct rendrait 2,67 — la machine garde 2,67499….

abs : valeur absolue​

ParamètreTypeDescription
columnslisteColonnes à traiter (requis)

clamp : borner entre deux valeurs​

ParamètreTypeDescription
columnslisteColonnes à borner (requis)
minnombreBorne basse — vide pour ne pas en poser
maxnombreBorne haute — vide pour ne pas en poser

Les deux bornes sont facultatives, mais au moins une est nécessaire. Une borne basse supérieure à la borne haute fait échouer l'exécution : clip ne rendrait pas d'erreur, il ramènerait toute la colonne à la même valeur.

Bonnes pratiques​

  • Soignez l'ordre : castez avant de calculer, renommez avant de réordonner.
  • Les opérations sur colonnes absentes sont ignorées avec un avertissement : consultez les logs d'exécution, qui tracent chaque opération appliquée dans l'ordre, pour comprendre un résultat inattendu.
  • Préférez une seule brick Colonnes avec plusieurs opérations à plusieurs bricks en série : le pipeline reste lisible et l'exécution plus rapide.
  • Pour vérifier le résultat, utilisez l'aperçu de données dans l'éditeur de pipeline.

Anciennes bricks remplacées​

Cette méga-brick remplace les bricks atomiques Rename Column, Column Remove, Cast Types, Order Columns, Add Column, Add Flag, Add Metadata, Coalesce Columns, Fill Nulls, Compute Hash et Link Columns. Voir Bricks héritées pour la table de correspondance.