Рассчитайте максимальную разницу в прокатных пандах - улучшите производительность - PullRequest
0 голосов
/ 27 июня 2018

У меня есть датафрейм с одним столбцом.

Мне нужно вычислить среднее разности между значениями min и max за период 600 секунд (10 минут). Или более четко это:

np.average(originalData[sensor1].rolling(600)
.apply(lambda mylist : (max(mylist) - min(mylist)), raw = True).dropna())

Код работает отлично и возвращает мне результаты, которые мне нужны.

Проблема в том, что мой Dataframe довольно большой (1,5 миллиона строк и 200 столбцов), и это занимает много времени, особенно если я хочу перейти от 600 секунд до 3600 секунд.

Я хочу улучшить его, не вычисляя разницу в каждой строке, но пропуская 10 строк каждый раз, это не должно существенно влиять на результаты.

Значение:

  • Рассчитать max (список) -min (список) в строке от 0 до 600
  • Рассчитать max (список) -min (список) в строке 10 до 610
  • Рассчитать max (список) -min (список) в строке 20 до 620
  • Рассчитать max (список) -min (список) в строке 30 до 630

Это ускорит расчет в 10 раз (надеюсь), но я не понимаю, как я могу сделать это с rolling

Есть предложения?

Edit: muzzyq запросил пример данных:

a = np.ones(1500000)
np.average(pd.Series(a).rolling(600).
apply(lambda thing : (max(thing) - min(thing)), raw = True).dropna())

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать метод resample с '10min' в качестве аргумента для группировки по 10-минутным интервалам. Это более эффективно, чем использование rolling для больших наборов данных временных рядов, при условии, что оно установлено в качестве индекса.

Пример данных

rng = pd.date_range('2000-01-01', periods=1_500_000, freq='S')
ts = pd.Series(np.arange(1_500_000), index=rng)
ts.head()

Выход:

2000-01-01 00:00:00    0
2000-01-01 00:00:01    1
2000-01-01 00:00:02    2
2000-01-01 00:00:03    3
2000-01-01 00:00:04    4
Freq: S, dtype: int64

Ответ

Использование функции из вашего вопроса:

np.average(ts.resample('10min').apply(lambda mylist: (max(mylist) - min(mylist))))

Выход:

599.0

Альтернатива

Только потому, что я не уверен на 100%, как вы хотите, чтобы результат выглядел, это даст вам диапазон за 10-минутный интервал:

result = ts.resample('10min').apply(lambda mylist: (max(mylist) - min(mylist)))
result.head()

Вывод:

2000-01-01 00:00:00    599
2000-01-01 00:10:00    599
2000-01-01 00:20:00    599
2000-01-01 00:30:00    599
2000-01-01 00:40:00    599
Freq: 10T, dtype: int64

В этом случае ответ всегда будет 599, поскольку максимум 600 секунд равен 600, а минимум равен 1, поэтому 600 - 1 = 599

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