Быстрое подмножество в Pandas в Python - PullRequest
0 голосов
/ 12 ноября 2018

Я выполняю цикл несколько миллионов раз, и мне нужно установить разные объемы данных в каждом цикле.У меня есть датафрейм, который имеет два столбца, время (которое является временным рядом) и электрод, который обозначает число от 1 до 64 для любого электрода, запущенного в это время.

time    electrode
 0          1
 1          43
 2          45
 3          12
 4          7

В каждом цикле мне нужно подмножество данных, например:

num_electrodes = []
window_size = 5
index = 0
while index < len(data['time']) - interval_size:
    start = data['time'][index]
    end = data['time'][index+window_size]
    window_data = data[(data['time'] >= start) & (data['time'] < end)]
    num_electrodes.append(len(window_data['electrode'].unique()))

Очень медленная часть кода здесь - это подмножество данных и создание нового кадра данных вследующий код.

window_data = data[(data['time'] >= start) & (data['time'] < end)]

Есть ли хорошая альтернатива этому?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Если ваши данные отсортированы по времени, вам просто нужно сгруппировать электроды по 5. Тогда set может быть быстрее, чем np.unique:

size=10**6
window_size=5
electrodes = np.random.randint(0,64,size)
electrodes_by_5 = electrodes.reshape(-1,window_size)

nb_electrodes=np.apply_along_axis(lambda arr:len(set(arr)),1,electrodes_by_5)

Выход:

In [463]: electrodes[:10]
Out[463]: array([13, 13, 23, 20,  5, 30,  9,  6, 28, 11])

In [464]: electrodes_by_5[:2]
Out[464]: 
array([[13, 13, 23, 20,  5],
       [30,  9,  6, 28, 11]])

In [465]: nb_electrodes[:2]
Out[465]: array([4, 5])
0 голосов
/ 13 ноября 2018

Итак, я решил эту проблему, переключившись на numpy.ndarray, который работал бесконечно быстрее, чем индексирование с помощью iloc.

0 голосов
/ 12 ноября 2018

Сортируйте по времени, затем вы можете использовать .loc для доступа к индексам в начале и в конце вашего окна, а затем выбрать диапазон индексов в качестве своего подмножества.

Установите индекс вашего df для временного ряда, затем используйте df.index.get_loc(beginning_window) и min(df.index.get_loc(beginning_window+window+1)) -1, чтобы получить ваш диапазон индекса.

Мин. Счет для неуникальных индексов.

Затем используйте .iloc, чтобы выбрать этот диапазон.

Это должно немного ускорить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...