>

다음과 같은 채권 시장 데이터가 있습니다 :

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 일째 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


  • 답변 # 1

    groupby 를 사용할 수 있습니다  그리고 집계 min  max를 먼저 누른 다음 numpy.where   NaN 를 위해 조건에 따라. 마지막 사용 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
    
    

관련 자료

  • 이전 amazon web services - 동일한 호스트의 다른 포트를 다른 인스턴스로 라우팅
  • 다음 python - 인접한 행의 차이로 팬더 데이터 프레임 필터링