Neste artigo, falarei sobre seis ferramentas que podem acelerar significativamente o código do seu panda. Montei as ferramentas de acordo com um princípio - facilidade de integração à base de código existente. Para a maioria das ferramentas, você só precisa instalar o módulo e adicionar algumas linhas de código.![](https://habrastorage.org/webt/bp/ql/vl/bpqlvld5mt7alw811moxql4-ynw.jpeg)
Pandas API, , . , , , .
, Spark DataFlow. :
1:
- Numba
- Multiprocessing
- Pandarallel
Numba
Python. Numba — JIT , , Numpy, Pandas. , .
— , - apply
.
import numpy as np
import numba
df = pd.DataFrame(np.random.randint(0,100,size=(100000, 4)),columns=['a', 'b', 'c', 'd'])
def multiply(x):
return x * 5
@numba.vectorize
def multiply_numba(x):
return x * 5
, . . .
In [1]: %timeit df['new_col'] = df['a'].apply(multiply)
23.9 ms ± 1.93 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [2]: %timeit df['new_col'] = df['a'] * 5
545 µs ± 21.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [3]: %timeit df['new_col'] = multiply_numba(df['a'].to_numpy())
329 µs ± 2.37 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
~70 ! , , Pandas , . :
def square_mean(row):
row = np.power(row, 2)
return np.mean(row)
@numba.njit
def square_mean_numba(arr):
res = np.empty(arr.shape[0])
arr = np.power(arr, 2)
for i in range(arr.shape[0]):
res[i] = np.mean(arr[i])
return res
:
![](https://habrastorage.org/webt/b4/6j/ce/b46jceir92z4gfzgmwu3tzymz9u.png)
Multiprocessing
, , , . - , python.
. . , apply
:
df = pd.read_csv('abcnews-date-text.csv', header=0)
df = pd.concat([df] * 10)
df.head()
def mean_word_len(line):
for i in range(6):
words = [len(i) for i in line.split()]
res = sum(words) / len(words)
return res
def compute_avg_word(df):
return df['headline_text'].apply(mean_word_len)
:
from multiprocessing import Pool
n_cores = 4
pool = Pool(n_cores)
def apply_parallel(df, func):
df_split = np.array_split(df, n_cores)
df = pd.concat(pool.map(func, df_split))
return df
:
![](https://habrastorage.org/webt/b2/hp/i9/b2hpi92uzfkjplpk3jmhn0idoec.png)
Pandarallel
Pandarallel — pandas, . , , + progress bar ;) , pandarallel.
![](https://habrastorage.org/webt/mt/lx/_0/mtlx_0sw_2evt6c65ca5cwiqbdo.gif)
. , . pandarallel — :
from pandarallel import pandarallel
pandarallel.initialize()
, — apply
parallel_aply
:
df['headline_text'].parallel_apply(mean_word_len)
:
![](https://habrastorage.org/webt/ja/4d/rq/ja4drqjcr5_dzj2_6sc5lhxy6fq.png)
- overhead 0.5 .
parallel_apply
, . 1 , , . - , , , 2-3 .
- Pandarallel
parallel_apply
(groupby
), .
, , . / , API progress bar.
To be continued
Nesta parte, vimos duas abordagens bastante simples para otimização de pandas - usando compilação jit e paralelização de tarefas. Na próxima parte , falarei sobre ferramentas mais interessantes e complexas, mas, por enquanto, sugiro que você teste as ferramentas para garantir que elas sejam eficazes.![imagem](https://habrastorage.org/getpro/habr/post_images/8a4/493/9cb/8a44939cb09d76c1fd2df6bd3105f6f6.gif)
PS: Confie, mas verifique - todo o código usado no artigo (benchmarks e gráficos), postei no github