top of page

Manipolazione Dati con Python e Pandas



Manipolazione Dati con Python e Pandas
Manipolazione Dati con Python e Pandas


Introduzione

Python sta rapidamente diventando il linguaggio preferito nella scienza dei dati e per buone ragioni. Tra le sue librerie di calcolo scientifico, abbiamo trovato Pandas come la più utile per le operazioni di manipolazioni sui dati. Pandas, insieme a Scikit-learn, fornisce quasi l'intero stack necessario a un data scientist. Questo articolo si concentra su 10 modi per la manipolazione dei dati in Python. Abbiamo anche condiviso alcuni suggerimenti e trucchi che ti permetteranno di lavorare più velocemente .


Per aiutarti a capire meglio, abbiamo preso un set di dati da esempio per eseguire queste operazioni e manipolazioni.


Per ogni metodo, dei 10 troverai il codice python e sotto una finestra interattiva per provare il codice.


Iniziamo

Inizieremo importando il modulo Pandas e caricando il set di dati nell'ambiente Python come Pandas Dataframe:


#importiamo le librerie necessarie
import pandas as pd
import numpy as np
data = pd.read_csv("file dati prestiti.csv", index_col="Loan_ID")

#incolla nell'editor qui sotto
#sotto la riga di commento
print(data)



Manipolare Dataset con Python : Filtrare i dataset con pandas

Cosa fare se si desidera filtrare i valori di una colonna in base alle condizioni di un altro insieme di colonne di un Pandas Dataframe? Ad esempio, vogliamo un elenco di tutte le donne che non sono laureate e che hanno ottenuto un prestito. L'indicizzazione booleana può aiutare qui. È possibile utilizzare il seguente codice:


query = data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not Graduate") & (data["Loan_Status"]=="Y"), ["Gender","Education","Loan_Status"]]

print(query)



Leggi di più sull'indicizzazione booleana nei panda qui: Selezione e indicizzazione dei panda

Manipolare Dataset con Python : APPLY la funzione di pandas

È una delle funzioni Pandas comunemente utilizzate per manipolare un dataframe panda e creare nuove variabili. La funzione Pandas Apply restituisce un valore dopo aver passato ogni riga/colonna di un frame di dati con qualche funzione. La funzione può essere predefinita o definita dall'utente. Ad esempio, qui può essere utilizzato per trovare i valori #mancanti in ogni riga e colonna.

#Crea una nuova funzione: 
def num_missing(x): 
  return sum(x.isnull()) 
  
#Applicazione per colonna: 
print("Valori mancanti per colonna:")
print(data.apply(num_missing, axis=0))

#asse=0 definisce quella funzione deve essere applicata su ciascuna colonna 

#Applicazione per riga: 

print("\nValori mancanti per riga:")
print (data.apply(num_missing, axis=1).head())

#asse=1 definisce quella funzione da applicare su ogni riga



Manipolare Dataset con Python : Immissione di valori mancanti usando Panda

'fillna()' lo fa in una volta sola. Viene utilizzato per aggiornare i valori mancanti con la media/modalità/mediana complessiva della colonna. Assumiamo le colonne 'Sesso', 'Coniugato' e 'Self_Employed' con le rispettive modalità.

#Per prima cosa importiamo la funzione scipy per determinare la modalità 

from scipy.stats import mode
print(mode(data['Gender']))

Ciò restituisce sia la modalità che il conteggio. Ricorda che la modalità può essere un array in quanto possono esserci più valori con alta frequenza. Prenderemo il primo di default usando sempre:

mode(data['Gender']).mode[0]

Ora possiamo riempire i valori mancanti nei dati Pandas Dataframe e verificare usando la tecnica n. 2.

#Importa i valori: 

data['Gender'].fillna(mode(data['Gender']).mode[0], inplace=True)
data['Married'].fillna(mode(data['Married']).mode[0], inplace=True)
data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], inplace=True)

#Ora controlla di nuovo i valori #mancanti per confermare: 
print(data.apply(num_missing, axis=0))

Pertanto, viene confermato che i valori mancanti nel dataframe di Pandas vengono imputati. Si noti che questa è la forma più primitiva di imputazione. Altre tecniche sofisticate includono la modellazione dei valori mancanti, utilizzando medie raggruppate (media/modalità/mediana). Tratteremo quella parte nei prossimi articoli.


