Модуль: Полный цикл предобработки данных


Универсальный очиститель данных

☰ Теория

Универсальный pipeline отделяет механизм от правил предметной области. Код не знает заранее названий столбцов и допустимых диапазонов: всё это передаётся в rules.

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

Полная теория по предобработке данных →

Универсальный очиститель данных

Дополнительный уровень. В лаборатории правила были связаны с одной таблицей. Теперь нужно отделить механизм очистки от предметной области: одна программа должна обрабатывать разные таблицы по переданному описанию правил.

Проверка идёт на скрытых датасетах. Меняются названия столбцов, предметная область, диапазоны и стратегии пропусков. Имена из лаборатории нельзя зашивать в решение.

Вход

На вход подаётся один JSON-объект с полями rules и data. data — список строк таблицы в виде словарей; исходные значения приходят строками.

payload = json.load(sys.stdin)
rules = payload["rules"]
df = pd.DataFrame(payload["data"], dtype="string")
Правила
  • missing_markers — точные строковые маркеры пропуска;
  • для текста: case = none/lower/upper/title;
  • для числа: min, max, необязательный список remove;
  • missing.action = leave/drop_row/median/constant;
  • при constant есть поле value;
  • drop_duplicates определяет удаление полных дублей после остальных преобразований.
Порядок
  1. Сделать копию.
  2. В описанных столбцах выполнить strip и заменить маркеры на pd.NA.
  3. Привести текст к нужному регистру; числа — через pd.to_numeric(..., errors="coerce").
  4. Нарушения min/max сделать NaN.
  5. Сначала удалить drop_row-строки, затем применить остальные missing-стратегии.
  6. Медиану считать после удаления drop_row-строк. Если все значения отсутствуют, ничего не заполнять.
  7. В конце при необходимости удалить полные дубли.
Выход

Выведите JSON {"audit": ..., "data": ...}. В audit нужны rows_before, rows_after, rows_dropped_missing, duplicates_removed, invalid_to_missing, missing_after.

Пропуск выводится как JSON null; числа — как числа с плавающей точкой. Используйте json.dumps(..., ensure_ascii=False, sort_keys=True, separators=(",", ":")).

Смысл задачи: универсальным становится не «понимание данных», а механизм. Знание о допустимых диапазонах и стратегиях остаётся снаружи — в rules.

Примеры
№Входные данныеВыходные данные
1
{
  "rules": {
    "missing_markers": [
      "",
      "-",
      "N/A",
      "unknown"
    ],
    "columns": {
      "name": {
        "type": "text",
        "case": "title",
        "missing": {
          "action": "drop_row"
        }
      },
      "city": {
        "type": "text",
        "case": "title",
        "missing": {
          "action": "constant",
          "value": "Unknown"
        }
      },
      "age": {
        "type": "number",
        "min": 0,
        "max": 120,
        "missing": {
          "action": "leave"
        }
      },
      "score": {
        "type": "number",
        "min": 0,
        "max": 100,
        "missing": {
          "action": "median"
        }
      }
    },
    "drop_duplicates": true
  },
  "data": [
    {
      "name": " alice ",
      "city": " new york ",
      "age": "15",
      "score": "90"
    },
    {
      "name": "ALICE",
      "city": "new york",
      "age": "15",
      "score": "90"
    },
    {
      "name": "Bob",
      "city": "-",
      "age": "140",
      "score": "80"
    },
    {
      "name": "Charlie",
      "city": "Paris",
      "age": "16",
      "score": "unknown"
    },
    {
      "name": "",
      "city": "London",
      "age": "17",
      "score": "70"
    },
    {
      "name": "Dora",
      "city": "Paris",
      "age": "18",
      "score": "100"
    }
  ]
}
{"audit":{"duplicates_removed":1,"invalid_to_missing":{"age":1,"score":0},"missing_after":{"age":1,"city":0,"name":0,"score":0},"rows_after":4,"rows_before":6,"rows_dropped_missing":1},"data":[{"age":15.0,"city":"New York","name":"Alice","score":90.0},{"age":null,"city":"Unknown","name":"Bob","score":80.0},{"age":16.0,"city":"Paris","name":"Charlie","score":90.0},{"age":18.0,"city":"Paris","name":"Dora","score":100.0}]}

Напишите программу
Auto
       

time 4000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам