2017-09-20 3 views
0

J'ai une dataframe indexée DatetimeIndex avec deux colonnes. L'indice est inégal. Je souhaite calculer le produit scalaire des séries temporelles A et B sur une fenêtre mobile de 20 jours.Python pandas rolling.apply deux entrée de série temporelle dans la fonction

Il devrait revenir:

  dot 
Date 
2016-01-04 Nan 
2016-01-12 Nan 
2016-01-21 Nan 
2016-01-25 110  
2016-02-08 130 
2016-02-15 80  
2016-02-21 140 
2016-02-25 180 

voici comment on obtient ceci:

110 = 2 * 10 + 3 * 10 + 2 * 20 (produit obtenu en période 06/01/2016 à 25.01.2016 inclus)

130 = 3 * 10 + 2 * 20 + 2 * 30 (produit obtenu en période de 20/01/2016 à 2016-02-08)

80 = 1 * 20 + 2 * 30 (produit obtenu dans la période du 2016-01-27 au 2016-02-15)

140 = 3 * 20 + 1 * 20 + 2 * 30 (produit obtenu à partir de la période 02.02.2016 au 2016-02-21)

180 = 2 * 20 + 3 * 20 + 1 * 20 + 2 * 30 (produit obtenu dans la période du 2016-02-06 au 2016-02-25)

Le produit scalaire est un exemple qui devrait être généralisable à toute fonction prenant deux séries et renvoyant une valeur.

+0

Ce que vous demandez n'est pas clair. Pourriez-vous formuler votre question explicitement? – FabienP

+0

sûr. C'est ici. J'ai édité la question – Laura

Répondre

0

Je pense que cela devrait fonctionner. df.product() à travers les lignes, la df.rolling (période) .sum()

Dates = pd.to_datetime(['2016-01-04', 
        '2016-01-12', 
        '2016-01-21', 
        '2016-01-25', 
        '2016-02-08', 
        '2016-02-15', 
        '2016-02-21', 
        '2016-02-25', 
        '2016-02-26' 
        ] 
       ) 

data = {'A': [i*10 for i in range(1,10)], 'B': [i for i in range(1,10)]} 
df1 = pd.DataFrame(data = data, index = Dates) 
df2 = df1.product(axis =1).rolling(3).sum() 
df2.columns = 'Dot' 
df2 

output 


2016-01-04  NaN 
2016-01-12  NaN 
2016-01-21  140.0 
2016-01-25  290.0 
2016-02-08  500.0 
2016-02-15  770.0 
2016-02-21 1100.0 
2016-02-25 1490.0 
2016-02-26 1940.0 
dtype: float64 

Et si vos données sont tous les jours et que vous souhaitez obtenir les premières données 20 jours, les groupes de 20 jours et résumer les en haut, ou utilisez le dernier, selon ce que vous voulez.

Dates1 = pd.date_range(start='2016-03-31', end = '2016-07-31') 
data1 = {'A': [np.pi * i * np.random.rand() 
       for i in range(1, len(Dates1) + 1)], 
     'B': [i * np.random.randn() * 10 
       for i in range(1, len(Dates1) + 1)]} 
df3 = pd.DataFrame(data = data1, index = Dates1) 
df3.groupby(pd.TimeGrouper(freq = '20d')).sum() 

        A    B 
2016-03-31 274.224084 660.144639 
2016-04-20 1000.456615 -2403.034012 
2016-05-10 1872.422495 -1737.571080 
2016-05-30 2121.497529 1157.710510 
2016-06-19 3084.569208 -1854.258668 
2016-07-09 3324.775922 -9743.113805 
2016-07-29 505.162678 -1179.730820 

puis d'utiliser un produit scalaire comme je l'ai fait ci-dessus.