pandas: группировки, соединения и упорядоченные показатели

merge и concat: соединение таблиц с контролем кардинальности

Содержание курса

Суффиксы и validate: merge двух таблиц с общим столбцом-не-ключом

Что уже дано

Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.

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

Напишите программу, которая работает с двумя таблицами: складом (warehouse) и поставщиком (supplier). Обе таблицы содержат столбец rating (помимо ключа), поэтому при merge появятся суффиксы.

  1. Читает из stdin целое число w — количество строк таблицы склада.
  2. Читает следующие w строк; каждая содержит три токена через пробел: item_id (целое число), stock (целое число), rating (вещественное число). Создаёт pd.DataFrame с именем warehouse и столбцами 'item_id', 'stock', 'rating'.
  3. Читает целое число s — количество строк таблицы поставщика.
  4. Читает следующие s строк; каждая содержит три токена через пробел: item_id (целое число), supply (целое число), rating (вещественное число). Создаёт pd.DataFrame с именем supplier и столбцами 'item_id', 'supply', 'rating'.
  5. Шаг A. outer join с явными суффиксами. Выполняет:
merged = pd.merge(warehouse, supplier, on='item_id', how='outer',
suffixes=('_wh', '_sup'))

Выводит одну строку: cols=<список имён столбцов>list(merged.columns) как строку Python.
Затем выводит: nan_supply=<k> — число NaN в столбце 'supply'.
Затем выводит: nan_rating_sup=<k> — число NaN в столбце 'rating_sup'.
6. Шаг B. validate='one_to_one' — ожидаемая ошибка. Выполняет merge с теми же параметрами плюс validate='one_to_one' внутри try/except и при поимке pd.errors.MergeError выводит строку: validate=error.
7. Шаг C. validate='one_to_many' — успешное соединение. Выполняет inner join тех же таблиц с validate='one_to_many' и suffixes=('_wh', '_sup'). Выводит одну строку: validate=ok shape=<shape>.

Ввод и вывод

Программа читает stdin и пишет в stdout.

Ограничения: w >= 1, s >= 1.

Формат ввода

w
item_id stock rating
...
s
item_id supply rating
...

Гарантируется:

  • ключ item_id уникален в таблице warehouse (one side);
  • в таблице supplier хотя бы один item_id встречается более одного раза (many side), поэтому validate='one_to_one' обязан выбросить MergeError;
  • хотя бы один item_id из warehouse отсутствует в supplier (порождает NaN в supply и rating_sup при outer join);
  • хотя бы один item_id из supplier отсутствует в warehouse (порождает NaN в stock и rating_wh).

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

Ровно пять строк:

cols=<list>
nan_supply=<k>
nan_rating_sup=<k>
validate=error
validate=ok shape=(<r>, <c>)
О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (1)
  • Тест 1
    Ввод
    3
    1 100 4.5
    2 200 3.8
    3 150 4.0
    4
    1 50 4.2
    2 80 3.5
    2 60 3.9
    5 90 4.7
    
    Ожидаемый вывод
    cols=['item_id', 'stock', 'rating_wh', 'supply', 'rating_sup']
    nan_supply=1
    nan_rating_sup=1
    validate=error
    validate=ok shape=(3, 5)
    
Решение
Как проверяется решение

Сравнение вывода: Правила исходной проверяющей системы. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

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