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
-- Declaration de mes fonctions
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
-- Creation de mon dataframe
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
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
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).
-- Calculs
Quintiles
QC1 respecte la structure de df et peut donc y être facilement intégré
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)
Regressions Simple
Pas de soucis pour intégrer le résultat à df en faisant un insert
Code : Sélectionner tout - Visualiser dans une fenêtre à part res_reg = Reg_func(newdf['C1'], newdf['C2'])
Je n'arrive pas à le faire avec la fonction regress j'ai systhématiquement des erreurs
Regressions par sous groupe 'Axe'
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 1 res_reg_group = (df.groupby('Axe').apply(lambda x: Reg_func(x['C1'], x['C2']))) print(res_reg_group)
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.
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)
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']mais j'ai aussi des erreurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part groupby(['Axe'])['C1', 'C2']
J'espère avoir été claire.
Merci d'avance
Partager