ROC-AUC прогноза солнечной выработки

тема: Метрики классификации · уровень: продвинутый

Условие

Солнечная электростанция хранит сведения о панелях в файле data.csv, а результаты отдельных измерений выработки — в файле events.csv. Для каждой панели требуется объединить все её измерения с известной выработкой.

Средняя измеренная выработка панели равна среднему значению energy_wh только по строкам events.csv, где это поле не пустое. Панель считается положительным объектом, если её средняя выработка не меньше заданного порога T, и отрицательным объектом иначе.

Качество столбца forecast_score измеряется метрикой ROC-AUC. Рассматриваются все пары из одной положительной и одной отрицательной панели. Пара даёт 1 балл, если forecast_score положительной панели больше, 0 баллов, если он меньше, и 0.5 балла при равенстве. ROC-AUC равен сумме баллов по всем таким парам, делённой на число пар.

Если значения forecast_score у положительной и отрицательной панелей равны, такая пара вносит 0.5 балла. У каждой панели есть хотя бы одно измерение с непустым energy_wh; после применения любого допустимого порога существуют и положительные, и отрицательные панели.

Формат ввода

Рядом с программой находятся два файла в кодировке UTF-8 с разделителем-запятой.

Файл data.csv содержит заголовок и строки вида panel_id,station,forecast_score:

Файл events.csv содержит заголовок и строки вида event_id,panel_id,measured_at,energy_wh:

В stdin подаётся одно вещественное число T — порог средней измеренной выработки.

Формат вывода

Выведите одно число — значение ROC-AUC, округлённое до трёх знаков после десятичной точки.

Ограничения

В data.csv от 300 до 4000 строк с данными. panel_id находится в диапазоне от 1 до 1000000, длина station — от 2 до 12 символов, forecast_score — целое число от 0 до 1000.

В events.csv от 300 до 4000 строк с данными. event_id находится в диапазоне от 1 до 10000000, каждый panel_id существует в data.csv, длина measured_at равна 10, непустое значение energy_wh — целое число от 0 до 100000.

Порог T находится в диапазоне от 81.0 до 199.0.

Решить задачу с автопроверкой на Python →

Куда дальше