Accelerare le manipolazioni di stringhe in Pandas

Accelerare manipolazioni stringhe in Pandas

Questo tutorial si concentra sull’accelerazione delle manipolazioni di stringhe.

Mi sono annoiato e ho deciso di testare i metodi di manipolazione delle stringhe e come influenzano le prestazioni di un dataframe di pandas. Come è ben noto, i dataframe di Pandas si comportano in modo strano una volta che superano un certo limite. Dipende principalmente dalla pressione della memoria e anche da alcuni sovraccarichi quando gli elementi di diverse righe devono essere manipolati contemporaneamente.

Quindi, ecco l’esperimento.

Ho creato un dataframe utilizzando Faker. I dati di base sono dati falsi di 100.000 righe.

Setup

!pip install faker

import pandas as pdimport numpy as npdef gen_data(x):  from faker import Faker  fake = Faker()  outdata = {}  for i in range(0,x):    outdata[i] = fake.profile()  return pd.DataFrame(outdata).Tn= 100000basedata = gen_data(n)

Ho salvato l’output su Google Drive mappandolo su Google Colab

from google.colab import drivedrive.mount('/content/drive')

Ho creato delle funzioni molto semplici per testare vari modi di concatenare 2 stringhe.

def process(a,b):  return ''.join([a,b])def process(a,b):  return a+bdef process(a,b):  return f"{a}{b}"def process(a,b):  return f"{a}{b}"*100

Poi ho deciso di creare un dataframe vuoto e ho scritto una funzione per aggiungere un output di %%timeit come riga al dataframe

# aggiungi una riga al dataframe utilizzando l'output di %%timeitdef add_to_df(n, m, x, outputdf):  outputdf.loc[len(outputdf.index)] = [m, n, x]# dataframe di outputoutputdf = pd.DataFrame(columns=['method', 'n', 'timing'])outputdf

Ecco un esempio del codice per eseguire ogni funzione ed esportare i dati in un dataframe di pandas.

# ottieni un campione dei datan = 10000suffix = 'fstring_100x'data = basedata.copy().sample(n).reset_index()

%%timeit -r 7 -n 1 -odata['newcol'] = ''for row in range(len(data)):  data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])# 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>

m = "Iterating over the rows"add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)

Esperimento