IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Groupby sur dataframe panda + calculs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste Quantitatif / Ingénieur Financier
    Inscrit en
    Janvier 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste Quantitatif / Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 163
    Par défaut Groupby sur dataframe panda + calculs
    Bonjour,

    Je tiens à préciser que je commence à coder en Python et suis donc en mode "perroquet" pour trouver des solutions à mes problèmes. Je trouve un bout de code sur le net et essaye de l'adapter à mon besoin, alors désoler d'avance si les réponses à mes questions sont triviales.

    Voilà sur quoi je bloque depuis 2jr.

    J'arrive à calculer une regression linéaire entre 2 séries contenus dans un dataframe et à mettre le résultat dans une nouvelle colonne du dataframe par contre je n'arrive pas à le faire sur des sous group de ce dataframe. J'ai réussi le calcul de quintiles en sous groupe puis intégration au dataframe mais pas la regression. Je suppose que mon pb vient de mon manque de maîtrise des objets python et de leur manipulation.

    -- Package
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import pandas as pd
    from collections import OrderedDict
    import statsmodels.api as sm
    import numpy as np
    from sklearn.linear_model import LinearRegression
    -- Declaration de mes fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    def regress(data, yvar, xvars):
        Y = data[yvar]
        X = data[xvars]
        X['intercept'] = 1.
        result = sm.OLS(Y, X).fit()
        y_pred = result.predict()
        residual = Y - y_pred
        return residual    
     
    def Reg_func(x,y):
        # Cross Sectional Regression
        x = np.array(x).reshape((-1,1))
        y = np.array(y)
        model = LinearRegression().fit(x, y)
        y_pred = model.intercept_ + np.sum(model.coef_ * x,axis=1)
        residual = y - y_pred
     
        return residual
    -- Creation de mon dataframe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ind = ['I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8', 'I9', 'I10', 'I11', 'I12', 'I13', 'I14', 'I15', 'I16', 'I17', 'I18', 'I19', 'I20']
    Axe = ['A', 'A', 'B', 'A', 'A', 'A', 'A', 'B', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'B', 'B', 'B', 'B', 'B']
    df = pd.DataFrame(np.random.randn(20, 2), index = ind, columns=['C1', 'C2'])
    df.insert(0,'Axe',Axe)
    Si vous avez une manière plus simple de le créer je suis preneur, j'ai essayé plein de choses mais sans succés .

    -- Calculs

    Quintiles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    # Quintile groupé par Axe
    QC1 = df.groupby(['Axe'])['C1'].apply(lambda x: pd.qcut(x, 5, labels=False)+1) 
    print(QC1)
    QC1 respecte la structure de df et peut donc y être facilement intégré

    Regressions Simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res_reg = Reg_func(newdf['C1'], newdf['C2'])
    Pas de soucis pour intégrer le résultat à df en faisant un insert

    Je n'arrive pas à le faire avec la fonction regress j'ai systhématiquement des erreurs

    Regressions par sous groupe 'Axe'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Regression par axes 1
    res_reg_group = (df.groupby('Axe').apply(lambda x: Reg_func(x['C1'], x['C2'])))
    print(res_reg_group)
    Je ne vois pas comment récupérer mes data pour les intégrer à df vu la structure de l'objet res_reg_group

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Regression par axes avec fonction regress
    res_reg_SN3 = df.groupby('Axe').apply(regress, 'C1', ['C2'])
    print(res_reg_SN3)
    Problème avec cette fonction c'est que je n'arrive pas à l'utiliser pour une regression simple et que je ne suis pas sur de réussir à intégrer les resultats à df.

    Comme la manière de faire sur les quintiles permet de garder la structure, je suppose que c'est grâce à , j'ai essayé de répliquer avec mes 2 focntions de regressions en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    groupby(['Axe'])['C1', 'C2']
    mais j'ai aussi des erreurs.

    J'espère avoir été claire.

    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Analyste Quantitatif / Ingénieur Financier
    Inscrit en
    Janvier 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Analyste Quantitatif / Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 163
    Par défaut
    Bonsoir,

    J'ai trouvé une solution avec la 1 ère fonction REg_Func() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    res_reg_group = (df.groupby('Axe').apply(lambda x: Reg_func(x['C1'], x['C2'])))
    df.loc[df['Axe']=='A', 'res'] = res_reg_group['A']
    df.loc[df['Axe']=='B', 'res'] = res_reg_group['B']
    Celà me permet de merger le résultat dans le dataframe de départ. C'est pas génial mais bon ça marche .

    J'aimerais quand même savoir si il est possible de faire la même méthode que pour le calcul de quintiles. Un truc du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QC1 = df.groupby(['Axe'])['C1', 'C2'].apply(lambda x: Reg_func(x['C1'], x['C2']))
    Cette méthode me permettrait de garder la structure du data frame de départ.

    Merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/11/2019, 19h06
  2. [Python 3.X] Effectuer une addition "par morceau" sur une DataFrame [pandas]
    Par Bram van Dam dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 17/07/2019, 05h55
  3. Réponses: 1
    Dernier message: 25/01/2019, 11h14
  4. Utilisation de "refresh" sur un champ calculé
    Par Nicko29 dans le forum Access
    Réponses: 27
    Dernier message: 22/12/2005, 22h58
  5. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo