如何通过跳跃有效地进行数据帧移位

how to efficienlty do dataframe shift with a jump

我正在分析 60 个日志文件。从这些文件中,我创建了数据框 state_n_ev_mat。它的大小是[2083656 rows x 8 columns]。您可以在下方看到 state_n_ev_mat.

的前 50 行

其中,block标识每个文件,ts为当前时间段,n_ts为当前ts的下24个开放时间段。 n_cpn_tsts的清算价,c_cpn_tsts的清算价。暂时不考虑其余的列。

我想做的是用之前 ts 的清算价格填充 c_cp。除了最开始的 24 个,因为在那之前没有 activity。

例如row 24c_cp值(即27.9)是row 1n_cp的值。它基本上是向上移动到第 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

有了更好的理解..

#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)