2015-01-13 196 views
0

在獲得一系列具有最高交貨次數的日期後,如何才能過濾掉原始數據框的那幾天?考慮到這兩個:python熊貓通過另一系列,多列篩選數據框

most_liquid_contracts.head(20) 
Out[32]: 
2007-04-26 706 
2007-04-27 706 
2007-04-29 706 
2007-04-30 706 
2007-05-01 706 
2007-05-02 706 
2007-05-03 706 
2007-05-04 706 
2007-05-06 706 
2007-05-07 706 
2007-05-08 706 
2007-05-09 706 
2007-05-10 706 
2007-05-11 706 
2007-05-13 706 
2007-05-14 706 
2007-05-15 706 
2007-05-16 706 
2007-05-17 706 
2007-05-18 706 
dtype: int64 

df.head(20).to_string 
Out[40]: 
<bound method DataFrame.to_string of        
           delivery volume 
2007-04-27 11:55:00+01:00  705  1 
2007-04-27 13:46:00+01:00  705  1 
2007-04-27 14:15:00+01:00  705  1 
2007-04-27 14:33:00+01:00  705  1 
2007-04-27 14:35:00+01:00  705  1 
2007-04-27 17:05:00+01:00  705  16 
2007-04-27 17:07:00+01:00  705  1 
2007-04-27 17:12:00+01:00  705  1 
2007-04-27 17:46:00+01:00  705  1 
2007-04-27 18:25:00+01:00  705  2 
2007-04-26 23:00:00+01:00  706  10 
2007-04-26 23:01:00+01:00  706  12 
2007-04-26 23:02:00+01:00  706  1 
2007-04-26 23:05:00+01:00  706  21 
2007-04-26 23:06:00+01:00  706  10 
2007-04-26 23:07:00+01:00  706  19 
2007-04-26 23:08:00+01:00  706  1 
2007-04-26 23:13:00+01:00  706  10 
2007-04-26 23:14:00+01:00  706  62 
2007-04-26 23:15:00+01:00  706  3> 

我已經試過:

liquid = df[df.index.date==most_liquid_contracts.index & df['delivery']==most_liquid_contracts] 

或許我需要一個合併?這似乎不太優雅,我也不敢肯定。我已經試過:

# ATTEMPT 1 
most_liquid_contracts.index = pd.to_datetime(most_liquid_contracts.index, unit='d') 
df['days'] = pd.to_datetime(df.index.date, unit='d') 
mlc = most_liquid_contracts.to_frame(name='delivery') 
mlc['days'] = mlc.index.date 
data = pd.merge(mlc, df, on=['delivery', 'days'], left_index=True) 

# ATTEMPT 2 
liquid = pd.merge(mlc, df, on='delivery', how='inner', left_index=True) 
# this gets me closer (ie. retains granularity), but somehow seems to be an outer join? it includes the union but not the intersection. this should be a subset of df, but instead has about x50 the rows, at around 195B. df originally has 4B 

但我似乎無法留住分鐘級別的粒度,我需要在原有的「東風」。基本上,我只需要「df」只用於最流動的合約(來自most_liquid_contracts系列;例如,4月27日只包括「706」標籤的合約,4月29日只有「706」標籤的合同)。然後第二個DF完全相反:所有其他合同的DF(即不是最流動)。

更新:更多information-- enter image description here

回答

1

棘手的部分是合併這兩個系列/ dataframes有不同的日期時間分辨率指標。一旦你將它們巧妙地結合起來,你就可以正常過濾。現在

# Make sure your series has a name 
# Make sure the index is pure dates, not date 00:00:00 
most_liquid_contracts.name = 'most' 
most_liquid_conttracts.index = most_liquid_contracts.index.date 

data = df 
data['day'] = data.index.date 
combined = data.join(most_liquid_contracts, on='day', how='left') 

,你可以這樣做

combined[combined.delivery == combined.most] 

這將產生行在datadf)其中data.delivery等於這一天在most_liquid_contracts值。

+0

我已經嘗試使用'組合= df.join(MLC,對= '天',如何= '左')',但我得到這個錯誤:'ValueError異常:列重疊,但沒有指定的後綴:指數([u'delivery',u'days'],dtype ='object')'..我已經在我的原始主題上張貼了一張圖片 –

+0

擺脫'mlc'系列中''days''列因爲它與索引是多餘的。或者,在連接中指定'right_suffix'和/或'left_suffix'。 – wflynny

+0

這工作!謝謝。我絕對不清楚如何使用'join()',但這對我有很大的幫助。 –

0

我假設我已經正確理解了你,並且most_liquid_contracts系列是包含某個整數N的N個最大交貨的系列。您希望過濾df以僅包含交貨數量足夠高的日列表。因此,您可以簡單地刪除df中不大於most_liquid_contracts最小值的所有內容。

threshold = min(most_liquid_contracts) 
filtered = df[df['delivery'] >= threshold] 
+0

對不起,也許我不清楚。我每天只需要一份交付合同 - 在「most_liquid_contracts」系列中列出的合同。交貨合同是一個數字的事實令人困惑,它可能是「A」,「B」等等。我只需要一個數據框,每天只對most_liquid_contracts中列出的「合同名稱」進行抽樣,然後第二個數據框就是其他的東西。這是否可以澄清? –

+0

因爲我上面的評論不是很清楚,所以再作一個解釋。我需要一個具有(1)日期時間指數的數據框,(2)當天最流動的合約(來自most_liquid_contracts系列),以及(3)該合約當天的相關交易量。這是因爲我只想要在特定日期的最流行的合約中買入。所以如果一天有兩份合同,那不是我需要的。你可以忽略關於「其他」的第二部分,因爲我意識到我可以找到總量並且減去最流動的合約量來找到「其他」。 –

+0

查看下面的wflynny的解決方案。這比我想出來的要好。 – MTrenfield