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 fonctionsCode:
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 dataframeCode:
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:
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:
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 insertCode: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_groupCode:
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:
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 unCode:groupby(['Axe'])['C1']
mais j'ai aussi des erreurs.Code:groupby(['Axe'])['C1', 'C2']
J'espère avoir été claire.
Merci d'avance