2017-09-18 4 views
0

J'ai données (déclarations appelées dataframe) qui ressemble à ceciproduit cumulatif de roulement entre les dates

DATE   TICKER RETURN_DATA 
2010-01-01 xxx  0.05 
2010-01-01 yyy  0.01 
2010-01-02 xxx  0.02 
2010-01-02 yyy  0.08 
..... 
2010-01-29 xxx  0.11 
2010-01-29 yyy  0.01 

ce que j'essaie de faire est de calculer 4 (n) -weeks retours de roulement.

I mis en œuvre cette

def rolling_fct(returns, window_len): 
    return returns.groupby('TICKER')['RETURN_DATA'].rolling(window=window_len).apply(lambda x: np.prod(1+x)-1) 

où window_len = 28 jours, cela fonctionne, mais je viens de découvrir que je dois rouler ce sur un delta de temps plutôt que d'avoir un window_len = entier. Le problème est que j'ai affaire à des jours fériés, etc., donc ma fenêtre n'est pas fixe.

Je cherche la même logique de roulement juste sur un delta temporel plutôt que sur une longueur.

+0

donc au lieu de spécifier un 'window_len = un_intérieur', vous voulez quelque chose comme 'window_len = '28D''? – Uvar

+0

Oui, au lieu de le faire tourner sur le nombre de points de données, je voudrais qu'il roule sur une fenêtre temporelle, quel que soit le nombre de points de données que j'ai dans cette période. Exemple 4 semaines devrait être égal à 28 jours, 20 jours ouvrables, mais si j'ai un jour férié, je pourrais finir avec 19 entrées. Je suis à la recherche d'une solution robuste. – ThatQuantDude

+0

Je sais ce que vous voulez dire, mais avez-vous essayé de l'utiliser avec '28D'? Il devrait produire une fenêtre mobile basée sur 4 semaines de temps dans votre index. Cela inclut également la robustesse aux entrées manquantes dues aux vacances. En ce qui concerne les informations de date, il était présent depuis le début, je pense que vous devrez spécifier explicitement "as_index = False" pour conserver les dates. – Uvar

Répondre

0

Comme mentionné par @Uvar, la structure de données pandas prend en charge une déclaration de décalage dans la fenêtre. Vous devez créer l'image de données et convertir l'index au format datetime. Ensuite, utilisez la fonction de roulement

a 
     DATE TICKER RETURN_DATA 
0 2010-01-01 xxx   0.05 
1 2010-01-01 yyy   0.01 
2 2010-01-02 xxx   0.02 
3 2010-01-02 yyy   0.08 
5 2010-01-29 xxx   0.11 
6 2010-01-29 yyy   0.01 

a.DATE = pd.to_datetime(a.DATE) 
a.set_index('DATE', inplace=True) 

a.rolling('2D').mean() 

    TICKER RETURN_DATA 
DATE       
2010-01-01 xxx  0.050000 
2010-01-01 yyy  0.030000 
2010-01-02 xxx  0.026667 
2010-01-02 yyy  0.040000 
2010-01-29 xxx  0.110000 
2010-01-29 yyy  0.060000 
+0

J'ai eu une version pandas <0.19 donc ce n'était pas pris en charge – ThatQuantDude

+0

une raison particulière de s'en tenir à l'ancienne version? – chrisckwong821

+0

Je n'ai tout simplement pas mis à jour depuis un moment, ce que j'ai fait maintenant et ça marche – ThatQuantDude