Ближайший счётчик до и после стандартизации

тема: Расстояния и kNN · уровень: продвинутый

Условие

В файле data.csv находятся сведения о показаниях электросчётчиков квартир дома. Для каждой записи указаны расход электроэнергии за дневной тариф и накопленное показание общего счётчика.

Требуется найти ближайшую к заданной точке запись двумя способами: по исходным признакам и после стандартизации признаков z-оценкой. Номером записи считается значение столбца row_no.

Пусть у запроса признаки (x, y), а у записи i признаки (a_i, b_i). До стандартизации используется квадрат евклидова расстояния: D_i = (a_i - x)^2 + (b_i - y)^2.

Для стандартизации по каждому признаку среди всех строк без пропусков вычисляются среднее μ и генеральное стандартное отклонение σ = sqrt((1/n) * Σ(v_j - μ)^2). Значение признака заменяется на z = (v - μ) / σ. После этого ближайшая запись определяется по квадрату евклидова расстояния между стандартизированными признаками.

Строки с пропуском хотя бы в одном из двух числовых столбцов не участвуют ни в вычислении средних и отклонений, ни в поиске соседей. Гарантируется, что после исключения пропусков остаются строки и оба стандартных отклонения положительны. При равенстве расстояний выбирается запись с меньшим значением row_no. Округление не применяется.

Формат ввода

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

row_no,apartment,day_kwh,total_kwh

Столбец row_no содержит номер записи, apartment содержит код квартиры, day_kwh содержит дневной расход электроэнергии, total_kwh содержит накопленное показание счётчика. В числовых столбцах day_kwh и total_kwh возможны пустые значения.

В стандартный ввод подаются два целых числа x y через пробел: дневной расход и накопленное показание для точки запроса.

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

Выведите два целых числа через пробел: номер ближайшей записи до стандартизации и номер ближайшей записи после стандартизации.

Ограничения

В файле от 300 до 4000 строк данных.

row_no — целое число от 1 до 4000, все значения различны.

Длина кода квартиры apartment составляет от 1 до 12 символов.

Каждое непустое значение day_kwh — целое число от 0 до 1000.

Каждое непустое значение total_kwh — целое число от 0 до 100000.

Во входе 0 ≤ x ≤ 1000, 0 ≤ y ≤ 100000.

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

Куда дальше