我有一個資料框,它是篩選所有 S&P500 股票的結果,并對篩選期間發現的一些 SOS 信號以及每個信號出現的日期進行分類。
對于這個資料框,我應用了以下過濾器,因為我只想關注具有這些信號的股票:測驗每個股票的上升、吸收量、停止量
s = {'Stopping Vol', 'Absorption Vol', 'Test in Rising'}
df.groupby('Ticker').filter(lambda sf: s.issubset(sf['SOS']))
這是輸出:
Ticker SOS Date frequency
756 BXSL Test in Rising 2021-12-21 11
757 BXSL Stopping Vol 2021-12-27 11
758 BXSL Stopping Vol 2021-12-28 11
759 BXSL Selling Climax 2021-12-28 11
760 BXSL Shakeout 2021-12-28 11
761 BXSL Absorption Vol 2021-12-30 11
762 BXSL Bag Holding 2021-12-30 11
763 BXSL Test in Rising 2021-12-30 11
764 BXSL Stopping Vol 2022-01-03 11
765 BXSL Absorption Vol 2022-01-06 11
766 BXSL Test in Rising 2022-01-06 11
5057 WDAY Test in Rising 2021-12-16 9
5058 WDAY Test 2021-12-20 9
5059 WDAY Test in Rising 2021-12-20 9
5060 WDAY Test in Rising 2021-12-22 9
5061 WDAY Test in Rising 2021-12-29 9
5062 WDAY Stopping Vol 2022-01-04 9
5063 WDAY Selling Climax 2022-01-04 9
5064 WDAY Shakeout 2022-01-04 9
5065 WDAY Absorption Vol 2022-01-05 9
1167 CROX Stopping Vol 2021-12-17 9
我現在遇到的問題是,我只想要那些滿足這些信號的代碼,但我還想按出現日期保持信號的順序。我只想在我首先看到 Stopping Vol 信號,然后是 Absorption Vol 信號,最后是 Test in Rising 信號時才顯示 Ticker。兩者之間是否有任何其他信號都沒有關系,我只想保持它們之間的順序。
所以輸出將類似于:
Ticker SOS Date frequency
756 JPGY Selling Climax 2021-12-21 11
757 JPGY Stopping Vol 2021-12-27 11
758 JPGY Other signal 2021-12-28 11
761 JPGY Absorption Vol 2021-12-30 11
763 JPGY Test in Rising 2021-12-31 11
我怎樣才能得到這個?
我正在查看另一個問題,但不知道如何取得進展。 pandas groupby 在組內排序
uj5u.com熱心網友回復:
利用:
#in set is not defined order, so use list ot tuple
L = ['Stopping Vol', 'Absorption Vol', 'Test in Rising']
#filter rows if match all 3 values
df1 = df.groupby('Ticker').filter(lambda sf: set(L).issubset(sf['SOS']))
#get only rows with L
df1 = df1[df1['SOS'].isin(L)]
#get first and last values per filtered df1
df1 = df1.groupby(['Ticker'])['SOS'].agg(['first','last'])
#and test if first column is first value in L and last column last value in L
#middle values is already tested, so got only groups in this order
tickers = df1.index[df1['first'].eq(L[0]) & df1['last'].eq(L[2])]
df2 = df[df['Ticker'].isin(tickers)]
print (df2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409490.html
標籤:
上一篇:有條件地洗掉每個子集的一行
