Você pode usar o swifter
pacote:
pip install swifter
Ele funciona como um plugin para o pandas, permitindo que você reutilize a apply
função:
import swifter
def some_function(data):
return data * 10
data['out'] = data['in'].swifter.apply(some_function)
Ele descobrirá automaticamente a maneira mais eficiente de paralelizar a função, não importa se ela é vetorizada (como no exemplo acima) ou não.
Mais exemplos e uma comparação de desempenho estão disponíveis no GitHub. Observe que o pacote está em desenvolvimento ativo, então a API pode mudar.
Observe também que isso não funcionará automaticamente para colunas de string. Ao usar cordas, Swifter voltará a ser um Pandas “simples” apply
, que não será paralelo. Nesse caso, mesmo forçá-lo a usar dask
não criará melhorias de desempenho, e seria melhor apenas dividir o conjunto de dados manualmente e paralelizar usandomultiprocessing
.
allow_dask_on_strings(enable=True)
assim:df.swifter.allow_dask_on_strings(enable=True).apply(some_function)
Fonte: github.com/jmcarpenter2/swifter/issues/45A maneira mais simples é usar map_partitions do Dask . Você precisa dessas importações (você precisará
pip install dask
):e a sintaxe é
(Eu acredito que 30 é um número adequado de partições se você tiver 16 núcleos). Apenas para completar, eu cronometrei a diferença na minha máquina (16 núcleos):
Dando um fator de 10 speedup indo de pandas aplicar para dask aplicar em partições. Claro, se você tem uma função que pode vetorizar, você deve - neste caso, a função (
y*(x**2+1)
) é trivialmente vetorizada, mas há muitas coisas que são impossíveis de vetorizar.fonte
The get= keyword has been deprecated. Please use the scheduler= keyword instead with the name of the desired scheduler like 'threads' or 'processes'
ValueError: cannot reindex from a duplicate axis
. Para contornar isso, você deve remover índices duplicados pordf = df[~df.index.duplicated()]
ou redefinir seus índices pordf.reset_index(inplace=True)
.você pode tentar em
pandarallel
vez disso: Uma ferramenta simples e eficiente para paralelizar suas operações do pandas em todas as suas CPUs (no Linux e macOS)consulte https://github.com/nalepae/pandarallel
fonte
Se você deseja permanecer no python nativo:
aplicará a função
f
em paralelo à colunacol
do dataframedf
fonte
ValueError: Length of values does not match length of index
de__setitem__
inpandas/core/frame.py
. Não tenho certeza se fiz algo errado ou se atribuir adf['newcol']
não é thread-safe.Aqui está um exemplo de transformador de base sklearn, no qual os pandas se aplicam é paralelizado
para obter mais informações, consulte https://towardsdatascience.com/4-easy-steps-to-improve-your-machine-learning-code-performance-88a0b0eeffa8
fonte