2017-03-13 3 views
2

J'ai une base de données pandas avec un index de date et 100 colonnes de cours boursiers.Décalez l'élément par 2 lorsqu'il y a un changement de valeur dans une colonne, puis transférez le remplissage en utilisant des pandas.

Je veux que chaque stock, quand il y a un changement de prix, il y ait un décalage de 2, puis après le remplissage avant.

données Ex de 2 colonnes (sous-ensemble de mes données):

  Stock A Stock B 
1/1/2000 100 50 
1/2/2000 100 50 
1/3/2000 100 50 
1/4/2000 350 50 
1/5/2000 350 50 
1/6/2000 350 50 
1/7/2000 350 25 
1/8/2000 350 25 
1/9/2000 500 25 
1/10/2000 500 25 
1/11/2000 500 25 
1/12/2000 500 150 
1/1/2001 250 150 
1/2/2001 250 150 
1/3/2001 250 150 
1/4/2001 250 150 
1/5/2001 250 150 
1/6/2001 250 150 
1/7/2001 250 150 
1/8/2001 75 150 
1/9/2001 75 150 
1/10/2001 75 25 
1/11/2001 75 25 
1/12/2001 75 25 
1/1/2002 75 25 

Maintenant la sortie que je veux est la suivante:

Stock A Stock B 
1/1/2000   
1/2/2000   
1/3/2000   
1/4/2000   
1/5/2000 100 
1/6/2000 100 
1/7/2000 100 
1/8/2000 100 50 
1/9/2000 100 50 
1/10/2000 350 50 
1/11/2000 350 50 
1/12/2000 350 50 
1/1/2001 350 25 
1/2/2001 500 25 
1/3/2001 500 25 
1/4/2001 500 25 
1/5/2001 500 25 
1/6/2001 500 25 
1/7/2001 500 25 
1/8/2001 500 25 
1/9/2001 250 25 
1/10/2001 250 25 
1/11/2001 250 150 
1/12/2001 250 150 
1/1/2002 250 150 

Exemple de stock A:

Lorsque stock A changé la première fois (100 à 350), puis la valeur précédente (100) a été assignée à 2 jours d'avance (1/5/200). Puis quand il est passé de 350 à 500, 350 ont été assignés à 2 jours d'avance (1/10/2000) etc ..... puis un remplissage avant a lieu.

Toute aide serait appréciée.

Répondre

1
df.where(df.diff(-1).fillna(0).ne(0)).shift(2).ffill() 

       A  B 
2000-01-01 NaN NaN 
2000-02-01 NaN NaN 
2000-03-01 NaN NaN 
2000-04-01 NaN NaN 
2000-05-01 100.0 NaN 
2000-06-01 100.0 NaN 
2000-07-01 100.0 NaN 
2000-08-01 100.0 50.0 
2000-09-01 100.0 50.0 
2000-10-01 350.0 50.0 
2000-11-01 350.0 50.0 
2000-12-01 350.0 50.0 
2001-01-01 350.0 25.0 
2001-02-01 500.0 25.0 
2001-03-01 500.0 25.0 
2001-04-01 500.0 25.0 
2001-05-01 500.0 25.0 
2001-06-01 500.0 25.0 
2001-07-01 500.0 25.0 
2001-08-01 500.0 25.0 
2001-09-01 250.0 25.0 
2001-10-01 250.0 25.0 
2001-11-01 250.0 150.0 
2001-12-01 250.0 150.0 
2002-01-01 250.0 150.0