У меня есть 2 серии панд: данные и события.Ускорение поиска панд
- данных упорядоченный ряд точек данных
- событий содержит индексы точек интереса данных
Я хотел бы, чтобы извлечь окно фиксированного размера вокруг каждой точки интереса.
я придумал:
res = []
for k in events:
win = data.loc[k - ticks_before:k + ticks_after].values
res.append(win)
new_df = pd.DataFrame(res)
который работает, но очень медленно. Любой Panda-fu, чтобы сделать это быстро?
Edit: нашел в 5 раз быстрее решение, которое:
res = np.zeros((len(events), win_len))
i = 0
for k in events:
res[i] = data.loc[k - ticks_before:k + ticks_after]
i+=1
new_df = pd.DataFrame(res)
Любая идея, чтобы сделать его еще быстрее?
Ниже входной и выходной код:
Вход:
data = pd.Series(xrange(200))
events = [50, 77, 98, 125, 133, 159, 161]
ticks_before = 32
ticks_after = 16
def slow_loop(data, events, ticks_before, ticks_after):
res = []
for k in events:
win = data.loc[k - ticks_before:k + ticks_after].values
res.append(win)
new_df = pd.DataFrame(res)
return new_df.mean()
def fast_loop(data, events, ticks_before, ticks_after):
win_len = ticks_before + ticks_after + 1
res = np.zeros((len(events), win_len))
i = 0
for k in events:
res[i] = data.loc[k - ticks_before:k + ticks_after]
i+=1
new_df = pd.DataFrame(res)
return new_df.mean()
assert(all(slow_loop(data, events, ticks_before, ticks_after) ==
fast_loop(data, events, ticks_before, ticks_after)))
%timeit slow_loop(data, events, ticks_before, ticks_after)
%timeit fast_loop(data, events, ticks_before, ticks_after)
fast_loop(data, events, ticks_before, ticks_after)
Выход:
100 loops, best of 3: 3.66 ms per loop
1000 loops, best of 3: 632 µs per loop
0 82.714286
1 83.714286
2 84.714286
3 85.714286
4 86.714286
5 87.714286
6 88.714286
7 89.714286
8 90.714286
9 91.714286
10 92.714286
11 93.714286
12 94.714286
13 95.714286
14 96.714286
15 97.714286
16 98.714286
17 99.714286
18 100.714286
19 101.714286
20 102.714286
21 103.714286
22 104.714286
23 105.714286
24 106.714286
25 107.714286
26 108.714286
27 109.714286
28 110.714286
29 111.714286
30 112.714286
31 113.714286
32 114.714286
33 115.714286
34 116.714286
35 117.714286
36 118.714286
37 119.714286
38 120.714286
39 121.714286
40 122.714286
41 123.714286
42 124.714286
43 125.714286
44 126.714286
45 127.714286
46 128.714286
47 129.714286
48 130.714286
dtype: float64
Просьба предоставить образцы данных и выборки. – root
Я думал, что 'pandas.core.window.Rolling.apply' может помочь, но, с другой стороны, это не так. Я тоже хотел бы использовать ввод и вывод проб. – shane
Как вы определяете медленный, по сравнению с чем? – Merlin