Vous pouvez utiliser le swifter
package:
pip install swifter
Il fonctionne comme un plugin pour les pandas, vous permettant de réutiliser la apply
fonction:
import swifter
def some_function(data):
return data * 10
data['out'] = data['in'].swifter.apply(some_function)
Il trouvera automatiquement le moyen le plus efficace de paralléliser la fonction, qu'elle soit vectorisée (comme dans l'exemple ci-dessus) ou non.
Plus d'exemples et une comparaison des performances sont disponibles sur GitHub. Notez que le package est en cours de développement actif, donc l'API peut changer.
Notez également que cela ne fonctionnera pas automatiquement pour les colonnes de chaîne. Lors de l'utilisation de chaînes, Swifter se repliera sur un Pandas «simple» apply
, qui ne sera pas parallèle. Dans ce cas, même le forcer à l'utiliser dask
ne créera pas d'améliorations des performances, et vous feriez mieux de simplement diviser votre ensemble de données manuellement et paralléliser à l'aide demultiprocessing
.
allow_dask_on_strings(enable=True)
comme ceci:df.swifter.allow_dask_on_strings(enable=True).apply(some_function)
Source: github.com/jmcarpenter2/swifter/issues/45Le moyen le plus simple est d'utiliser les map_partitions de Dask . Vous avez besoin de ces importations (vous en aurez besoin
pip install dask
):et la syntaxe est
(Je crois que 30 est un nombre approprié de partitions si vous avez 16 cœurs). Juste pour être complet, j'ai chronométré la différence sur ma machine (16 cœurs):
Donner un facteur 10 d'accélération depuis les pandas s'applique à dask s'applique aux partitions. Bien sûr, si vous avez une fonction que vous pouvez vectoriser, vous devriez - dans ce cas, la fonction (
y*(x**2+1)
) est trivialement vectorisée, mais il y a beaucoup de choses qui sont impossibles à vectoriser.la source
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
. Pour contourner cela, vous devez soit supprimer les index dupliquésdf = df[~df.index.duplicated()]
soit réinitialiser vos index pardf.reset_index(inplace=True)
.vous pouvez essayer à la
pandarallel
place: Un outil simple et efficace pour paralléliser vos opérations pandas sur tous vos processeurs (sous Linux et macOS)voir https://github.com/nalepae/pandarallel
la source
Si vous souhaitez rester en python natif:
appliquera la fonction
f
de manière parallèle à la colonnecol
du dataframedf
la source
ValueError: Length of values does not match length of index
de__setitem__
dedanspandas/core/frame.py
. Je ne sais pas si j'ai fait quelque chose de mal ou si l'attribution àdf['newcol']
n'est pas sûre pour les threads.Voici un exemple de transformateur de base sklearn, dans lequel les pandas s'appliquent est parallélisé
pour plus d'informations, voir https://towardsdatascience.com/4-easy-steps-to-improve-your-machine-learning-code-performance-88a0b0eeffa8
la source