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.

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:

  1. Filtrare solo le righe dove il valore dell’età é superiore a 30.

  2. Ordinare per nome, in ordine alfabetico.

  3. 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:

  1. Rimuovere i valori nulli.

  2. Filtrare solo le righe dove il valore dell’età é superiore a 25 con il metodo query.

  3. Ordinare i dati secondo l’ordine ascendente della colonna “età”.

  4. 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 👋 

Se vuoi imparare la data analysis con micro-lezioni che vanno dritto al sodo, iscriviti alla newsletter: