如何在Pandas Python中识别列值更改

时间:2018-12-08 18:42:21

标签: python pandas

我有一个如下所示的pandas DataFrame,其中包含strike_price和value的数据。

    date        time    int_sp          value

1   20180903    09:16   11700           283.90
315 20180903    14:31   11700           273.85
316 20180903    14:32   11700           274.05
317 20180903    14:33   11600           295.35
390 20180904    09:31   11600           284.5
391 20180904    09:32   11500           304.15
403 20180904    09:44   11500           301.6
404 20180904    09:45   11600           282.4
405 20180904    09:46   11500           300.35
406 20180904    09:47   11500           300.35
407 20180904    09:48   11500           300.95
408 20180904    09:49   11500           301.3
409 20180904    09:50   11600           280.4
474 20180904    10:55   11600           279.25
475 20180904    10:56   11500           300.15

我的第一笔交易应该始终是第一笔记录的卖出。现在,每当行使价(int_sp)发生变化时,我都需要购买已卖出的头寸并通过以新的行使价进行卖出来建立新的交易。

这是我的预期输出。

sell_date   sell_time   buy_date    buy_time    int_sp      sell_price      buy_price
20180903    09:16       20180903    14:32       11700       283.90          274.05          
20180903    14:33       20180904    09:31       11600       295.35          284.5
20180904    09:32       20180904    09:44       11500       304.15          301.6
20180904    09:45       20180904    09:45       11600       282.4           282.4
20180904    09:46       20180904    09:49       11500       300.35          301.3   
20180904    09:50       20180904    10:55       11600       280.4           279.25
20180904    10:56       TBD         TBD         11500       300.15          TBD

我对熊猫很陌生,无法考虑如何实现这一目标。 有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

IIUC,使用diff获取销售信息

ndf = df.loc[df['int_sp'].diff().ne(0)].add_prefix('sell_').reset_index().copy()

现在,使用口罩

mask = df['int_sp'].diff().shift(-1).fillna(0).ne(0)

此蒙版会过滤与购买相关的滞后值。然后只需分配

ndf.loc[:, 'buy_value'] = df.loc[mask, 'value'].reset_index(drop=True)
ndf.loc[:, 'buy_date'] = df.loc[mask, 'date'].reset_index(drop=True)
ndf.loc[:, 'buy_time'] = df.loc[mask, 'time'].reset_index(drop=True)


        sell_date   sell_time   sell_int_sp sell_value  buy_value   buy_date    buy_time
index                           
1       20180903    09:16       11700       283.90      274.05      20180903.0  14:32
317     20180903    14:33       11600       295.35      284.50      20180904.0  09:31
391     20180904    09:32       11500       304.15      301.60      20180904.0  09:44
404     20180904    09:45       11600       282.40      282.40      20180904.0  09:45
405     20180904    09:46       11500       300.35      301.30      20180904.0  09:49
409     20180904    09:50       11600       280.40      279.25      20180904.0  10:55
475     20180904    10:56       11500       300.15      NaN         NaN         NaN