2017-10-24 7 views
1

나는이 같은 채권 시장의 데이터를 가지고 :

Id row  Date  BuyPrice SellPrice 
1 1  2017-10-30 94520  0 
1 2  2017-10-30 94538  0 
1 3  2017-10-30 94609  0 
1 4  2017-10-30 94615  0 
1 5  2017-10-30 94617  0 
1 1  2017-09-20 99100  99059 
1 1  2017-09-20 98100  99090 
2 1  2010-11-01 99890  100000 
2 2  2010-11-01 99899  100000 
2 3  2010-11-01 99901  99899 
2 4  2010-11-01 99920  99850 
2 5  2010-11-01 99933  99848 

나는 각 ID에 대한 가장 낮은 판매 가격과 높은 구매 가격을 선택하고 계산하려면 그들의 빼기지만 판매 또는 가격의 최소 중 하나가 0이라면 나는 예외를 만들고 그 날짜를 빠져 나가고 싶다.

각 id에 날짜별로 색인을 지정하십시오. 각 날의 첫 날을 의미하며, 1 일과 2 일째에 2 등을 준다. 마지막 데이터에서

은 다음과 같이해야합니다 :

Id Date highest buy price  lowest sell price  NBBO(highest buy price - lowestSellPrice)Index 

1  2017-10-30 94520     0      NaN         1 
1  2017-09-20 99100     99059     41         2  
2  2017-11-01 99890     99848     42         1 

답변

0

당신은 조건에 의해 groupby 및 집계 min 및 최대 최초의 다음 numpy.whereNaN에 대한의를 사용할 수 있습니다. 마지막 사용 cumcount :

df = df.groupby(['Id','Date'], sort=False).agg({'BuyPrice':'max','SellPrice':'min'}) 
df['NBBO'] = np.where(df[['BuyPrice', 'SellPrice']].eq(0).any(1), 
         np.nan, 
         df['BuyPrice'] - df['SellPrice']) 
df['index'] = df.groupby(level=0).cumcount() + 1 

d = {'BuyPrice':'highest buy price','SellPrice':'lowest sell price'} 
df = df.reset_index().rename(columns=d) 
print (df) 

    Id  Date highest buy price lowest sell price NBBO index 
0 1 2017-10-30    94617     0 NaN  1 
1 1 2017-09-20    99100    99059 41.0  2 
2 2 2010-11-01    99933    99848 85.0  1 

세부 사항 :

#comapre with 0 eq is same as == 
print (df[['BuyPrice', 'SellPrice']].eq(0)) 
       BuyPrice SellPrice 
Id Date       
1 2017-10-30  False  True 
    2017-09-20  False  False 
2 2010-11-01  False  False 

#get at least one True per row by any(1) 
print (df[['BuyPrice', 'SellPrice']].eq(0).any(1)) 
Id Date  
1 2017-10-30  True 
    2017-09-20 False 
2 2010-11-01 False 
dtype: bool