2014-12-04 83 views
0

嗨指標數字,我真正的新大熊貓。我試圖弄清楚這裏的數據類型是怎麼回事,但到目前爲止我無法走得很遠。返回「可迭代」在Python中熊貓

我打算做的是很簡單的。我在data1中搜索DataFrame data2的索引,並且距離目標時間最近的時間。

由於data1data2非常相似,只是有一些小的時間差,由於略有不同的採樣率,附上只有在這裏的data1樣本:

enter image description here

我做了這樣的事情在由時間戳data2比較搜索最接近的匹配數據的data1到時間戳:

idxcollect = [] 
for loopidx, tstamploop in enumerate(tstamp_data1[820990:821000]): 
    idxtemp = data2[ data2['timestamp'] == tstamp_data2.asof(tstamploop) ].index 
    delta1 = np.abs(data2.timestamp[idxtemp]  - data1.timestamp[loopidx]) 
    delta2 = np.abs(data2.timestamp[idxtemp + 1] - data1.timestamp[loopidx]) 

    if delta1.iloc[0] < delta2.iloc[0]: 
     idxreturn = idxtemp 
     idxcollect.append(idxreturn) 
    else: 
     idxreturn = idxtemp + 1 
     idxcollect.append(idxreturn) 

tstamp_data1/tstamp_data2是​​,從曆元時間在data1data2計算。

我得到的輸出是:

[Int64Index([809498], dtype='int64'), Int64Index([809499], dtype='int64'), Int64Index([809500], dtype='int64'), Int64Index([809501], dtype='int64'), Int64Index([809502], dtype='int64'), Int64Index([809503], dtype='int64'), Int64Index([809509], dtype='int64'), Int64Index([809513], dtype='int64'), Int64Index([809521], dtype='int64'), Int64Index([809533], dtype='int64')]

我想這樣做是切片相應的data2從通過上述操作中發現的指數排,簡單的東西如:

data2.ix[ idxcollect[:11] ]

但是,使用Int64Index格式,我無法做任何事情,只要我想做的事情都很簡單。有什麼出路嗎?感謝您的時間和關注和幫助!

+1

包括一些示例數據。你只需要~10行來展示你想要完成的事情。 – 2014-12-04 18:45:38

+0

感謝您的建議。添加! – 2014-12-05 03:55:44

回答

1

您可以DATA2的索引存儲爲列表,請DATA1的時間戳列表和存儲數據創建一個新的數據框:

data2indx = data2.index.tolist() 
data1tm = data1['timestamp'].tolist() 
data2sub = pd.DataFrame(columns = data2.columns) 

然後切片數據2和追加行data2sub基於選擇:

for n, i in enumerate(data1tm): 
    c = [abs(i-j) for j in data2indx] 
    mins = min(c) 
    index = c.index(mins) 
    data2sub.loc[n] = data2.iloc[index] 

也許有人可以提供一個更有效的方法。

+0

看起來很有前途。感謝您的及時回覆。讓我試試看... – 2014-12-05 03:55:21

+0

您的功能可以完美適用於小數據範圍。然而,它僅僅處理了data1和27.7 Mb數據的29.6 Mb,然後iPython決定殺死內核,所以我吃掉了所有16 GB的RAM。有什麼出路嗎?謝謝。 – 2014-12-05 17:18:28

+0

@HarryMacDowel可能生成的列表太大,導致系統資源浪費。嘗試修訂。 – 2014-12-05 18:33:33

0

我找到了出路,解決了速度問題。問題是,它需要更多的時間來處理比較,以爲最接近的浮點值搜索最近的時間戳搜索。

因此,關鍵是,如果你已經在數據發現,我已經有一個timesec列。

enter image

我所做的就是設置第一個時間戳0,然後從此開始增加從時間戳的0基準計算的相應timedelta。這產生timesec列,這是一個簡單而快速的計算。

在這個問題中,我問到「可迭代」數字,正如羅比指出的那樣,.tolist()函數將解決列表的嵌套列表問題。但是,在另一個數據集中搜索僅87258個時間戳需要60個小時。爲了加快速度,您可以利用timesec來實現更清晰,更快速的搜索。

通過採用簡單getnearpos功能from a previous Stack Overflow answer

def getnearpos(array,value): 
    idx = (np.abs(array-value)).argmin() 
    return idx 

爲87258個時間戳現在搜索變成了87258個浮點數搜索,它需要完成搜索的時間:1小時1分鐘23S,一相比~60小時大幅度改善。

如果任何碰巧看到這個問題的人知道更快的實現,請與我分享。我非常渴望學習!謝謝!