python – Pandas – Расчет уклона
спросил
Изменено 1 год, 1 месяц назад
Просмотрено 11 тысяч раз
Как рассчитать наклон скользящего значения каждого столбца (окно = 60) с шагом 5?
Я хочу рассчитать значение каждые 5 минут, и мне не нужны результаты каждой записи.
Вот образец данных и результаты:
df Время А... Н 01.01.2016 00:00 1.2 ... 4.2 01.01.2016 00:01 1.2 ... 4.0 01.01.2016 00:02 1.2 ... 4.5 01.01.2016 00:03 1.5...4.2 01.01.2016 00:04 1.1 ... 4.6 01.01.2016 00:05 1.6 ... 4.1 01.01.2016 00:06 1.7 ... 4.3 01.01.2016 00:07 1,8 ... 4,5 01.01.2016 00:08 1.1 ... 4.1 01.01.2016 00:09 1.5 ... 4.1 01.01.2016 00:10 1.6 ... 4.1 .... результат Время А... Н 2016-01-01 00:04 ххх ... ххх 2016-01-01 00:09ххх ... ххх 2016-01-01 00:14 ххх ... ххх ...
Можно ли применить к этой проблеме функцию df.rolling?
Это нормально, если NaN находится в окне, что означает, что подмножество может быть меньше 60.
- python
- pandas
- регрессия
Кажется, что вам нужно прокатывать с определенным размером шага .
Однако, согласно документации pandas, размер шага в настоящее время не поддерживается в прокатке
.
Если размер данных не слишком велик, просто выполните прокатку всех данных и выберите результаты с помощью индексации.
Вот пример набора данных. Для простоты столбец времени представлен целыми числами.
данные = pd.DataFrame (np.random.rand (500, 1) * 10, столбцы = ['a'])
а 0 8.714074 1 0,985467 2 9.101299 3 4.598044 4 4.193559 .. ... 495 9.736984 496 2.447377 497 5.209420 498 2.698441 499 3.438271
Затем раскатайте и рассчитайте уклоны,
определение calc_slope(x): наклон = np.polyfit (диапазон (длина (x)), x, 1) [0] обратный уклон # установите min_periods=2, чтобы разрешить подмножества меньше 60. # используйте [4::5] для выбора нужных вам результатов. результат = data.rolling(60, min_periods=2).apply(calc_slope)[4::5]
Результат будет,
а 4 -0,542845 9 0,084953 14 0,155297 19 -0,048813 24 -0,011947 .. ... 479 -0,004792 484 -0,003714 489 0,022448 494 0,037301 499 0,027189
Или вы можете обратиться к этому сообщению. Первый ответ предоставляет простой способ добиться этого: размер шага в pandas.DataFrame.rolling
попробуйте это
windows = df.groupby("Time")["A"].rolling(60) df[out] = windows.apply(lambda x: np.polyfit(range(60), x, 1)[0], raw=True).values
Вы можете использовать Pandas Resample. Обратите внимание, что для использования этого вам нужен индекс со значением времени
df.index = pd.to_datetime(df.Time) распечатать дф результат = df.resample('5Min').bfill() распечатать результат Время А Н Время 01.01.2016 00:00:00 01.01.2016 00:00 1.2 4.2 01.01.2016 00:01:00 01.01.2016 00:01 1.2 4.0 01.01.2016 00:02:00 01.01.2016 00:02 1.2 4.5 01.01.2016 00:03:00 01.01.2016 00:03 1.5 4.2 01.01.2016 00:04:00 01.01.2016 00:04 1.1 4.6 01.01.2016 00:05:00 01.01.2016 00:05 1.6 4.1 01.01.2016 00:06:00 01.01.2016 00:06 1,7 4,3 01.01.2016 00:07:00 01.01.2016 00:07 1,8 4,5 01.01.2016 00:08:00 01.01.2016 00:08 1.1 4.1 2016-01-01 00:09:00 01.01.2016 00:09 1.5 4.1 01.01.2016 00:10:00 01.01.2016 00:10 1.6 4.1 01.01.2016 00:15:00 01.01.2016 00:15 1.6 4.1 Время А Н
Выход
Время 01.01.2016 00:00:00 01.01.2016 00:00 1.2 4.2 01.01.2016 00:05:00 01.01.2016 00:05 1.6 4.1 01.01.2016 00:10:00 01.01.2016 00:10 1.6 4.1 01.01.2016 00:15:00 01.01.2016 00:15 1.6 4.1
1
Я использую:
df['slope_I'] = df['I'].rolling('600s').apply(лямбда x: (x[-1]-x[0])/600)
, где наклон равен 1/секунде.
Вероятно, первые 600 секунд результата будут пустыми, их следует заполнить нулями или средним значением. Первое число в столбце наклона будет наклоном линии, идущей от первого ряда внутри окна к последнему, и так далее во время прокатки.
С уважением.
Для других искателей ответов здесь я получил другое решение, в котором временной интервал не обязательно должен быть одинаковой длины.
df.A.diff(60)/df.Time.diff(60).dt.total_seconds()
Эта строка кода берет разницу между текущей строкой и шестьюдесятью предыдущими строками и делит ее на разницу во времени тех же строк. Если вам нужна только каждая пятая запись, следующая строка должна работать.
df.A.diff(60)/df.Time.diff(60).dt.total_seconds()[4::5]
Примечание: рассчитывается каждая строка, и возвращается только 5-ступенчатая серия
doc pandas diff: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.diff.html
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Пол Кремер | Окно 04 (Склон) (2018) | Доступно для продажи
Пауль Кремер: Стеки, склоны и потоки – Галерея Берггрюен На прошлой выставке
Средний
Состояние
Подпись
Сертификат подлинности
Ценовые диапазоны малых гравюр Пабло Пикассо
Просмотрите работы в этой категории
Возможно, самый влиятельный художник 20-го века, Пабло Пикассо, возможно, наиболее известен новаторским кубизмом и разрушением двухмерной плоскости изображения для передачи трехмерное пространство.
Холст, акрил
46 × 36 дюймов | 116,8 × 91,4 см
Художественное произведениеЭто
Свяжитесь по цене
Сан-Франциско
Получайте уведомления о похожих работах
Хотите продать работу этого художника? Продажа с вычурностью
Средний
Состояние
Подпись
Сертификат подлинности
Ценовой диапазон малых гравюр Пабло Пикассо
Просмотрите работы в этой категории
Пабло Пикассо, возможно, самый влиятельный художник 20-го века.