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

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

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

© Geektimes