我有60個我正在分析的日誌文件。從這些文件中我創建了數據幀state_n_ev_mat
。其尺寸爲[2083656 rows x 8 columns]
。在下面你可以看到state_n_ev_mat
的前50行。如何高效地跳轉數據幀轉換
其中,block
標識每個文件,ts
是當前時隙,n_ts
是當前ts
未來24個開放時隙。 n_cp
是ts
發生的清算價格爲n_ts
,c_cp
以前的清算價格ts
爲n_ts
。目前不考慮其餘的列。
我想要做的是填充c_cp
以前的ts
的清算價格。除了最初的24次,因爲之前沒有任何活動。
例如,row 24
(即27.9)的c_cp
值是n_cp
在row 1
中的值。這基本上是一個變化到第23個值,因爲第24個n_ts
在前面的ts
中沒有打開,而是丟棄了最初的n_cp
值,因爲在接下來的ts
中ts
不再打開。
我的意思是後者是在ts=361
n_ts=361
不再可用。
簡而言之,c_cp
從n_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
這是否解決問題了嗎? – DJK
它不能解決問題。因爲總會有一種跳躍。請多多包涵。假設我們將整個數據幀'state_n_ev_mat'的每一行分成24行。然後,新col'c_cp'的每個塊都填入'n_cp'前面塊的23行。這裏發生了兩件事情:首先,'c_cp'塊的最後一個元素仍未填充,即'NaN'。其次,因爲我們只考慮前面的23行,'n_cp'塊的第一個元素被丟棄。這有道理嗎? – Arraval
@Arraval我已經更新了代碼以包含跳轉,最後一個塊是一個神祕的tho,所以在代碼中如果塊的長度小於24個元素,它將獲得所有的NaN值,如果這是錯誤的,我可以更新,但它是你如何在你的例子中展示它。此外,我測試了一個10000行的數據幀,並且它完成了很快的 – DJK