PHP получает пик из набора данных со значением и меткой времени

#php #dataset

#php #набор данных

Вопрос:

Мне нужно получить пик из набора данных с помощью PHP. Этот набор данных состоит из метки времени и значения. Мне нужно получить 3 пика, как на изображении, с относительной меткой времени 3

Это графическое представление набора данных: введите описание изображения здесь

Но мне не нужно повторно представлять графически, я бы хотел просто вернуть массив из трех значений / меток времени. Мне также нужен какой-то порог, чтобы избежать положительного пика flase, например, минимальное изменение, например, от 0 до 400 (я определю его на всякий случай, но мне нужен порог)

Вы можете найти пример набора данных здесь: https://wetransfer.com/downloads/d7d20a726285ea29ae2ff682764b045020210401192032/13e788

Большое спасибо за помощь, я застрял с этим. Я искал в Stackoverflow, я вижу какой-то алгоритм, но я не могу применить его к своей необходимости

Комментарии:

1. Опубликуйте текстовый пример набора данных.

2. Учитывая большое количество записей или чтений, есть ли вероятность, что вы сначала импортируете их в (возможно, временную) таблицу базы данных? Если это так, то задача относительно проста, и я могу помочь.

3. AbraCadaver я опубликовал это, там есть ссылка на JSON. Stefanov.sm я могу использовать MySQL 5, я предпочитаю PHP-способ, но я открыт для альтернативного решения. Я не знаю, кто отклонил этот пост, мне было ясно, и я добавил всю необходимую информацию…

Ответ №1:

Я думаю, что размер вашей выборки данных говорит о том, что база данных является подходящим инструментом для этой работы. Итак, предполагая, что данные уже хранятся в таблице readings с двумя числовыми столбцами — ts и reading , тогда этот запрос может помочь.

 select ts, reading 
  from
  (
    select ts, reading, lag(reading) over (order by ts) as variation from readings
  ) as t
 where variation < 400 -- or whatever your threshold value may be
 order by reading desc 
 limit 3;
 

Это диалект Postgresql, который мне больше всего нравится. При необходимости вы можете переписать его на другом диалекте SQL, а затем легко извлечь результирующие данные в PHP, используя, например, PDO.

Комментарии:

1. У меня нет функции ЗАДЕРЖКИ, так как моя версия MySQL ее не поддерживает, но в любом случае спасибо за попытку

2. Будет трудно отфильтровать ложные срабатывания по варианту без оконных функций. Пожалуйста. обратите внимание, что вы можете использовать SQLite, который представляет собой небольшой общий объект или библиотеку DLL, не требующую установки. Он поддерживает lag и PHP PDO и выполнит свою работу. Я думаю, что приведенный выше запрос будет работать под SQLite.