Maggiori informazioni sull'imputazione dei valori mancanti nel dataframe Pandas qui: Riferimento Pandas (fillna)

Manipolare Dataset con Python : Tabella pivot in Pandas

I panda possono essere utilizzati per creare tabelle pivot in stile MS Excel. Ad esempio, in questo caso, una colonna chiave è "LoanAmount" che ha valori mancanti. Possiamo attribuirlo utilizzando la quantità media di ciascun gruppo "Sesso", "Coniugato" e "Self_Employed". Il "LoanAmount" medio di ciascun gruppo nel dataframe Pandas può essere determinato come:

#Determina tabella pivot 
impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)
print(impute_grps)


Maggiori informazioni sulla tabella pivot Pandas qui: Riferimento Pandas (tabella pivot)

Manipolare Dataset con Python : Indicizzazione multipla in Pandas Dataframe

Se noti l'output del passaggio n. 3, ha una strana proprietà. Ogni indice Pandas è composto da una combinazione di 3 valori. Questo è chiamato Multi-indicizzazione. Aiuta a eseguire operazioni molto velocemente.

Continuando l'esempio dal n. 3, abbiamo i valori per ogni gruppo ma non sono stati imputati. Questo può essere fatto usando le varie tecniche apprese dai panda fino ad ora.

#itera solo le righe con ImportoLoanAmount mancante 

for i,row in data.loc[data['LoanAmount'].isnull(),:].iterrows():
  ind = tuple([row['Gender'],row['Married'],row['Self_Employed']])
  data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]
 
#Ora controlla di nuovo i #valori mancanti per confermare: 

print(data.apply( num_mancante, asse=0))


Nota:

  1. Il multi-indice richiede la tupla per definire gruppi di indici nell'istruzione panda loc. Questa è una tupla usata in funzione.

  2. Il suffisso .values[0] è richiesto perché, per impostazione predefinita, viene restituito un elemento series che ha un indice non corrispondente a quello del dataframe pandas. In questo caso, un'assegnazione diretta dà un errore.

Manipolare Dataset con Python : Tabella incrociata con Pandas

Questa funzione viene utilizzata per ottenere una "sensazione" (visualizzazione) iniziale dei dati. Qui, possiamo convalidare alcune ipotesi di base. Ad esempio, in questo caso, si prevede che "Credit_History" influisca in modo significativo sullo stato del prestito. Questo può essere testato utilizzando la tabella incrociata come mostrato di seguito:

print(pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True))

Questi sono numeri assoluti. Ma le percentuali possono essere più intuitive nel fare alcune rapide intuizioni. Possiamo farlo usando la funzione di applicazione di Pandas:

def percConvert(ser):
  return ser/float(ser[-1])
  pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1)


Ora, è evidente che le persone con una storia creditizia hanno possibilità molto più elevate di ottenere un prestito poiché l'80% delle persone con una storia di credito ha ottenuto un prestito rispetto al solo 9% senza storia di credito.


Ma non è questo. Racconta una storia interessante. Dal momento che so che avere una storia creditizia è estremamente importante, cosa succede se prevedo che lo stato del prestito sarà Y per quelli con storia creditizia e N altrimenti. Sorprendentemente, avremo ragione 82+378=460 volte su 614, che è un enorme 75%!


Non ti biasimerò se ti stai chiedendo perché diavolo abbiamo bisogno di modelli statistici. Ma fidati di me, aumentare la precisione anche dello 0,001% oltre questo segno è un compito impegnativo.


Nota: il 75% è sul train. Il set di test sarà leggermente diverso ma vicino. Inoltre, spero che questo dia un'idea del perché anche un aumento dello 0,05% della precisione può comportare un salto di 500 gradi nella classifica di Kaggle.

Manipolare Dataset con Python : Unire DataFrame con Pandas

L'unione dei dataframe di Panda diventa essenziale quando abbiamo informazioni provenienti da diverse fonti da raccogliere. Si consideri un caso ipotetico in cui le tariffe immobiliari medie (INR per mq) sono disponibili per diversi tipi di proprietà. Definiamo un dataframe Pandas come:

prop_rates = pd.DataFrame([1000, 5000, 12000], index=['Rural','Semiurban','Urban'],columns=['rates'])
print(prop_rates)

