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).
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ètre | Type | Description |
|---|---|---|
from | texte | Nom actuel de la colonne (requis) |
to | texte | Nouveau 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_id | montant | customer_id | montant | |
|---|---|---|---|---|
| 17 | 42.5 | → | 17 | 42.5 |
| 18 | 12.0 | → | 18 | 12.0 |
remove : supprimer des colonnes
| Paramètre | Type | Description |
|---|---|---|
columns | liste de textes | Colonnes à supprimer |
Les colonnes absentes sont ignorées (avertissement dans les logs).
Avant → après (columns: [_tmp]) :
| id | nom | _tmp | id | nom | |
|---|---|---|---|---|---|
| 1 | Ada | x | → | 1 | Ada |
| 2 | Bob | y | → | 2 | Bob |
keep : ne garder que les colonnes choisies
| Paramètre | Type | Description |
|---|---|---|
columns | liste de textes | Colonnes à 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]) :
| id | nom | _tmp | interne | id | nom | |
|---|---|---|---|---|---|---|
| 1 | Ada | x | a | → | 1 | Ada |
| 2 | Bob | y | b | → | 2 | Bob |
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 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ètre | Type | Description |
|---|---|---|
casts | liste | Le tableau : une ligne par colonne — {column, type, try, null_bloque} |
try | booléen | false (défaut) — le défaut des lignes qui ne se prononcent pas |
error_column | texte | Nom 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 TRY | colonne avec TRY | |
|---|---|---|
| valeur illisible | la brick s'arrête | la ligne part en rejet |
vide, null_bloque | la brick s'arrête | la 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.
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'
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ètre | Type | Description |
|---|---|---|
column | texte | Nom de la colonne à récupérer (requis) |
type | texte | Type à 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.
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ée | Schéma de sortie | |
|---|---|---|
id, DYNAMIC | → | id, name, DYNAMIC |
reorder : réordonner les colonnes
| Paramètre | Type | Description |
|---|---|---|
columns | liste de textes | Ordre 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ètre | Type | Description |
|---|---|---|
name | texte | Nom de la nouvelle colonne (requis) |
expression | texte | Expression é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) :
| prix | quantite | prix | quantite | total | |
|---|---|---|---|---|---|
| 10 | 3 | → | 10 | 3 | 30 |
| 5 | 2 | → | 5 | 2 | 10 |
Pour concaténer des colonnes non textuelles dans une expression (`id + '-'
- code
), ajoutez d'abord une opérationcastversstring` sur ces colonnes ; le message d'erreur de la brick vous le rappelle le cas échéant.
add_constant : ajouter une colonne constante
| Paramètre | Type | Description |
|---|---|---|
name | texte | Nom de la colonne (requis) |
value | valeur | Valeur affectée à toutes les lignes |
type | texte | Type cible optionnel (int, float, string, bool, datetime ; défaut string) |
add_flag : ajouter un indicateur booléen
| Paramètre | Type | Description |
|---|---|---|
name | texte | Nom de la colonne (requis) |
condition | texte | Condition évaluée ligne à ligne (requis) |
Avant → après (name: gros_client, condition: ca > 1000) :
| client | ca | client | ca | gros_client | |
|---|---|---|---|---|---|
| Ada | 1500 | → | Ada | 1500 | true |
| Bob | 200 | → | Bob | 200 | false |
add_metadata : ajouter une métadonnée d'exécution
| Paramètre | Type | Description |
|---|---|---|
name | texte | Nom de la colonne (requis) |
source | texte | pipeline_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ètre | Type | Description |
|---|---|---|
output_name | texte | Colonne de sortie (requis) |
columns | liste de textes | Colonnes sources, examinées dans l'ordre (requis) |
Avant → après (output_name: tel, columns: [mobile, fixe]) :
| mobile | fixe | mobile | fixe | tel | |
|---|---|---|---|---|---|
| 06… | 01… | → | 06… | 01… | 06… |
| null | 01… | → | null | 01… | 01… |
fill_null : remplir les valeurs manquantes
| Paramètre | Type | Description |
|---|---|---|
columns | liste de textes | Colonnes ciblées (défaut : toutes) |
mode | texte | value (défaut), forward (propage la valeur précédente) ou backward (la suivante) |
fill_value | valeur | Valeur de remplacement en mode value (défaut : chaîne vide) |
hash : calculer une empreinte
| Paramètre | Type | Description |
|---|---|---|
column | texte | Colonne source (requis) |
algo | texte | md5 (défaut), sha1 ou sha256 |
output_name | texte | Colonne 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 changeraitABCen vide, et la ligne survivrait sans sa valeur ; - le type ne change pas. Un nombre à virgule arrondi reste à virgule :
2.0, pas2. Enchaînez uncastpour en faire un entier.
Les valeurs vides restent vides — un vide n'est pas un zéro.
round : arrondir
| Paramètre | Type | Description |
|---|---|---|
columns | liste | Colonnes à arrondir (requis) |
mode | texte | half_up (défaut), half_even, floor, ceil, trunc |
decimals | entier | Nombre de décimales (défaut : 0) |
| Mode | 2,5 | −2,5 | 2,7 | −2,7 |
|---|---|---|---|---|
half_up — au plus proche, 0,5 au-dessus | 3 | −3 | 3 | −3 |
half_even — arrondi bancaire | 2 | −2 | 3 | −3 |
floor — inférieur | 2 | −3 | 2 | −3 |
ceil — supérieur | 3 | −2 | 3 | −2 |
trunc — vers zéro | 2 | −2 | 2 | −2 |
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 choseSur 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ètre | Type | Description |
|---|---|---|
columns | liste | Colonnes à traiter (requis) |
clamp : borner entre deux valeurs
| Paramètre | Type | Description |
|---|---|---|
columns | liste | Colonnes à borner (requis) |
min | nombre | Borne basse — vide pour ne pas en poser |
max | nombre | Borne 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.