Соотношения реальной температуры и прогноза Яндекс.Погоды

от автора

Утром, когда завтракаю, почти ежедневно просматриваю Яндекс.Погоду и у меня переодически возникает чувство дежавю, но только наоборот. Глядишь — одна температура на выходные указана, а на другой день смотришь — уже совем другие показатели температуры обещаны. Потихоньку начинаешь сомневаться в своей памяти (30 лет — это же уже четвёртый десяток начался). Но чтобы окончательно не пасть духом — я решил проверить, насколько прогноз соотносится с реальной температурой.

Голубая линия — это реальная температура. Оранжевая область — это диапазон предсказаний.
image
Источник картинки.

Немного технических деталей

Первым делом поставил в крон скрипт, который каждый час сохраняет страницу Яндекс.Погоды в виде html файла и оставил его поработать некоторое время.

curl https://yandex.ru/pogoda/novosibirsk > test/`date +%Y-%m-%d-%H-%M`

Следующим шагом написал небольшой php скрипт, поражающий своей простотой и лаконичностью, для парсинга сохраненных файлов и формирования json файлов, которые, в свою очередь, используются для отображения графиков. Пример обработки сохраненного дня:

function parseFile($day) {      global $mega, $csv, $realT;     $predicts = [];      $html = file_get_html(__DIR__ . '/test/' . $day);     foreach($html->find('.forecast-brief_cols_10') as $element) {         foreach ($element->find('.forecast-brief__item-temp-day') as $s) {             $predicts[] = str_replace('−', '-', $s->plaintext);         }     }      $dayDate = date_create_from_format("Y-m-d-H-i", $day);     $dayDateString = date_format($dayDate, 'Y-m-d H:i:s');     $dayArr = explode('-', $day);      if ($dayArr[3] == 14) {         foreach($html->find('.current-weather__thermometer_type_now') as $s) {             $realT[] = [                 intval(date_format($dayDate, 'U') . '000'),                 intval(str_replace('−', '-', $s->plaintext))             ];         }     }      for ($i = 1; $i < count($predicts); $i++) {          $nextDay = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($dayDateString)));         $nextDayArr = explode('-', $nextDay);          $line = [             'Y' => $dayArr[0],             'm' => $dayArr[1],             'd' => $dayArr[2],             'H' => $dayArr[3],             'i' => $dayArr[4],             '_m' => $nextDayArr[1],             '_d' => $nextDayArr[2],             '_C' => $predicts[$i]         ];          $mega[] = $line;         $csv .= join(';', array_values($line)) . "\n";     } }

Для внесения ясности

  • Прогнозом я считал дневные температуры дня, показанные не на текущий день (на картинке нижний длинный выделенный прямоугольник);
  • Реальную температуру я брал из верхнего выделенного прямоугольника в 14:25

image

Результат вы могли видеть в начале статьи, где реальная температура пытается проползти сквозь диапозон предсказаний, но что ей удаётся не всегда. Посмотреть подробнее и потыкать на разные даты можно здесь.

Примеры графиков предсказаний температуры для конкретного дня:
image
image

Вывод

Память моя в порядке, можно не волноваться.

ссылка на оригинал статьи https://geektimes.ru/post/283950/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *