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

  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