2025.42 changes

This commit is contained in:
2025-10-24 22:29:15 +02:00
parent d0bcfcf8f1
commit e4579e4887
24 changed files with 699 additions and 352 deletions

View File

@@ -581,13 +581,13 @@ import pandas as pd
data = pd.Series(data=["matt", "jenn", "igor", "alex", "mila"])
# Ici on garde True si la valeur contient un "i" minuscule
filter_data1 = data.loc[data.str.contains("i")]
filter_data1 = data.loc[data.str.contains("i", regex=True)]
# Ici on garde True si la valeur contient un "i" (ignore la casse)
filter_data2_a = data.loc[data.str.contains("(?i)i")]
filter_data2_b = data.loc[data.str.contains("i", case=False)]
filter_data2_a = data.loc[data.str.contains("(?i)i", regex=True)]
filter_data2_b = data.loc[data.str.contains("i", case=False, regex=True)]
# Si vous connaissez les regex, le reste marche aussi :
# Ici reconnaître les chaînes où un caractère apparaît 2 fois de suite
filter_data3 = data.loc[data.str.contains(r"(\w)\1")]
filter_data3 = data.loc[data.str.contains(r"(\w)\1", regex=True)]
```
[Apprendre les Regex avec RegexLearn](https://regexlearn.com/fr)
@@ -739,6 +739,8 @@ data["hour"] = data.dt.round("H")
print(data)
```
[Fréquences disponibles pour l'arrondi](https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases)
----
### Dédupliquer des lignes
@@ -1182,7 +1184,7 @@ df = pd.DataFrame(data={
})
# Appliquer une fonction sur chaque colonne
df2 = df.apply(double, axis="columns")
df2 = df.apply(double, axis="index")
```
----
@@ -1365,6 +1367,25 @@ ses colonnes, mais uniquement à partir des deux lignes précédentes, ex.:
----
### Fonctions de partition : Comptage de lignes par groupe
Vous pouvez dans un DataFrame utiliser la méthode `.groupby()`{.python} pour scinder
son contenu en groupes possédant une valeur en commun.
En SQL, le résultat d'un `GROUP BY` doit généralement être suivi d'un calcul d'agrégation,
qui va calculer une valeur d'agrégation (somme, moyenne) pour chaque groupe.
Dans Pandas, la contrainte est généralement la même; on appliquera des méthodes
d'agrégation une fois les groupes créés.
Pandas offre également des fonctions de [fenêtrage]{.naming} sur le résultat :
Plutôt que d'obtenir un résultat seul pour chaque groupe, le partitionnement permet de conserver
les lignes de chaque groupe. Une des fonctions de partitionnement proposées est
`.cumcount()`{.python} : la méthode applique à chaque ligne une numérotation, qui
démarre à zéro pour chaque groupe distinct.
TODO: Groupby + cumcount (potentiellement un sort_values avant)
----
### Fonctions d'agrégation mobiles/glissantes
Si nous appliquons cette idée sur la colonne `minutes`, nous obtiendrons une colonne avec les valeurs suivantes:
@@ -1379,6 +1400,10 @@ runs = pd.DataFrame(data={
"minutes": [31, 47, 26, 52, 34, 22, 36, 15, 30],
})
# Calculer la nouvelle colonne
# Somme glissante utilisant 2 observations (premier argument)
# Pour faire une somme, il faut au minimum 0 observation, sinon le résultat est NaN (min_periods=0)
# L'argument `center=False`{.python} indique que la fenêtre est décalée vers le passé
# L'argument `closed="both"`{.python} indique que les deux bornes sont incluses dans le calcul
runs["3-day sum"] = runs["minutes"].rolling(2, min_periods=0, center=False, closed="both").sum()
```
@@ -1398,11 +1423,30 @@ runs = pd.DataFrame(data={
"minutes": [31, 47, 26, 52, 34, 22, 36, 15, 30],
})
# Calculer la nouvelle colonne
runs["total sum"] = runs["minutes"].expanding(min_periods=0).sum()
# La même chose peut être faite avec une somme roulante avec un grand nombre d'observations
runs["total sum+"] = runs["minutes"].rolling(len(runs), min_periods=0).sum()
runs["expanding mean"] = runs["minutes"].expanding(min_periods=0).mean()
# La même chose peut être faite avec une moyenne roulante (lissée) avec un grand nombre d'observations
runs["expanding mean+"] = runs["minutes"].rolling(len(runs), min_periods=0).mean()
```
Les méthodes `runs.rolling`{.python} et `runs.expanding`{.python} peuvent être précédées d'un
`.groupby()`{.python} et d'un `.sort_values()`{.python} pour créer des groupes d'agrégation
et organiser les éléments dans chaque groupe.
----
## Astuces inoubliables
À l'usage, de nombreux cas empiriques déborderont des bases vues dans ce chapitre. Par exemple, certains
comportements sont difficiles à comprendre, ou certains usages nécessitent quelques ajustements pour la performance.
- **Warnings** concernant la modification sur une copie
- `pandas.DataFrame.apply()` très lent
----
### Warning : modifications sur une copie de slice
Lorsqu'un utilisateur utilise Pandas dans le cadre d'une recherche ou d'un traitement, il est fréquent de
vouloir filtrer les lignes d'un `DataFrame`, puis d'appliquer des modifications au contenu de ce dernier.