Это небольшой сжатый пример. выдержка из некоторых моих данных. Полный набор данных содержит около 270 000 строк и может быть зашумлен. Начало периода простоя — строка 150, а конец периода простоя — строка 157.
Код: Выделить всё
disp temp
148 528.253551 0.908375
149 537.832220 0.944138
150 225.073475 0.890493
151 225.247861 0.892878
152 225.487333 0.895262
153 225.515279 0.926256
154 225.515003 0.909567
155 225.518680 0.901222
156 225.537893 0.927448
157 225.068878 0.865460
158 540.460613 0.873804
159 531.048884 0.865460
Код: Выделить всё
disp temp state
148 528.253551 0.908375 None
149 537.832220 0.944138 None
150 225.073475 0.890493 idl_strt
151 225.247861 0.892878 idle
152 225.487333 0.895262 idle
153 225.515279 0.926256 idle
154 225.515003 0.909567 idle
155 225.518680 0.901222 idle
156 225.537893 0.927448 idle
157 225.068878 0.865460 idl_ends
158 540.460613 0.873804 None
159 531.048884 0.865460 None
Мне уже удалось заполнить правильные строки столбца состояния с помощью «idl_start» и «idl_ends», используя следующий код
Код: Выделить всё
def _idlefinder(self, row):
"""Logic for finding idles start and end"""
if (row["disp"] + 250.0) < row["nextdisp"]: # find large drops in disp value
return "idle_strt"
elif row["disp"] + 250 < row["lastdisp"]: # find large increases in disp value
return "idle_end"
df["lastdisp"] = df["disp"].shift(1)
df["nextdisp"] = df["disp"].shift(-1)
df["status"] = df.apply(_idlefinder, axis=1) # label idle_start and idle_end
df.drop(columns=["nextdisp", "lastdisp"], inplace=True)
Предыдущие версии этой программы анализировали эти данные построчно в списках, но стали немного многословен и требует настройки или изменения.
Подробнее здесь: https://stackoverflow.com/questions/791 ... f-old-colu