Ora possiamo unire queste informazioni con il dataframe Pandas originale come:

data_merged = data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)

print(data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'], aggfunc=len))


La tabella pivot convalida l'operazione di unione riuscita. Si noti che l'argomento "valori" è irrilevante qui perché stiamo semplicemente contando i valori.

Manipolare Dataset con Python : Ordinamento dei DataFrame di Pandas

I panda consentono un facile ordinamento basato su più colonne. Questo può essere fatto come:

data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)

print(data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10))


Nota: la funzione "ordina" di Panda è ora deprecata. Dovremmo invece usare "sort_values".


Manipolare Dataset con Python : Funzione di taglio per il binning

A volte i valori numerici hanno più senso se raggruppati insieme. Ad esempio, se stiamo cercando di modellare il traffico (#auto su strada) con l'ora del giorno (minuti). Il minuto esatto di un'ora potrebbe non essere rilevante per la previsione del traffico rispetto al periodo effettivo della giornata come "Mattino", "Pomeriggio", "Sera", "Notte", "Late Night". Modellare il traffico in questo modo sarà più intuitivo ed eviterà l'overfitting.

Qui definiamo una semplice funzione che può essere riutilizzata per il binning di qualsiasi variabile abbastanza facilmente.

#Binning: 
def binning(col, cut_points, labels=None): 
  #Definisci valori min e max: 
  minval = col.min() 
  maxval = col.max() 
  #crea una lista aggiungendo min e max a cut_points 
  break_points = [minval ] + cut_points + [maxval] 
  
  #se non vengono fornite etichette, usa le etichette predefinite 0 ... (n-1) 
  
  if not labels:
    labels = range(len(cut_points)+1)
    
  #Binning usando la funzione di taglio di panda 
  colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)
  return colBin
  
  
#Binning age: 
cut_points = [90,140,190]
labels = ["low","medium","high","very high"]
data["LoanAmount_Bin"] = binning(data["LoanAmount"], cut_points, labels)
print (pd.value_counts(data["LoanAmount_Bin"], sort=False))


Per saperne di più sulla funzione di taglio Pandas qui: Riferimento Pandas (taglio)

Manipolare Dataset con Python : Codifica dei dati categorici utilizzando Pandas

Spesso troviamo un caso in cui dobbiamo modificare le categorie di una variabile nominale. Ciò può essere dovuto a vari motivi:

  1. Alcuni algoritmi (come la regressione logistica) richiedono che tutti gli input siano numerici. Quindi le variabili nominali sono per lo più codificate come 0, 1….(n-1)

  2. A volte una categoria può essere rappresentata in 2 modi. Ad esempio, la temperatura potrebbe essere registrata come “Alta”, “Media”, “Bassa”, “H”, “bassa”. Qui, sia "Alto" che "H" si riferiscono alla stessa categoria. Allo stesso modo, in "Basso" e "basso" c'è solo una differenza di maiuscolo. Ma Python li leggerebbe come livelli diversi.

  3. Alcune categorie potrebbero avere frequenze molto basse ed è generalmente una buona idea combinarle.

Qui ho definito una funzione generica che accetta input come dizionario e codifica i valori usando la funzione "sostituisci" in Pandas.

#Definisci una funzione generica usando Pandas sostituisci la funzione 
def coding(col, codeDict):
  colCoded = pd.Series(col, copy=True)
  for key, value in codeDict.items():
    colCoded.replace(key, value, inplace=True)
  return colCoded
  
# LoanStatus come Y=1, N=0: 

print 'Prima:' 
print pd.value_counts(data["Loan_Status"]) 
data["Loan_Status_Coded"] = coding(data["Loan_Status"], {'N':0,'Y':1}) 
print ('\nDopo la codifica:' )
print (pd.value_counts(data["Loan_Status_Coded"]))


Maggiori informazioni sulla funzione di sostituzione di Panda qui: Riferimento Panda (sostituire)

Note finali

In questo articolo, abbiamo trattato varie funzioni di Pandas che possono semplificarci la vita mentre eseguiamo l'esplorazione dei dati e l'ingegneria delle funzionalità. Inoltre, abbiamo definito alcune funzioni generiche che possono essere riutilizzate per raggiungere obiettivi simili su diversi dataset.


Grazie per la lettura condividi l'articolo


Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis