La catégorisation des données et l'application de fonctions à chaque catégorie s'appellent agrégation ou transformation. Celles-ci sont considérées comme les parties les plus importantes du flux de travail d'analyse des données. pandas a une fonction puissante dans le calcul de groupe et peut être utilisé de manière intuitive.
Un article célèbre de Hadley Wickham, auteur de divers packages pour le langage R The Split-Apply-Combine Strategy for Data Analysis (PDF) Décrit le processus d'opération de groupe "combinaison-application-séparation". pandas adopte également ce modèle d'opération d'agrégation de groupe comme idée de base. Les données sont séparées par une ou plusieurs touches au début du processus, puis la fonction est appliquée à chaque groupe et le résultat de l'application de la fonction est combiné et stocké dans l'objet affichant le résultat.
J'ai essayé Obtenir des actions au Japon avec Ruby avant. Je voudrais essayer les pandas avec un exemple de manipulation des opérations de groupe sur les cours réels des actions en utilisant les données collectées.
Les variables regroupées par groupby dans les pandas sont des objets GroupBy. La méthode apply sépare les données en éléments qui facilitent le travail, applique une fonction à chaque objet, puis les combine.
#Relevez les cours des actions de plusieurs entreprises
#Données NTT
stock_9613 = pd.read_csv('stock_9613.csv',
parse_dates=True, index_col=0)
# DTS
stock_9682 = pd.read_csv('stock_9682.csv',
parse_dates=True, index_col=0)
#Fonds informatiques
stock_3626 = pd.read_csv('stock_3626.csv',
parse_dates=True, index_col=0)
# NSD
stock_9759 = pd.read_csv('stock_9759.csv',
parse_dates=True, index_col=0)
#Extraire les cours de clôture après 2010 dans une seule base de données
df = pd.DataFrame([
stock_9613.ix['2010-01-01':, 'le dernier prix'],
stock_9682.ix['2010-01-01':, 'le dernier prix'],
stock_3626.ix['2010-01-01':, 'le dernier prix'],
stock_9759.ix['2010-01-01':, 'le dernier prix']
], index=['Données NTT', 'DTS', 'Fonds informatiques', 'NSD']).T
#=>Données de date DTS IT e NSD
# (Omission)
# 2015-01-05 4530 2553 1811 1779
# 2015-01-06 4375 2476 1748 1755
# 2015-01-07 4300 2459 1748 1754
# 2015-01-08 4350 2481 1815 1775
# 2015-01-09 4330 2478 1805 1756
# 2015-01-13 4345 2480 1813 1766
# 2015-01-14 4260 2485 1809 1770
# 2015-01-15 4340 2473 1839 1790
# 2015-01-16 4295 2458 1821 1791
Les cours des actions de chaque société depuis 2010 ont été obtenus. Eh bien, il semble que les nombreuses sociétés listées ici collaborent souvent, mais quelle est la corrélation réelle sur le marché boursier? De là, je vais être un peu curieux et essayer de trouver le coefficient de corrélation annuel pour les données NTT.
#Trouvez la transition
rets = df.pct_change().dropna()
#Grouper par année
by_year = rets.groupby(lambda x: x.year)
#Définir une fonction anonyme qui calcule le coefficient de corrélation
vol_corr = lambda x: x.corrwith(x['Données NTT'])
#Appliquer des fonctions à des objets groupés
result1 = by_year.apply(vol_corr)
print(result1)
#=>Données NTT DTS IT Ho NSD
# 2010 1 0.346437 0.492006 0.443910
# 2011 1 0.485108 0.575495 0.619912
# 2012 1 0.261388 0.268531 0.212315
# 2013 1 0.277970 0.358796 0.408304
# 2014 1 0.381762 0.404376 0.385258
# 2015 1 0.631186 0.799621 0.770759
Visualisons-le avec matplotlib.
Vous pouvez également utiliser la méthode apply pour rechercher la corrélation entre les colonnes. Par exemple, trouvons la corrélation entre le cours de l'action DTS et les données NTT.
#Appliquer une fonction anonyme pour trouver le coefficient de corrélation entre une colonne et une autre
result2 = by_year.apply(lambda g: g['DTS'].corr(g['Données NTT']))
print(result2)
#=>
# 2010 0.346437
# 2011 0.485108
# 2012 0.261388
# 2013 0.277970
# 2014 0.381762
# 2015 0.631186
Il en va de même pour les fonctions ordinaires. Par exemple, trouvons une régression linéaire par la méthode des moindres carrés (OLS) pour chaque groupe.
#Créez votre propre fonction de régression linéaire
def regression(data, yvar, xvars):
Y = data[yvar]
X = data[xvars]
X['intercept'] = 1.
result = sm.OLS(Y, X).fit() #Méthode de régression linéaire dans la bibliothèque d'économie métrique
return result.params #Les résultats sont renvoyés
#Appliquer une fonction de régression linéaire aux cours d'actions groupés
result3 = by_year.apply(regression, 'DTS', ['Données NTT'])
#=>Interception de données NTT
# 2010 0.313685 0.000773
# 2011 0.509025 -0.000057
# 2012 0.360677 0.000705
# 2013 0.238903 0.002063
# 2014 0.395362 0.001214
# 2015 0.418843 -0.002459
Cela fait seulement un demi-mois depuis 2015, donc je ne peux rien en dire, mais pour le moment, les résultats pour chaque année sont obtenus. En appliquant la fonction aux données regroupées de cette manière, vous pouvez essayer l'analyse sous différents angles, ce qui est très pratique.
Pouvoir appliquer la fonction elle-même avec la méthode apply ouvre de nombreuses possibilités. Les fonctions appliquées ici peuvent être librement écrites par l'analyste, à l'exception de la règle selon laquelle un objet ou une valeur scalaire est renvoyée comme valeur de retour.
Le code source de cet article est ici.
Introduction à l'analyse de données avec le traitement des données Python avec NumPy et pandas http://www.oreilly.co.jp/books/9784873116556/
Recommended Posts