1
votes

Calculer la variance pour chaque élément de l'échantillon séparément

J'avais DF avec le nom de l'attraction, la date et le montant du trajet.

    rides           var
0   circuit         16200.0
1   roller coaster  32768.0
2   car             28272.0
3   train           2048.0

Je peux calculer cela manuellement, mais mon dataframe contient plus de 1000 lignes et plus de 30 parcours différents.

Dans l'exemple, cela ressemble à ceci

print(attr.loc[attr['rides'] == 'circuit']['ride_sum'].var(),
      attr.loc[attr['rides'] == 'roller coaster']['ride_sum'].var(),
      attr.loc[attr['rides'] == 'car']['ride_sum'].var(),
      attr.loc[attr['rides'] == 'train']['ride_sum'].var())

16200.0 32768.0 28272.0 2048.0

Je souhaite obtenir une trame de données avec une variation pour chaque trajet qui ressemble à ceci

import pandas as pd

attr = pd.DataFrame(
    {'rides':['circuit','circuit',
              'roller coaster', 'roller coaster',
              'car', 'car', 'car',
              'train', 'train'],
    'date':['2019-06-22', '2019-06-23',
            '2019-06-29', '2019-07-06',
            '2019-09-01', '2019-09-07', '2019-09-08',
            '2019-09-14', '2019-09-15'],
    'ride_sum':[663, 483,
                858, 602,
                326, 2, 86,
                70, 134]})

    rides           date        ride_sum
0   circuit         2019-06-22  663
1   circuit         2019-06-23  483
2   roller coaster  2019-06-29  858
3   roller coaster  2019-07-06  602
4   car             2019-09-01  326
5   car             2019-09-07  2
6   car             2019-09-08  86
7   train           2019-09-14  70
8   train           2019-09-15  134


0 commentaires

3 Réponses :


3
votes

Essayez groupby avec var() comme ceci:

attr.groupby("rides").var().reset_index()


rides   ride_sum
0   car 28272
1   circuit 16200
2   roller coaster  32768
3   train   2048

( reset_index() n'est pas forcément nécessaire)


2 commentaires

Merci! Comment puis-je faire cela pour kurtosis? si j'essaye de le remplacer, j'obtiens l'objet 'DataFrameGroupBy' sans attribut 'kurtosis'


Pour kurtosis voir la réponse éditée de @Serge de Gosson de Varennes. En plus de cela, vous pouvez utiliser scipy.stats.kurtosis dans la méthode apply .



2
votes

Faites ceci:

attr.groupby(attr.rides).apply(pd.DataFrame.kurt).reset_index()

ÉDITER:

Pour le kurtosis, il n'y a pas d'agrégat. Vous devez faire ceci:

attr.groupby(attr.rides).agg(["var"]).reset_index()

Avec votre exemple, il y a moins de trois valeurs par groupe, donc il retournera NaN .


1 commentaires

Merci! Comment puis-je faire cela pour kurtosis? si j'essaye de le remplacer, j'obtiens «l'objet SeriesGroupBy» n'a pas d'attribut «kurtosis»



0
votes

Utilisez la fonction unique dans les pandas pour faire des manèges uniques et appliquez une boucle pour prendre var Exemple:

unique_rides = unique(attr['rides'])

for ride in unque_rides:
    print(attr.loc[attr['rides'] == ride]['ride_sum'].var())

Merci


1 commentaires

Merci! Comment puis-je obtenir les résultats dans le dict?