Les fonctions de fenêtre calculent des agrégations sur les partitions d'un DataFrame tout en préservant la structure initiale des lignes. Contrairement aux agrégations groupby qui réduisent chaque groupe à une seule ligne récapitulative, les fonctions de fenêtre renvoient un résultat pour chaque ligne d'entrée. Elles constituent l'outil idéal pour établir des classements, calculer des totaux cumulés et rechercher des décalages entre les lignes.
L'API PyODPS DataFrame prend en charge les fonctions de fenêtre via groupby combiné avec mutate ou la sélection de colonnes.
Exemples d'utilisation
Les exemples ci-dessous utilisent la table pyodps_iris. Pour plus de détails sur le jeu de données, consultez la rubrique Utiliser DataFrame pour traiter des données.
Regrouper par nom et appliquer des fonctions de fenêtre avec mutate
La méthode mutate applique les fonctions de fenêtre à chaque groupe et renvoie un DataFrame contenant le même nombre de lignes que l'original. L'exemple suivant regroupe les données par name et calcule une somme cumulative ainsi qu'un numéro de ligne au sein de chaque groupe.
iris = DataFrame(o.get_table('pyodps_iris'))
grouped = iris.groupby('name')
print(grouped.mutate(grouped.sepallength.cumsum(), grouped.sort('sepallength').row_number()).head(10))
Sortie :
name sepallength_sum row_number
0 Iris-setosa 250.3 1
1 Iris-setosa 250.3 2
2 Iris-setosa 250.3 3
3 Iris-setosa 250.3 4
4 Iris-setosa 250.3 5
5 Iris-setosa 250.3 6
6 Iris-setosa 250.3 7
7 Iris-setosa 250.3 8
8 Iris-setosa 250.3 9
9 Iris-setosa 250.3 10
Sélectionner des colonnes à l'aide d'une fonction de fenêtre
Transmettez directement une expression de fonction de fenêtre en tant que colonne dans une sélection pour ajouter des colonnes calculées aux côtés des colonnes existantes.
iris = DataFrame(o.get_table('pyodps_iris'))
print(iris['name', 'sepallength', iris.groupby('name').sort('sepallength').sepallength.cumcount()].head(5))
Sortie :
name sepallength sepallength_count
0 Iris-setosa 4.3 1
1 Iris-setosa 4.4 2
2 Iris-setosa 4.4 3
3 Iris-setosa 4.4 4
4 Iris-setosa 4.5 5
Agrégation par scalaire
Le regroupement par Scalar(1) considère l'intégralité du DataFrame comme un seul groupe, appliquant ainsi la fonction de fenêtre de manière globale. La logique de traitement est identique à celle de l'agrégation basée sur les groupes.
from odps.df import Scalar
iris = DataFrame(o.get_table('pyodps_iris'))
iris.groupby(Scalar(1)).sort('sepallength').sepallength.cumcount()
Fonctions de fenêtre prises en charge
Fonctions de classement
|
Fonction |
Description |
|
|
Renvoie le rang d'une ligne au sein de son groupe. Les lignes ayant des valeurs égales reçoivent le même rang, ce qui crée des trous dans la séquence. |
|
|
Renvoie le rang dense d'une ligne au sein de son groupe. Les valeurs égales reçoivent le même rang sans créer de trous. |
|
|
Renvoie le rang relatif d'une ligne au sein de son groupe. |
|
|
Renvoie le numéro séquentiel de la ligne au sein du groupe, en commençant par 1. |
Fonctions analytiques
|
Fonction |
Description |
|
|
Renvoie la valeur de la ligne située |
|
|
Renvoie la valeur de la ligne située |
|
|
Renvoie la Nième valeur au sein du groupe. |
|
|
Renvoie la proportion de lignes du groupe dont les valeurs sont inférieures ou égales à la valeur de la ligne actuelle. |
|
|
Divise le groupe en N intervalles selon la séquence de données et renvoie le numéro d'intervalle pour chaque ligne. Si les données ne peuvent pas être distribuées uniformément, les lignes supplémentaires sont placées dans le premier intervalle par défaut. |
Fonctions cumulatives
|
Fonction |
Description |
|
|
Calcule la somme cumulative au sein de chaque groupe. |
|
|
Calcule la moyenne cumulative au sein de chaque groupe. |
|
|
Calcule la médiane cumulative au sein de chaque groupe. |
|
|
Calcule l'écart type cumulé au sein de chaque groupe. |
|
|
Calcule le maximum cumulé au sein de chaque groupe. |
|
|
Calcule le minimum cumulé au sein de chaque groupe. |
|
|
Calcule le nombre cumulé d'éléments au sein de chaque groupe. |
Paramètres
Fonctions de classement
Les fonctions rank, dense_rank, percent_rank et row_number acceptent les paramètres suivants.
|
Paramètre |
Valeur par défaut |
Description |
|
|
|
Colonne utilisée pour le tri au sein du groupe. |
|
|
|
Ordre de tri. Définissez sur |
lag et lead
En plus des paramètres des fonctions de classement, lag et lead acceptent :
|
Paramètre |
Valeur par défaut |
Description |
|
|
— |
Nombre de lignes avant (pour |
|
|
— |
Valeur à renvoyer lorsque la ligne cible n'existe pas (par exemple, lors d'une recherche avant la première ligne ou après la dernière). |
Fonctions cumulatives
En plus des paramètres des fonctions de classement, cumsum, cummean, cummedian, cumstd, cummax, cummin et cumcount acceptent :
|
Paramètre |
Valeur par défaut |
Description |
|
|
|
Définissez sur |
|
|
— |
Début du cadre de la fenêtre (nombre de lignes précédentes à inclure). |
|
|
— |
Fin du cadre de la fenêtre (nombre de lignes suivantes à inclure). |