Качество данных в pandas: пропуски, дубли и типы без изменений

Проверку качества данных можно выполнить без очистки исходного DataFrame. isna().sum() считает пропуски по столбцам, а duplicated(subset=[...]).sum() — повторные строки по выбранному ключу с учётом keep.

Проверка и исправление — разные операции

Если задача требует только диагностику, не заменяйте пропуски и не удаляйте дубли: это изменит данные, которые нужно оценить. Отдельно проверьте наличие обязательных столбцов и их типы. Чтобы убедиться, что аудит ничего не изменил, можно сравнить таблицу с её копией через pd.testing.assert_frame_equal.

Пример на других данных

import pandas as pd
df = pd.DataFrame({"sku": [11, 11, 12], "price": [100.0, None, 80.0]})
before = df.copy(deep=True)
print(int(df.isna().sum().sum()))
print(int(df.duplicated(subset=["sku"]).sum()))
pd.testing.assert_frame_equal(df, before)
print("Таблица не изменилась")

Результат:

1
1
Таблица не изменилась

Решите задачу

Ниже — условие и редактор Python с проверкой без регистрации. Пример выше показывает приём на других данных; для задачи соблюдайте её формат ввода и результата. Курс NumPy и pandas помогает пройти темы по порядку.

Аудит качества таблицы заказов: read-only проверка без мутаций

Аналитик хочет убедиться, что таблица заказов прошла подготовку корректно, не изменяя её. Для этого нужна функция-аудитор, которая читает DataFrame и возвращает словарь диагностических показателей.

Что уже дано

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система вызывает audit_prepared_orders(df), передавая готовый pd.DataFrame. Функция должна быть определена в вашем коде. Никаких файлов и глобальных переменных система не создаёт.

Для вызова функции проверяющая система использует DataFrames с четырьмя столбцами:

  • 'order_id' — целые числа;
  • 'status' — строки (object);
  • 'order_date' — может быть datetime64 или строковым столбцом;
  • 'amount' — числа с плавающей точкой.

Что нужно сделать

Реализуйте функцию audit_prepared_orders(df: pd.DataFrame) -> dict, которая:

  1. Не изменяет исходный DataFrame — никаких fillna, drop_duplicates, str.lower или других мутирующих операций.
  2. Возвращает словарь со следующими ключами (все значения — скаляры или булевы):
Ключ Тип Смысл
'has_required_columns' bool все четыре столбца 'order_id', 'status', 'order_date', 'amount' присутствуют в df.columns
'total_missing' int суммарное число пропусков во всём DataFrame (df.isna().sum().sum())
'duplicate_order_ids' int число строк, помеченных как дубли по 'order_id' с keep='first' (то есть df.duplicated(subset=['order_id'], keep='first').sum())
'status_normalized' bool все значения в столбце 'status' совпадают с результатом .str.strip().str.lower() (то есть нет значений с лишними пробелами или заглавными буквами)
'order_date_is_datetime' bool dtype столбца 'order_date' начинается с 'datetime64'
'is_ready' bool True тогда и только тогда, когда все остальные пять условий выполнены одновременно: has_required_columns равно True, total_missing равно 0, duplicate_order_ids равно 0, status_normalized равно True, order_date_is_datetime равно True

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система вызывает audit_prepared_orders(df) с позиционным аргументом и проверяет возвращаемый словарь:

  • тип возвращаемого значения — dict;
  • все шесть ключей присутствуют;
  • значения вычислены по формулам, описанным выше;
  • исходный DataFrame после вызова функции не изменён.

Пример использования

import pandas as pd

df_ready = pd.DataFrame({
 'order_id': [1, 2, 3],
 'status': ['pending', 'done', 'failed'],
 'order_date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']),
 'amount': [100.0, 200.0, 50.0],
})
result = audit_prepared_orders(df_ready)
print(result['has_required_columns'])
print(result['total_missing'])
print(result['duplicate_order_ids'])
print(result['status_normalized'])
print(result['order_date_is_datetime'])
print(result['is_ready'])

Результат:

True
0
0
True
True
True
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи