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