Eu tenho um programa de modelagem e pontuação que faz uso pesado da DataFrame.isin
função dos pandas, pesquisando nas listas de registros "like" do Facebook de usuários individuais para cada um dos milhares de páginas específicas. Essa é a parte que consome mais tempo do programa, mais do que as peças de modelagem ou pontuação, simplesmente porque é executada apenas em um núcleo, enquanto o restante é executado em algumas dezenas simultaneamente.
Embora eu saiba que poderia dividir manualmente o quadro de dados em partes e executar a operação em paralelo, existe alguma maneira direta de fazer isso automaticamente? Em outras palavras, existe algum tipo de pacote que reconheça que eu estou executando uma operação facilmente delegada e a distribua automaticamente? Talvez isso seja pedir demais, mas eu já fiquei bastante surpreso com o que já está disponível no Python, então acho que vale a pena perguntar.
Qualquer outra sugestão sobre como isso pode ser feito (mesmo que não seja por algum pacote mágico de unicórnio!) Também seria apreciada. Principalmente, apenas tentando encontrar uma maneira de economizar 15 a 20 minutos por execução sem gastar uma quantidade igual de tempo codificando a solução.
fonte
Respostas:
Infelizmente, a paralelização ainda não está implementada nos pandas. Você pode ingressar nesta questão do github se quiser participar do desenvolvimento desse recurso.
Como não conheço nenhum "pacote unicórnio mágico" para esse propósito, a melhor coisa será escrever sua própria solução. Mas se você ainda não quer gastar tempo com isso e quer aprender algo novo - pode experimentar os dois métodos incorporados ao MongoDB (estrutura de redução e agg de mapa). Consulte mongodb_agg_framework .
fonte
Eu acho que sua melhor aposta seria rosetta . Estou achando extremamente útil e fácil. Verifique seus métodos de pandas .
Você pode obtê-lo por pip .
fonte
Existe uma
dask
biblioteca útil para trabalhos paralelos numpy / pandasLink: https://github.com/blaze/dask
fonte
Existe uma versão mais comum dessa pergunta em relação à paralelização em função de aplicação de pandas - portanto, essa é uma pergunta refrescante :)
Primeiro , quero mencionar mais rapidamente, já que você pediu uma solução "empacotada", e ela aparece na maioria das questões relacionadas à paralelização de pandas.
Mas .. ainda gostaria de compartilhar meu código de essência pessoal, pois depois de vários anos trabalhando com o DataFrame, nunca encontrei uma solução 100% de paralelização (principalmente para a função de aplicação) e sempre tive que voltar para o meu " código manual ".
Graças a você, tornei mais genérico o suporte a qualquer método DataFrame (teoricamente) por seu nome (para que você não precise manter as versões de isin, apply, etc.).
Eu testei nas funções "isin", "apply" e "isna" usando o python 2.7 e 3.6. São menos de 20 linhas, e eu segui a convenção de nomes de pandas como "subconjunto" e "njobs".
Eu também adicionei uma comparação de tempo com o código equivalente dask para "isin" e parece ~ X2 vezes mais lento que essa essência.
Inclui 2 funções:
df_multi_core - este é o que você chama. Aceita:
_df_split - esta é uma função auxiliar interna que deve ser posicionada globalmente para o módulo em execução (Pool.map é "dependente do posicionamento"), caso contrário, eu a localizaria internamente.
aqui está o código da minha essência (vou adicionar mais testes de função de pandas lá):
Abaixo está um código de teste para um isin paralelo , comparando o desempenho nativo, de múltiplos núcleos e dask. Em uma máquina I7 com 8 núcleos físicos, obtive cerca de 4 vezes mais velocidade. Eu adoraria ouvir o que você obtém em seus dados reais!
fonte
isin
- parece que o snippet de código é mais eficaz com 'isin' - ~ X1.75 vezes mais rápido que o dask (comparado com aapply
função que ficou 5% mais rápida que o dask)