Я пытаюсь обнаружить непрерывные промежутки, в которых соответствующая переменная изменяется линейно в пределах определенных данных в DataFrame. В данных может быть много интервалов, которые удовлетворяют этому. Я начал свой подход с ransac
на основе надежной оценки линейной модели с использованием RANSAC. Однако у меня возникают проблемы с использованием примера для моих данных.
Цель
Обнаружение смежных диапазонов, в которых релевантная переменная изменяется линейно в пределах данных. Диапазоны, которые необходимо обнаружить, состоят из более чем 20 последовательных точек данных. Желаемым результатом будут даты диапазона, в котором расположены смежные промежутки.
Пример игрушки
В приведенном ниже коде игрушечного примера я генерирую случайные данные, а затем устанавливаю две части данных для создания смежных интервалов, которые изменяются линейно. Затем я пытаюсь подогнать к данным модель линейной регрессии. Остальной код, который я использовал (который здесь не показан), представляет собой остальную часть кода в Надежная оценка линейной модели с использованием страницы RANSAC. Однако я знаю, что мне нужно будет изменить этот оставшийся код, чтобы достичь цели.
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets
import numpy as np
## 1. Generate random data for toy sample
times = pd.date_range('2016-08-10', periods=100, freq='15min')
df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), index=times, columns=["data"])
## 2. Set line1 within random data
date_range1_start = "2016-08-10 08:15"
date_range1_end = "2016-08-10 15:00"
line1 = df.data[date_range1_start:date_range1_end]
value_start1 = 10
values1 = range(value_start1,value_start1+len(line1))
df.data[date_range1_start:date_range1_end] = values1
## 3. Set line2 within random data
date_range2_start = "2016-08-10 17:00"
date_range2_end = "2016-08-10 22:30"
value_start2 = 90
line2 = df.data[date_range2_start:date_range2_end]
values2 = range(value_start2,value_start2-len(line2),-1)
df.data[date_range2_start:date_range2_end] = values2
## 4. Plot data
df.plot()
plt.show()
## 5. Create arrays
X = np.asarray(df.index)
y = np.asarray(df.data.tolist())
## 6. Fit line using all data
lr = linear_model.LinearRegression()
lr.fit(X, y)
Для этого игрушечного примера кода желаемый результат (который я еще не смог закодировать) будет таким DataFrame:
>>> out
start end
0 2016-08-10 08:15 2016-08-10 15:00
1 2016-08-10 17:00 2016-08-10 22:30
Сгенерированный график выглядит так:
Код ошибки
Однако, когда выполняется шаг 6, я получаю сообщение об ошибке ниже:
ValueError: Ожидаемый 2D-массив, вместо этого получен 1D-массив: ... Измените форму данных либо с помощью array.reshape(-1, 1), если ваши данные имеют одну функцию, либо с помощью array.reshape(1, -1), если она содержит одну образец.
Я хотел бы иметь возможность обнаруживать в этом примере оба смежных диапазона, в которых соответствующая переменная изменяется линейно (line1
и line2
). Но я не могу реализовать пример, указанный в примере кода ransac а>.
Вопрос
Что нужно изменить в коде, чтобы продолжить? И может ли существовать лучший подход для обнаружения смежных интервалов, в которых соответствующая переменная изменяется линейно?