Bonjour à tous,
Je m'excuse par avance, ma question est sans doute un peu bête, mais je cache pas tourner en rond depuis un petit moment sur ce que j'essaye de faire^^ (je connais un peu python, mais je ne maîtrise pas encore bien le multiprocessing)
Grossièrement, voici ce que je souhaite faire : J'ai une dataframe df qui contient un certain nombre de colonnes, par exemple "A", "B" avec des valeurs préalablement remplies, et j'applique pour chaque ligne de la dataframe une fonction calc() qui vient remplir une colonne résultat.
Voici un exemple très largement simplifié de ma dataframe et du code qui s'applique dessus.
Dataframe de départ
Code (exemple simplifié)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 A B Resultat 0 54 99 1 23 31 2 15 12 3 7 65 4 85 2 5 36 15
Résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 def calc(x, y): return(x+y) for i in range(len(df.index)): df.at[i, "Resultat"] = calc(df.at[i, "A"], df.at[i, "B"])
Pour une approche séquencielle, je ne sais pas si c'est la meilleure façon de faire, probablement pas mais avec ma véritable fonction calc() ça marche bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 A B Resultat 0 54 99 153 1 23 31 54 2 15 12 27 3 7 65 72 4 85 2 87 5 36 15 51
Le souci, c'est que les calculs exécutés par ma vraie fonction calc() sont en réalité bien plus complexes (notamment elle inclue des calculs mathématiques plus long, et en fonction des données de la ligne traitée par la fonction, elle peut être amenée à aller lire ou écrire des fichiers, faire des requêtes, générer des graphiques, etc.).
Ainsi, j'aimerais que lorsque le programme traite une ligne, il puisse en traiter une autre en parallèle. (dans le code en exemple, j'ai bien conscience que ça serait inutile, car il serait probablement plus long de créer les processus pour chaque ligne que de faire le calcul sans parallélisation, mais encore une fois, dans la réalité les traitements de ma fonction sont bien plus conséquents). Dans mon cas, j'aimerais notamment que quand une ligne est en cours de traitement exécute une requête, ou lit/écrit un fichier, ou exécute une étape de calcul qui prends du temps, cela ne bloque pas complètement le script, et que les calculs des autres lignes puissent avancer indépendamment.
Savez-vous comment pourrais-je m'en sortir ? Il y-a-t'il un moyen simple de faire ça ? Désolé par avance, j'ai tendance à penser qu'il y a certainement une solution simple mais je ne la trouve pas, ou alors que ma façon de vouloir faire est incorrecte, car jusqu'à maintenant je n'ai pas réussi à adapter les quelques exemples trouvés sur internet (notamment avec Pool de multiprocessing).
Par avance, merci pour votre aide !
Cordialement
Partager