Я регулярно собираю показатели свободного места на диске и хотел бы предсказать, когда диск будет заполнен.
Я подумал, что могу использовать series_decompose_forecast
Вот пример запроса:
let DiskSpace =
range Timestamp from ago(60d) to now() step 1d
| order by Timestamp desc
| serialize rn=row_number() + 10
| extend FreeSpace = case
(
rn % 5 == 0, rn + 5
, rn % 3 == 0, rn -4
, rn % 7 == 0, rn +3
, rn
)
| project Timestamp, FreeSpace;
DiskSpace
| make-series
FreeSpace = max(FreeSpace) default= long(null)
on Timestamp from ago(60d) to now() step 12h
| extend FreeSpace = series_fill_backward(FreeSpace)
| extend series_decompose_forecast(FreeSpace, 24)
| render timechart
И результат
Кажется, что базовый уровень может показать мне, когда он достигнет нуля (или какого-либо другого порога), но если я укажу больше Points
, он исключит больше точек из процесса обучения (все еще не уверен, исключает ли он их в начале или в конце).
Меня даже не волнует весь временной ряд, только дата исчерпания свободного места. Это правильный подход?
Если вы посмотрите на пример: https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/series-decompose-forecastfunction Вы увидите, что они добавляют 0 слотов в «будущее» исходного ряда, которое затем предсказывает прогноз.
Об этом также говорится в примечаниях:
Динамический массив исходного входного ряда должен включать в себя количество прогнозируемых слотов точек. Прогноз обычно делается с помощью make-series и указания конечного времени в диапазоне, который включает прогнозируемый период времени.
Чтобы ваш пример работал:
let DiskSpace =
range Timestamp from ago(60d) to now() step 1d
| order by Timestamp desc
| serialize rn=row_number() + 10
| extend FreeSpace = case
(
rn % 5 == 0, rn + 5
, rn % 3 == 0, rn -4
, rn % 7 == 0, rn +3
, rn
)
| project Timestamp, FreeSpace;
DiskSpace
// add 4 weeks of empty slots in the "future" - these slots will be forecast
| make-series FreeSpace = max(FreeSpace) default=long(null) on Timestamp from ago(60d) to now()+24h*7*4 step 12h
| extend FreeSpace = series_fill_backward(FreeSpace)
| extend forecast=series_decompose_forecast(FreeSpace, 7*4*2)
| render timechart
Документация могла бы быть немного яснее, но я думаю, что параметр points
просто пропускает последние N
точки из обучения (поскольку они пусты, и вы не хотите включать их в свою модель прогноза)
Вывод:
Чтобы получить, когда вы нажмете близко к 0:
let DiskSpace =
range Timestamp from ago(60d) to now() step 1d
| order by Timestamp desc
| serialize rn=row_number() + 10
| extend FreeSpace = case
(
rn % 5 == 0, rn + 5
, rn % 3 == 0, rn -4
, rn % 7 == 0, rn +3
, rn
)
| project Timestamp, FreeSpace;
DiskSpace
| make-series FreeSpace = max(FreeSpace) default=long(null) on Timestamp from ago(60d) to now()+24h*7*4 step 12h
| extend FreeSpace = series_fill_backward(FreeSpace)
| extend forecast=series_decompose_forecast(FreeSpace, 7*4*2)
| mv-apply with_itemindex=idx f=forecast to typeof(double) on (
where f <= 0.5
| summarize min(idx)
)
| project AlmostOutOfDiskSpace = Timestamp[min_idx], PredictedDiskSpaceAtThatPoint = forecast[min_idx]
@Zikato Да, я тоже это заметил (несколько показателей по сравнению с базовым уровнем). Я не знаю, в чем причина этого.
Кажется, что series_fit_line() в этом сценарии более чем достаточно. Как только вы получили наклон и точку пересечения, вы можете рассчитать любую точку на линии.
range Timestamp from now() to ago(60d) step -1d
| extend rn = row_number() + 10
| extend FreeSpace = rn + case(rn % 5 == 0, 5, rn % 3 == 0, -4, rn % 7 == 0, 3, 0)
| make-series FreeSpace = max(FreeSpace) default= long(null) on Timestamp from ago(60d) to now() step 12h
| extend FreeSpace = series_fill_forward(series_fill_backward(FreeSpace))
| extend (rsquare, slope, variance, rvariance, interception, line_fit) = series_fit_line(FreeSpace)
| project slope, interception, Timestamp, FreeSpace, line_fit
| extend x_intercept = todatetime(Timestamp[0]) - 12h*(1 + interception / slope)
| project-reorder x_intercept
| render timechart with (xcolumn=Timestamp, ycolumns=FreeSpace,line_fit)
P.S.
Эти советы в P.S. Раздел золотой! Спасибо. попробую и сравню
Мне нужно узнать немного больше о линейной регрессии. Пока расчет x_intercept
мне не ясен. Особенно, если я хочу знать перехват при 10% или 5%.
Это просто линейное уравнение y = ax + b
, где вы ищете y = 0, поэтому x = -b/a
. Базовая единица в нашем случае — 12h
, поэтому x0 — это 1-я точка временного ряда минус 12 часов. Y для x0 - это перехват.
Благодаря вашему объяснению
points
, я наконец понял это. Одно продолжение для series_decompose. Когда я не назначаю его столбцу, это динамический объект с несколькими показателями (базовый уровень, сезонность, тенденция и т. д.). Но когда он назначается столбцу, является ли он базовым?