2017-07-31 86 views
0

我有60個我正在分析的日誌文件。從這些文件中我創建了數據幀state_n_ev_mat。其尺寸爲[2083656 rows x 8 columns]。在下面你可以看到state_n_ev_mat的前50行。如何高效地跳轉數據幀轉換

其中,block標識每個文件,ts是當前時隙,n_ts是當前ts未來24個開放時隙。 n_cpts發生的清算價格爲n_ts,c_cp以前的清算價格tsn_ts。目前不考慮其餘的列。

我想要做的是填充c_cp以前的ts的清算價格。除了最初的24次,因爲之前沒有任何活動。

例如,row 24(即27.9)的c_cp值是n_cprow 1中的值。這基本上是一個變化到第23個值,因爲第24個n_ts在前面的ts中沒有打開,而是丟棄了最初的n_cp值,因爲在接下來的tsts不再打開。

我的意思是後者是在ts=361n_ts=361不再可用。

簡而言之,c_cpn_cp的前23個數據點填充,而將第24個作爲NaN

這有道理嗎?

我的嘗試是:

for m in range(60): 
    last_current = last_ts[m]-24 
    for n in range(360,last_current): 
     state_n_ev_mat.c_cp.loc[(state_n_ev_mat.block==m) & (state_n_ev_mat.ts==n+1)] = \ 
      state_n_ev_mat.n_cp.loc[(state_n_ev_mat.block==m) & (state_n_ev_mat.ts==n)].shift(-1).values 

這種方法是服用大量的時間來完成。 到目前爲止,它正在計算第56塊,運行時間爲18小時。

有沒有更好的方法來做到這一點?謝謝

state_n_ev_mat的第一個50行之下,在內部for的一個循環之後。

block ts n_ts n_cp c_cp c_w f_w p_w 
0  0 360 361.0 27.5 NaN NaN NaN NaN 
1  0 360 362.0 27.9 NaN NaN NaN NaN 
2  0 360 363.0 27.9 NaN NaN NaN NaN 
3  0 360 364.0 27.7 NaN NaN NaN NaN 
4  0 360 365.0 34.0 NaN NaN NaN NaN 
5  0 360 366.0 33.9 NaN NaN NaN NaN 
6  0 360 367.0 34.1 NaN NaN NaN NaN 
7  0 360 368.0 33.7 NaN NaN NaN NaN 
8  0 360 369.0 40.3 NaN NaN NaN NaN 
9  0 360 370.0 40.1 NaN NaN NaN NaN 
10  0 360 371.0 50.1 NaN NaN NaN NaN 
11  0 360 372.0 40.1 NaN NaN NaN NaN 
12  0 360 373.0 44.4 NaN NaN NaN NaN 
13  0 360 374.0 106.0 NaN NaN NaN NaN 
14  0 360 375.0 74.9 NaN NaN NaN NaN 
15  0 360 376.0 95.4 NaN NaN NaN NaN 
16  0 360 377.0 125.0 NaN NaN NaN NaN 
17  0 360 378.0 139.1 NaN NaN NaN NaN 
18  0 360 379.0 133.3 NaN NaN NaN NaN 
19  0 360 380.0 124.0 NaN NaN NaN NaN 
20  0 360 381.0 139.1 NaN NaN NaN NaN 
21  0 360 382.0 53.1 NaN NaN NaN NaN 
22  0 360 383.0 45.1 NaN NaN NaN NaN 
23  0 360 384.0 46.0 NaN NaN NaN NaN 
24  0 361 362.0 36.4 27.9 NaN NaN NaN 
25  0 361 363.0 31.8 27.9 NaN NaN NaN 
26  0 361 364.0 31.2 27.7 NaN NaN NaN 
27  0 361 365.0 33.4 34.0 NaN NaN NaN 
28  0 361 366.0 34.2 33.9 NaN NaN NaN 
29  0 361 367.0 0.0 34.1 NaN NaN NaN 
30  0 361 368.0 0.0 33.7 NaN NaN NaN 
31  0 361 369.0 0.0 40.3 NaN NaN NaN 
32  0 361 370.0 0.0 40.1 NaN NaN NaN 
33  0 361 371.0 0.0 50.1 NaN NaN NaN 
34  0 361 372.0 0.0 40.1 NaN NaN NaN 
35  0 361 373.0 0.0 44.4 NaN NaN NaN 
36  0 361 374.0 0.0 106.0 NaN NaN NaN 
37  0 361 375.0 0.0 74.9 NaN NaN NaN 
38  0 361 376.0 0.0 95.4 NaN NaN NaN 
39  0 361 377.0 0.0 125.0 NaN NaN NaN 
40  0 361 378.0 0.0 139.1 NaN NaN NaN 
41  0 361 379.0 0.0 133.3 NaN NaN NaN 
42  0 361 380.0 0.0 124.0 NaN NaN NaN 
43  0 361 381.0 0.0 139.1 NaN NaN NaN 
44  0 361 382.0 0.0 53.1 NaN NaN NaN 
45  0 361 383.0 0.0 45.1 NaN NaN NaN 
46  0 361 384.0 0.0 46.0 NaN NaN NaN 
47  0 361 385.0 46.2 NaN NaN NaN NaN 
48  0 362 363.0 39.0 NaN NaN NaN NaN 
49  0 362 364.0 33.1 NaN NaN NaN NaN 

回答

0

有了更好的理解..

#get number of chunks 
chunks = -(-len(frame) // 24) 
#create chunks 
groups = [frame.iloc[x*24:x*24+24,:].copy() for x in range(0,chunks)] 

for i in range(0,len(groups)): 
    if i == 0: 
     groups[i]['c_cp'] = np.nan 
    else: 
     if len(groups[i]) < 24: 
      groups[i]['c_cp'] = np.nan 
     else: 
      data = groups[i-1]['n_cp'].tolist() 
      data = data[1:] 
      data.append(np.nan) 
      groups[i]['c_cp'] = data 

print pd.concat(groups) 
+0

這是否解決問題了嗎? – DJK

+0

它不能解決問題。因爲總會有一種跳躍。請多多包涵。假設我們將整個數據幀'state_n_ev_mat'的每一行分成24行。然後,新col'c_cp'的每個塊都填入'n_cp'前面塊的23行。這裏發生了兩件事情:首先,'c_cp'塊的最後一個元素仍未填充,即'NaN'。其次,因爲我們只考慮前面的23行,'n_cp'塊的第一個元素被丟棄。這有道理嗎? – Arraval

+0

@Arraval我已經更新了代碼以包含跳轉,最後一個塊是一個神祕的tho,所以在代碼中如果塊的長度小於24個元素,它將獲得所有的NaN值,如果這是錯誤的,我可以更新,但它是你如何在你的例子中展示它。此外,我測試了一個10000行的數據幀,並且它完成了很快的 – DJK