Lexpage un jour, Lexpage toujours    —  Guybrush

Discussions

Python : apprentissage, ide, etc

yaug 1471 Spammeur
Reprise automatique du message précédent.
Merci pour le _asdict() au fait.
ça fait le job
PetitCalgon 2672 Bob
C'est ici le bureau des chagrins pour râler sur Python? 😅
J'en fait depuis peu (janvier) mais je ne suis toujours pas conquis. C'est pratique pour réaliser un script ou deux, mais faire une application avec... pourquoi?
Mes griefs principaux:
- Typing décoratif et pas vérifié (on peut déclarer une variable d'un type dans une fonction et lui envoyer autre chose sans que ça râle)
- Style d'écriture pas intuitif, exemple au lieu de l'opérateur ternaire condition ? a : b, on a ça a if condition else b, c'est encore mieux avec les array, au lieu d'un array.filter(a => condition) on a un chose comme [a for a in array if condition]. Je trouve que ça casse le sens de lecture habituel de gauche vers la droite. Pareil quand d'une array on veut une propriété users.map(u => u.login), on va se retrouver avec [u.login for u in users] et si on rajoute un filtre users.filter(u => u.active).map(u => u.login), est-ce que ça marche: [u.login for u in users if u.active] ?
- Il manque plein de fonctions classique pour les array, un .find(x => condition)
- Les Panda Frame ça me gonfle! Déjà forcément faire un import pandas as pd... Ca commence bien. La fonction de filtre avec loc[...] m'énerve, si la frame est vide, ça me fait une key error, ça pourrait simplement dire: vide. Si pour une clef, la valeur est None, ça ne filtre plus sur cette clef, franchement...
- Comment je débugge ça dans VScode?
Guybrush 8428 Bob
PetitCalgonJ'en fait depuis peu (janvier) mais je ne suis toujours pas conquis. C'est pratique pour réaliser un script ou deux, mais faire une application avec... pourquoi?
Question d'habitude :-p
PetitCalgon- Typing décoratif et pas vérifié (on peut déclarer une variable d'un type dans une fonction et lui envoyer autre chose sans que ça râle)
Il n'est pas purement décoratif, tu peux utiliser des outils tels que mypy pour faire cette vérification. La plupart des IDE incluent aussi un type checker si tu fais usage du typing en Python. Perso, j'aime vraiment bien le coté "typage dynamique" avec la possibilité de pouvoir annoter certaines parties du code.
PetitCalgon- Style d'écriture pas intuitif, exemple au lieu de l'opérateur ternaire condition ? a : b, on a ça a if condition else b, c'est encore mieux avec les array, au lieu d'un array.filter(a => condition) on a un chose comme [a for a in array if condition]. Je trouve que ça casse le sens de lecture habituel de gauche vers la droite. Pareil quand d'une array on veut une propriété users.map(u => u.login), on va se retrouver avec [u.login for u in users] et si on rajoute un filtre users.filter(u => u.active).map(u => u.login), est-ce que ça marche: [u.login for u in users if u.active] ?
Je préfère le ternaire de Python, plus lisible à mon goût que condition ? a: b. Pour les "array", je ne comprends pas bien pourquoi tu passes par des compréhensions de liste pour faire ça. Tu peux très bien utiliser la fonction filter(condition, iterable) ou map(function, iterable), et utiliser des lambda à la place de condition ou function si c'est du one-shot. Pour la question posée en fin de quote, oui, on peut combiner ce qu'on veut dans une compréhension : [f(x) for x in mylist if condition(x).
PetitCalgon- Il manque plein de fonctions classique pour les array, un .find(x => condition)
Une boucle fait l'affaire :-) Il y a des "astuces" à base de next mais je trouve que ça rend le code moins lisible. Le module itertools contient aussi quelques éléments supplémentaires pratiques à avoir sous la main si on travaille beaucoup avec les itérateurs. (docs.python.org/3/librar…)
PetitCalgon- Les Panda Frame ça me gonfle! Déjà forcément faire un import pandas as pd... Ca commence bien. La fonction de filtre avec loc[...] m'énerve, si la frame est vide, ça me fait une key error, ça pourrait simplement dire: vide. Si pour une clef, la valeur est None, ça ne filtre plus sur cette clef, franchement...
Si tu veux juste récupérer une seule ligne, loc est ton ami, mais il s'attend à recevoir la valeur de quelque chose dans ton index donc pas None. Si c'est pour faire une slice de ton dataframe, tu as df[condition] ou df.query(...) ou... Pandas est une chouette librairie, mais pas facile de s'y retrouver au début, et j'invite toujours mes étudiants à lire l'ensemble de la documentation au moins une fois, juste pour se faire une idée de tout ce qu'il y a. Souvent, on utilise pas la bonne solution juste parce qu'on était pas au courant qu'il existait cette possibilité. C'est rarement un problème lié à la librairie, mais plutôt de conception du problème (on se pose la mauvaise question, donc on adopte la mauvaise approche). Ici j'ai l'impression que c'est pas vraiment loc que tu cherches à utiliser :-)
PetitCalgon- Comment je débugge ça dans VScode?
Juste en installant l'extension Python pour vscode (je me demande si elle est pas déjà intégrée par défaut) et en utilisant le débuggueur intégré. Evidemment, si tu utilises pandas, il est probable que tu utilises des notebooks dans vscode. Dans ce cas, la manoeuvre est peut-être légèrement différente, j'utilise pas vscode pour mes notebooks (j'utilise jupyter lab) donc je peux pas aider, mais je suis sûr d'avoir déjà vu du support pour débugguer des "cells" de notebooks dans vscode.
Guybrush 8428 Bob
Une excellente ressource pour aborder pandas :

betterprogramming.pub/pa…
PetitCalgon 2672 Bob
Merci, je pense que comme dans la plupart des cas, il me manquait l'existence de certaines fonctions.

Par contre, ce qui est rigolo et pratique, c'est les paramètres nommés qu'on peut mettre dans l'ordre que l'on veut.
Guybrush 8428 Bob
PetitCalgonMerci, je pense que comme dans la plupart des cas, il me manquait l'existence de certaines fonctions.
Avec pandas, c'est malheureusement souvent le cas. La librairie est titanesque en matière de fonctionnalités, et c'est difficile de chercher précisément quelque chose dans la documentation. Le "User guide" est pas mal pour ça, car il couvre une grosse partie de ce qu'on peut faire avec pandas, et juste "savoir que ça existe même si on a pas retenu le nom de la fonction" est déjà un très gros premier pas dans la bonne direction :-)

En terme d'apprentissage, il faut considérer pandas comme un langage à part entière, pratiquement. C'est une sorte de "matlab en Python", ce n'est pas surprenant :-)
PetitCalgonPar contre, ce qui est rigolo et pratique, c'est les paramètres nommés qu'on peut mettre dans l'ordre que l'on veut.
On peut même stocker les paramètres dans un dictionnaire, et puis les réutiliser lors des appels :
>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> f(**d)
... correspond à appeler f(x=1, y=2, z=3).
Guybrush 8428 Bob
Cela dit, si tu as des questions à propos de python ou pandas, hésite pas :-)
PetitCalgon 2672 Bob
Alors en fait, j'ai l'impression que .iloc[] ne supporte pas quand on met une lambda avec un and dedans.
Ne marche pas:
results = frame.iloc[lambda u:u["id"] == "xyz" and u["name"] == "abc"]
Si on fait
results = frame.iloc[lambda u:u["id"] == "xyz"]
results = results.iloc[lambda u:u["name"] == "abc"]
bizarrement ça marche (avec un test au milieu que len(results)>0)

Après j'utilise des lambdas parce que j'en ai l'habitude avec C#/Javascript, il y a peut-être plus simple.

J'ai généralement des dataframe simples avec une liste d'objets (genre des lignes d'une table de base de données quelconque: utilisateurs, rôles, etc.)


Ce message a été modifié 1 fois. Dernière modification : 18 juillet 2023 à 17:37 par PetitCalgon.

Guybrush 8428 Bob
Les opérateurs and, or, not ne fonctionnent que dans un contexte Booléen. Je ne sais pas pourquoi Python ne permet pas de les surcharger, mais du coup, la seule alternative pour une librairie qui souhaite fournir des opérations Booléennes sur d'autres structures consiste à surcharger les opérateurs bitwise &, |, ~. Ce sont ceux-là qu'il faut utiliser.

Pour ton premier exemple, u["id"] == "xyz" et u["name"] == "abc" retournent chacun un tableau de Booléens, et Python ne sait pas quoi faire avec and pour ces tableaux. Si tu remplaces and par & (et que tu mets des parenthèses autour de chaque expression, car la priorité des opérateurs est différente) ça ira.
PetitCalgon 2672 Bob
Sérieusement? 😐
Je pensais que la lambda serait appliquée à chaque ligne et pourquoi pas ferait un tableau de booléens pour appliquer les filtres.
Je n'aurai jamais pensé à ça.
Merci.
Je testerai demain.

Répondre

Vous devez être inscrit et identifié.