Как предсказать, когда на диске закончится место?

Я регулярно собираю показатели свободного места на диске и хотел бы предсказать, когда диск будет заполнен.

Я подумал, что могу использовать 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, он исключит больше точек из процесса обучения (все еще не уверен, исключает ли он их в начале или в конце).

Меня даже не волнует весь временной ряд, только дата исчерпания свободного места. Это правильный подход?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы посмотрите на пример: 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]
Почти OutOfDiskSpace PredictedDiskSpaceAtThatPoint 12.05.2022 13:02:24 0,32277009977544

Благодаря вашему объяснению points, я наконец понял это. Одно продолжение для series_decompose. Когда я не назначаю его столбцу, это динамический объект с несколькими показателями (базовый уровень, сезонность, тенденция и т. д.). Но когда он назначается столбцу, является ли он базовым?

Zikato 25.11.2022 09:23

@Zikato Да, я тоже это заметил (несколько показателей по сравнению с базовым уровнем). Я не знаю, в чем причина этого.

ChrisWue 27.11.2022 21:02
Ответ принят как подходящий

Кажется, что 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)
x_intercept 2022-12-06T01:56:54.0389796Z

Скрипка

P.S.

  • Нет необходимости в сериализации после заказа.
  • Нет необходимости в порядке, если вы создаете диапазон в обратном порядке.
  • Нулевое значение во временном ряду нарушает многие функции (исправлено с помощью дополнительного series_fill_forward)

Эти советы в P.S. Раздел золотой! Спасибо. попробую и сравню

Zikato 25.11.2022 12:46

Мне нужно узнать немного больше о линейной регрессии. Пока расчет x_intercept мне не ясен. Особенно, если я хочу знать перехват при 10% или 5%.

Zikato 28.11.2022 08:28

Это просто линейное уравнение y = ax + b, где вы ищете y = 0, поэтому x = -b/a. Базовая единица в нашем случае — 12h, поэтому x0 — это 1-я точка временного ряда минус 12 часов. Y для x0 - это перехват.

David דודו Markovitz 28.11.2022 10:01

Другие вопросы по теме