- analiticas
- Posts
- Python elegante con il chaining
Python elegante con il chaining
Concatena più metodi per uno stile leggibile e compatto.
Quando lavoriamo con pandas, uno degli stili più apprezzati è il chaining, cioè l’utilizzo di più metodi concatenati uno dopo l’altro su un dataframe o una Series.
In questa micro-lezione vediamo cos’è, perché può essere utile e a cosa dobbiamo prestare attenzione.
Il programma della micro-lezione
Cos’è il chaining in Python?
Il chaining consiste nel concatenare più metodi uno dopo l’altro, senza salvare ogni passaggio in una variabile intermedia.
Un esempio pratico
Per prima cosa, importiamo le librerie pandas
e numpy
e costruiamo un dataframe di esempio:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'nome': ['Anna', 'Marco', 'Giulia', 'Paolo', 'Giovanni'],
'età': [23, 34, 29, 41, np.nan],
'città': ['Roma', np.nan, 'Bari','Parma','Enna']
})
Il nostro dataframe avrà questo aspetto:
nome | età | città |
---|---|---|
Anna | 23.0 | Roma |
Marco | 34.0 | NaN |
Giulia | 29.0 | Bari |
Paolo | 41.0 | Parma |
Giovanni | NaN | Enna |
Adesso immaginiamo di voler fare le operazioni seguenti:
Filtrare solo le righe dove il valore dell’età é superiore a 30.
Ordinare per nome, in ordine alfabetico.
Rimuovere tutte le colonne del dataframe ad eccezione di quella del “nome”.
Normalmente, se non usassimo il chaining, faremmo così:
df_filtrato = df[df['età'] > 30]
df_ordinato = df_filtrato.sort_values('nome')
df_nome = df_ordinato[['nome']]
Praticamente abbiamo creato tre dataframe diversi. I primi due sono tappe intermedie per raggiungere il nostro scopo.
Invece, usando il chaining possiamo fare i tre passaggi senza dover create altrettanti dataframe. Vediamo come:
df_finale = df[df['età'] > 30].sort_values('nome')[['nome']]
Infatti il chaining ci permette di costruire una “catena” di metodi.
Scrivere codice chiaro con il chaining
Nonostante il chaining ci permetta di non dover creare dataframe intermedi, ti potrai chiedere se ne valga davvero la pena.
Infatti, l’esempio qui in alto non risulta super leggibile.
Ed ecco quindi un consiglio su come formattare il codice scritto con il chaining: vai a capo per ogni metodo.
Immaginiamo di voler modificare il nostro dataframe facendo le operazioni seguenti:
Rimuovere i valori nulli.
Filtrare solo le righe dove il valore dell’età é superiore a 25 con il metodo query.
Ordinare i dati secondo l’ordine ascendente della colonna “età”.
Fare il reset dell’indice.
Ed ecco come fare, usando il chaining in maniera elegante:
df_finale = (
df
.dropna()
.query('età > 25')
.sort_values('età')
.reset_index(drop=True)
)
In questo modo, non solo il codice risulterà ben leggibile, ma potremo anche invalidare dei passaggi commentandoli.
Ad esempio, possiamo saltare il secondo passaggio (il filtro) così:
df_finale = (
df
.dropna()
#.query('età > 25')
.sort_values('età')
.reset_index(drop=True)
)
Benefici principali del chaining
In breve, usare il chaining regolarmente presenta alcuni vantaggi:
Più leggibilità e compattezza: se la catena è breve, il codice è lineare e si segue facilmente il flusso delle operazioni.
Meno variabili inutili: non devi creare una variabile per ogni passaggio intermedio.
Stile un po’ da “pipeline”: utile soprattutto in notebook e analisi esplorative, dove fare prove è fondamentale.
Ricordati solo di non esagerare: se le catene dovessero diventare troppo lunghe e complesse, i vantaggi principali del chaining potrebbero venir meno.
Il chaining oltre pandas
Il chaining non è una caratteristica esclusiva di pandas: è una tecnica generale che si può applicare in Python ogni volta che una libreria implementa metodi che restituiscono l’oggetto stesso (o un oggetto simile) su cui lavorare.
Oltre a pandas, il chaining è un approccio utilizzabile quando usi Polars, PySpark, pytest, ecc.
Alla prossima micro-lezione 👋