Pandas для анализа данных: практический курс

Курс предназначен для разработчиков с базовым знанием Python, желающих освоить библиотеку Pandas для решения реальных рабочих задач. Вы научитесь загружать, очищать и анализировать табличные данные, а также подготавливать датасеты для машинного обучения и автоматизировать отчетность.

1. Структуры данных и импорт файлов

Инструмент для таблиц: почему не Excel и не стандартный Python

Анализ данных часто начинается с таблиц. Если вы когда-нибудь пытались обрабатывать табличные данные с помощью стандартных списков и словарей Python, вы знаете, насколько это трудоемко. Написание вложенных циклов, постоянные проверки на пустые значения и десятки строк кода ради простейшей группировки делают процесс медленным и подверженным ошибкам.

С другой стороны, существует Excel — отличный инструмент для визуального просмотра и базовых расчетов. Но у него есть физические ограничения. Если количество строк в вашем файле , Excel просто не сможет открыть его полностью. Кроме того, ручные операции в Excel сложно автоматизировать и масштабировать.

Библиотека Pandas решает обе эти проблемы. Это швейцарский нож для табличных данных в экосистеме Python. Она загружает данные в оперативную память компьютера и позволяет фильтровать миллионы строк, находить аномалии и объединять разные файлы за доли секунды с помощью пары строк элегантного кода.

Установка и негласный контракт разработчиков

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

В мире анализа данных существует жесткое правило импорта этой библиотеки. Никто не пишет просто import pandas. Все разработчики договорились использовать сокращение (алиас) pd. Это стандарт, который вы встретите в любом чужом коде, документации или ответе на форуме:

Анатомия таблиц: Series и DataFrame

Вся магия Pandas строится на двух базовых структурах данных. Понимание их внутреннего устройства — ключ к эффективной работе с библиотекой.

Series: умная колонка

Series — это одномерный массив данных. Визуально его можно представить как одну колонку в таблице. Главное отличие Series от обычного списка Python заключается в наличии индекса — встроенной системы меток для каждого элемента.

Представьте обычный список продаж за три дня: [150, 200, 120]. В Python вы обращаетесь к ним по порядковым номерам (0, 1, 2). В Pandas вы можете привязать к каждому значению осмысленную метку, например, дату.

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

DataFrame: царь-таблица

DataFrame — это двумерная структура данных, состоящая из строк и столбцов. По сути, это классическая таблица.

С технической точки зрения DataFrame — это набор объектов Series, которые имеют общий индекс. Если Series — это отдельная колонка, то DataFrame — это вся таблица целиком, где каждая колонка имеет свое имя (заголовок), а все строки связаны единым индексом.

!Схема структуры DataFrame

Создать DataFrame с нуля можно из обычного словаря Python. Это невероятно полезно для быстрого прототипирования или создания небольших тестовых наборов данных.

В результате выполнения этого кода ключи словаря станут названиями столбцов, а списки — их содержимым. Pandas автоматически сгенерирует числовой индекс от 0 до 2.

Импорт данных из внешних источников

В реальной работе аналитика данные редко создаются вручную. Обычно они выгружаются из баз данных, CRM-систем или предоставляются заказчиком в виде файлов. Самый популярный формат обмена табличными данными — CSV (Comma-Separated Values).

Чтение CSV-файлов

Для загрузки CSV-файла используется функция read_csv(). В самом простом сценарии достаточно передать ей путь к файлу:

Однако реальные данные редко бывают идеальными. Часто при попытке открыть файл вы можете столкнуться с ошибками или получить нечитаемый текст («кракозябры»). Для решения этих проблем у функции read_csv() есть десятки параметров. Рассмотрим самые важные:

  • sep (разделитель). По стандарту в CSV значения разделяются запятой. Но в русскоязычных системах запятая часто используется как разделитель целой и дробной части числа (), поэтому колонки разделяют точкой с запятой. Если таблица склеилась в одну строку, укажите разделитель явно: sep=';'.
  • encoding (кодировка). Если текст в файле отображается некорректно, скорее всего, проблема в кодировке. Для файлов, созданных в старых версиях Windows, часто помогает encoding='windows-1251'. Современный стандарт — encoding='utf-8'.
  • index_col (колонка-индекс). Если в вашем файле уже есть колонка с уникальными идентификаторами (например, ID клиента), вы можете сразу сделать ее индексом таблицы: index_col='client_id'.
  • Пример надежного импорта проблемного файла:

    Работа с Excel

    Pandas также отлично справляется с файлами Excel (форматы .xls и .xlsx). Для этого используется функция read_excel().

    > Важное отличие: файлы Excel могут содержать несколько листов. По умолчанию Pandas загружает только первый лист. > > Документация Pandas

    Если вам нужен конкретный лист, укажите его название в параметре sheet_name:

    Первое знакомство с датасетом

    Представьте: вы успешно загрузили файл на строк. Выводить всю таблицу на экран бессмысленно — это перегрузит интерфейс и не даст вам никакой полезной информации. Вместо этого в Pandas есть три метода для быстрого аудита загруженных данных.

    1. Осмотр структуры: head() и tail()

    Метод head() выводит первые 5 строк таблицы. Этого достаточно, чтобы визуально оценить, правильно ли загрузились данные, корректно ли определились заголовки и нет ли смещения колонок.

    Если вам нужно посмотреть последние строки (например, чтобы проверить свежие записи, если данные отсортированы по времени), используйте метод tail().

    2. Оценка масштаба: атрибут shape

    Чтобы узнать точный размер таблицы, обратитесь к атрибуту shape. Обратите внимание: это свойство таблицы, а не функция, поэтому скобки на конце не ставятся.

    Результатом будет кортеж из двух чисел, например (500000, 14). Это означает, что в вашей таблице ровно 500 тысяч строк и 14 столбцов. Понимание размерности критически важно перед запуском ресурсоемких операций.

    3. Технический паспорт таблицы: info()

    Метод info() — это рентгеновский снимок вашего датасета. Он выводит сводную техническую информацию:

  • Общее количество строк и столбцов.
  • Названия всех колонок.
  • Количество непустых (non-null) значений в каждой колонке.
  • Тип данных каждой колонки (числа, строки, даты).
  • Объем оперативной памяти, который занимает таблица.
  • | Колонка | Non-Null Count | Dtype | | :--- | :--- | :--- | | client_id | 500000 non-null | int64 | | email | 498200 non-null | object | | total_spent | 500000 non-null | float64 |

    В этом примере мы сразу видим проблему: в колонке email всего 498 200 заполненных значений при общем количестве строк в 500 000. Это значит, что у 1 800 клиентов не указана электронная почта. Такие пропуски — частая головная боль аналитика, и метод info() позволяет обнаружить их в первые же секунды работы.

    Освоив правильный импорт и первичный осмотр данных, вы закладываете надежный фундамент. Ошибка на этапе чтения файла (например, неправильная кодировка или потерянный разделитель) может исказить все последующие результаты анализа.

    2. Очистка и предобработка данных

    Анатомия хаоса: как превратить сырые данные в надежный фундамент

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

    Процесс приведения сырой информации к виду, пригодному для анализа и построения моделей машинного обучения, называется очисткой данных (data cleaning).

    В среде аналитиков и дата-саентистов существует негласное правило, которое звучит как «мусор на входе — мусор на выходе» (garbage in, garbage out). Если вы скормите алгоритму или аналитическому отчету неочищенные данные, результаты будут математически точными, но логически ошибочными.

    Представьте простую бытовую ситуацию. Вы с друзьями купили конфеты и решили записать, сколько штук достанется каждому, чтобы разделить их поровну. Вы вносите данные в таблицу:

    | Имя | Количество конфет | | :--- | :--- | | Петр | 5 | | Анна | 20 | | Анна | 20 | | Иван | 3 | | Ахмед | 12 |

    Если вы просто вычислите среднее арифметическое по колонке с числами, получится, что каждому должно достаться по 12 конфет. Но в таблице допущена ошибка: строка с Анной продублирована. Из-за этого общее количество конфет в расчетах стало равно 60 вместо реальных 40, а количество людей — 5 вместо 4. Попытка раздать всем по 12 конфет приведет к тому, что сладости закончатся раньше времени. В масштабах бизнеса такая ошибка может стоить компании миллионов рублей из-за неправильно рассчитанного бюджета или неверно установленной цены на продукт.

    !Схема процесса очистки данных: от хаоса к структуре

    Поиск невидимых проблем: аудит датасета

    Прежде чем что-то удалять или изменять, необходимо понять масштаб трагедии. Для этого в Pandas существуют инструменты диагностики.

    Когда таблица загружена в переменную df (сокращение от DataFrame), первым делом стоит проверить наличие пустых ячеек. В Pandas отсутствие данных обозначается специальным маркером NaN (Not a Number).

    Метод isnull() проходит по каждой ячейке таблицы и возвращает логическое значение: True (пусто) или False (заполнено). Следующий за ним метод sum() суммирует все значения True для каждого столбца. В результате вы получаете компактный список колонок с точным количеством пропусков в каждой.

    Вторая частая проблема — полные дубликаты строк. Они возникают, когда пользователь случайно дважды нажал кнопку отправки формы, или произошел сбой при выгрузке из базы данных.

    Искусство работы с пустотой

    Обнаружив пропуски (NaN), аналитик должен принять решение: удалить их или чем-то заполнить. Универсального ответа нет, стратегия зависит от природы данных и бизнес-задачи.

    Стратегия 1: Хирургическое удаление

    Если пропусков мало (обычно менее 5% от общего объема данных), самым безопасным решением будет просто удалить строки с пустыми ячейками. Для этого используется метод dropna().

    По умолчанию этот метод удаляет строки (ось ). Но иногда бывает так, что в таблице из 100 колонок одна колонка пуста на 90%. В таком случае логичнее удалить саму колонку, а не строки. Для этого нужно явно указать ось :

    Стратегия 2: Интеллектуальное заполнение

    Удаление данных — это всегда потеря информации. Если в строке из 50 параметров не заполнено только одно поле, удалять всю строку расточительно. В таких случаях пропуски заполняют с помощью метода fillna().

    Чем заполнять? Зависит от логики колонки:

  • Статичным значением. Если в колонке «Сумма скидки» стоит пропуск, логично предположить, что скидки просто не было. Мы можем смело заполнить пустоту нулем: df['discount'].fillna(0).
  • Средним арифметическим. Подходит для числовых данных без сильных выбросов. Например, рост группы взрослых людей.
  • Медианой. Это значение, которое делит отсортированный набор данных ровно пополам. Медиана устойчива к аномалиям.
  • Рассмотрим пример с медианой. Допустим, у нас есть зарплаты пяти сотрудников отдела: 50, 60, 70, 80 и 1000 (зарплата начальника). Среднее арифметическое составит 252. Если мы заполним пропуск у нового рядового сотрудника числом 252, мы сильно исказим реальность. Медиана же в этом ряду равна 70. Это гораздо более адекватная оценка для типичного сотрудника.

    Атака клонов: устранение дубликатов

    Дубликаты коварны тем, что они не вызывают системных ошибок, но незаметно искажают статистику. Если один и тот же клиент случайно попал в базу трижды, ваша конверсия в покупку будет рассчитана неверно.

    Для очистки таблицы от клонов применяется метод drop_duplicates().

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

    Трудности перевода: приведение типов данных

    Часто данные загружаются в Pandas не в том формате, в котором мы ожидаем. Вы можете смотреть на колонку с ценами и видеть числа, но для компьютера это может быть просто текст (в Pandas текстовый тип называется object).

    Если вы попытаетесь сложить текстовые «100» и «50», вы получите не математическое число 150, а склеенную строку «10050».

    Почему числа становятся текстом? Обычно из-за посторонних символов. Например, цена записана как «1 500 руб.» или дробное число использует запятую вместо точки («3,14»).

    Чтобы превратить это в полноценные числа, нужно сначала очистить строку от мусора с помощью строковых методов (обращение через .str), а затем изменить тип данных методом astype().

    После этих манипуляций колонка price станет числовой, и вы сможете применять к ней любые математические операции.

    Охота на аномалии: логическая фильтрация

    Последний этап базовой очистки — проверка данных на здравый смысл. Аномалии (выбросы) — это значения, которые технически записаны верно, но логически невозможны или крайне маловероятны.

    Например, возраст клиента или . Цена товара . Такие данные появляются из-за опечаток или сбоев датчиков.

    В Pandas отфильтровать аномалии можно с помощью логических условий. Мы передаем таблице условие в квадратных скобках, и она оставляет только те строки, для которых условие выполняется (равно True).

    Обратите внимание на синтаксис: каждое отдельное условие обязательно берется в круглые скобки, а между ними ставится знак амперсанда &, который означает логическое «И». Если нужно использовать логическое «ИЛИ», применяется вертикальная черта |.

    Очистка данных — это не просто механическое применение функций. Это процесс, требующий от аналитика погружения в предметную область. Вы должны понимать, откуда взялись данные, что означает каждая колонка и какие значения для нее являются нормальными. Только после тщательной предобработки датасет становится надежным фундаментом для поиска инсайтов и обучения нейросетей.

    3. Фильтрация, группировка и агрегация

    От сырых строк к бизнес-инсайтам: фильтрация, агрегация и сводные таблицы

    После того как данные загружены в память и очищены от пропусков, дубликатов и аномалий, перед аналитиком встает главная задача — заставить эти данные говорить. Сама по себе таблица из миллиона строк не имеет ценности для бизнеса. Ценность представляют ответы на конкретные вопросы: «Какой регион приносит больше всего выручки?», «Какие товары покупают чаще всего?», «Как изменились продажи по сравнению с прошлым месяцем?».

    Чтобы получить эти ответы, необходимо научиться извлекать из массива нужные фрагменты, вычислять итоговые метрики и перестраивать структуру таблицы. В Pandas для этого используется триада инструментов: продвинутая фильтрация, группировка и агрегация.

    Умная фильтрация: поиск иголки в стоге сена

    В предыдущем материале мы рассматривали базовую логическую фильтрацию с использованием операторов сравнения (, ). Однако в реальных задачах условия редко бывают такими простыми.

    Представьте, что вы работаете с базой данных транзакций крупного интернет-магазина. Вам нужно проанализировать продажи только в трех конкретных городах: Москве, Казани и Екатеринбурге. Писать длинную цепочку условий с логическим «ИЛИ» неудобно и чревато ошибками. Для проверки принадлежности значения к заданному списку в Pandas существует элегантный метод .isin().

    Еще одна частая задача — поиск по тексту. Допустим, вам нужно найти все заказы, в которых фигурирует слово «Смартфон», независимо от конкретной модели или бренда. В этом случае на помощь приходят строковые методы Pandas, доступные через аксессор .str.

    В этом примере мы сначала привели все названия товаров к нижнему регистру с помощью .lower(), а затем использовали .contains() для поиска подстроки. Это защищает нас от ситуаций, когда товар записан как «СМАРТФОН» или «Смартфон» — фильтр сработает в любом случае.

    Агрегация: от частного к общему

    Агрегация — это процесс преобразования набора значений в одно итоговое число. Это фундамент любой аналитики.

    Математически агрегация описывается простыми формулами. Например, среднее арифметическое вычисляется по формуле , где — сумма всех значений в колонке, а — их количество. Pandas берет всю математику на себя, предоставляя готовые методы для колонок (объектов Series):

    * .sum() — сумма всех значений; * .mean() — среднее арифметическое; * .median() — медиана; * .max() и .min() — максимальное и минимальное значения; * .count() — количество непустых ячеек; * .nunique() — количество уникальных значений.

    Эти методы мгновенно дают общее представление о масштабах бизнеса, но они вычисляют метрики по всему датасету целиком. Настоящая магия начинается, когда мы комбинируем агрегацию с разделением данных на категории.

    Разделяй и властвуй: принцип работы groupby

    Самый мощный аналитический инструмент в Pandas — это метод .groupby(). Он реализует концепцию, которая в мире Data Science называется Split-Apply-Combine.

    > Подход «Разделяй, применяй, комбинируй» (Split-Apply-Combine) является фундаментальным паттерном анализа данных, который позволяет разбивать сложные задачи на управляемые части > > Статья Hadley Wickham о концепции Split-Apply-Combine

    Этот процесс состоит из трех шагов:

  • Split (Разделение): Исходная таблица разбивается на несколько невидимых подтаблиц на основе уникальных значений в выбранной колонке (например, по регионам).
  • Apply (Применение): К каждой подтаблице применяется функция агрегации (например, суммирование выручки).
  • Combine (Объединение): Результаты вычислений склеиваются в новую, компактную таблицу.
  • !Схема работы метода groupby: Разделяй, применяй, комбинируй

    Рассмотрим пример. У нас есть таблица продаж df:

    | Дата | Регион | Категория | Выручка | | :--- | :--- | :--- | :--- | | 01.10 | Север | Мебель | 5000 | | 01.10 | Юг | Техника | 12000 | | 02.10 | Север | Техника | 8000 | | 02.10 | Юг | Мебель | 3000 |

    Мы хотим узнать суммарную выручку по каждому региону.

    Результат выполнения этого кода:

    | Регион | Выручка | | :--- | :--- | | Север | 13000 | | Юг | 15000 |

    Обратите внимание на синтаксис: сначала мы вызываем df.groupby('Регион'), затем в квадратных скобках указываем колонку, которую хотим посчитать ['Выручка'], и в конце применяем метод агрегации .sum().

    Важный технический нюанс: после применения groupby колонка, по которой происходила группировка (в нашем случае «Регион»), становится индексом новой таблицы (ее «номерами строк»). Если вы хотите вернуть ее в виде обычной колонки для дальнейшей работы, используйте метод .reset_index().

    Высший пилотаж: множественная агрегация с методом agg()

    Часто бизнесу недостаточно одной метрики. Руководитель может попросить: «Покажи мне по каждому менеджеру общую сумму продаж, средний чек и количество сделок».

    Делать три отдельные группировки и потом склеивать их — долго и неэффективно. Для решения таких задач используется метод .agg() (сокращение от aggregate). Он позволяет передать словарь, где ключами выступают названия колонок, а значениями — функции, которые нужно к ним применить.

    В результате вы получите таблицу со сложной иерархической шапкой, где над колонкой revenue будут два подзаголовка: sum и mean. Это невероятно мощный инструмент для создания комплексных аналитических отчетов буквально в одну строку кода.

    Сводные таблицы: магия pivot_table

    Группировка отлично работает для одномерного анализа (например, метрики по регионам). Но что если нам нужно посмотреть на данные в двух измерениях одновременно? Например, выручку по регионам и категориям товаров в виде матрицы.

    Те, кто работал в Microsoft Excel, знают инструмент «Сводные таблицы». В Pandas есть его полный аналог — функция pivot_table(). Она позволяет перестроить данные так, чтобы одни значения стали строками, другие — колонками, а на их пересечении расположились агрегированные метрики.

    Если на Севере не было продано ни одной единицы Техники, на пересечении этих строки и столбца образовался бы пропуск (NaN). Параметр fill_value=0 элегантно решает эту проблему, заменяя пустоты нулями.

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

    Освоив фильтрацию, группировку и сводные таблицы, вы переходите от простого хранения данных к их осмыслению. Вы больше не просто смотрите на бесконечные ряды цифр — вы задаете им вопросы и получаете точные, структурированные ответы, на основе которых можно принимать взвешенные бизнес-решения.

    4. Подготовка данных для машинного обучения

    Подготовка данных для машинного обучения: от таблиц к алгоритмам

    Аналитика помогает понять прошлое, а машинное обучение (Machine Learning, ML) — предсказать будущее. В предыдущих материалах мы научились загружать, очищать и агрегировать информацию, чтобы отвечать на вопросы бизнеса. Но что, если наша цель — не просто построить отчет для руководителя, а передать данные алгоритму, который сам найдет скрытые закономерности и сделает прогноз?

    Алгоритмы машинного обучения — это, по своей сути, сложные математические уравнения. Они не умеют читать текст, не понимают смысла слов «Москва» или «Высокий приоритет» и крайне чувствительны к масштабу чисел. Если загрузить в модель сырой датасет, она либо выдаст ошибку, либо сделает совершенно неверные выводы.

    Подготовка данных для ML — это процесс перевода информации с человеческого языка на язык чистой математики. В библиотеке Pandas для этого есть весь необходимый арсенал.

    Оцифровка смыслов: кодирование категориальных признаков

    В реальных данных часто встречаются категориальные признаки — колонки, содержащие текст, который делит объекты на группы. Это могут быть названия городов, цвета автомобилей, статусы заказов или уровни образования.

    Поскольку математическая модель умеет умножать и складывать только числа, текст необходимо закодировать. Самый популярный метод для этого называется унитарным кодированием (One-Hot Encoding).

    Суть метода проста: мы берем одну колонку с текстом и превращаем ее в несколько новых колонок, где каждая новая колонка соответствует одной уникальной категории. Если категория присутствует у объекта, мы ставим 1, если нет — 0.

    Представьте, что у нас есть таблица с данными о клиентах:

    | ID | Город | | :--- | :--- | | 1 | Москва | | 2 | Казань | | 3 | Уфа |

    В Pandas для унитарного кодирования используется встроенная функция pd.get_dummies().

    Результат работы этого кода будет выглядеть так:

    | id | city_Казань | city_Москва | city_Уфа | | :--- | :--- | :--- | :--- | | 1 | 0 | 1 | 0 | | 2 | 1 | 0 | 0 | | 3 | 0 | 0 | 1 |

    Теперь вместо одного текстового столбца у нас три числовых. Модель машинного обучения легко поймет, что клиент с ID 1 живет в Москве, так как в колонке city_Москва стоит единица, а в остальных — нули.

    !Схема конвейера подготовки данных для машинного обучения

    Уравнивание шансов: масштабирование признаков

    Вторая критическая проблема сырых данных — разный масштаб чисел. Допустим, мы прогнозируем вероятность выдачи кредита. У нас есть два признака: возраст клиента (от 18 до 80 лет) и его ежемесячный доход (от 30 000 до 500 000 рублей).

    Многие алгоритмы машинного обучения опираются на вычисление дистанции между точками данных. Если мы оставим цифры как есть, алгоритм решит, что разница в доходе на 10 000 рублей гораздо важнее, чем разница в возрасте на 10 лет, просто потому, что число 10 000 больше числа 10. Доход полностью «задавит» возраст своим масштабом.

    Чтобы этого избежать, применяется масштабирование — приведение всех числовых колонок к единому диапазону, чаще всего от 0 до 1. Этот процесс называется нормализацией.

    Формула минимаксной нормализации выглядит следующим образом:

    Где: * — новое, масштабированное значение; * — текущее значение в ячейке; * — минимальное значение во всей колонке; * — максимальное значение во всей колонке.

    Реализуем эту математику средствами Pandas без использования сторонних библиотек:

    После этой операции клиент с доходом 50 000 получит значение 0.0, клиент со 120 000 — значение 1.0, а клиент с 80 000 окажется где-то посередине (около 0.42). Теперь возраст и доход будут иметь равный вес при обучении модели.

    Умное заполнение пропусков: метод transform

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

    Представьте датасет сотрудников крупной компании. У некоторых из них не указана зарплата. Если мы заполним эти пропуски средней зарплатой по всей компании, мы совершим грубую ошибку: стажер получит среднюю зарплату, которая завышена из-за доходов топ-менеджеров, а директор филиала получит ту же цифру, которая для него неестественно мала.

    Правильный подход — заполнять пропуски средним значением внутри конкретной группы (например, внутри отдела или должности). Для этого в Pandas используется связка группировки и метода .transform().

    Метод .transform() работает иначе, чем обычная агрегация. Если агрегация сжимает таблицу (выдает одну строку на каждый отдел), то .transform() возвращает результат того же размера, что и исходная колонка. Он вычисляет среднее для IT-отдела и аккуратно подставляет его только в те пустые ячейки, которые относятся к IT. Это позволяет сохранить логику данных и не запутать ML-модель.

    Конструирование признаков: искусство помогать алгоритму

    Конструирование признаков (Feature Engineering) — это процесс создания новых колонок на основе существующих. Часто алгоритму не хватает исходных данных, чтобы уловить закономерность, но мы можем ему помочь, используя бизнес-логику.

    Рассмотрим классический пример из сферы недвижимости. У нас есть стоимость квартиры и ее общая площадь. Сами по себе эти цифры важны, но покупатели (и алгоритмы оценки недвижимости) чаще ориентируются на удельную стоимость.

    Другой частый сценарий — работа с датами. Модель машинного обучения не понимает формат «2023-12-25». Более того, сам по себе год может быть не так важен, как месяц (из-за сезонности продаж) или день недели (люди чаще покупают по выходным).

    Pandas позволяет легко извлекать эти компоненты с помощью аксессора .dt (при условии, что колонка имеет тип datetime):

    В этом примере мы не просто извлекли день недели (где понедельник — это 0, а воскресенье — 6), но и сразу создали логический признак is_weekend (выходной ли это день). Значения True и False алгоритм легко воспримет как 1 и 0.

    Подготовка данных — это фундамент любого проекта в области Data Science. Качество прогноза модели на 80% зависит от того, насколько грамотно вы закодировали текст, отмасштабировали числа, заполнили пустоты и какие новые признаки смогли сконструировать. Освоив эти инструменты в Pandas, вы делаете главный шаг от простого аналитика к инженеру машинного обучения.

    5. Визуализация и автоматизация отчетов

    Визуализация и автоматизация отчетов

    В предыдущих материалах мы прошли большой путь: научились загружать сырые таблицы, очищать их от мусора, группировать информацию и даже подготавливать датасеты для алгоритмов машинного обучения. Однако в реальной бизнес-среде результаты вашего анализа редко читают роботы. Чаще всего конечным потребителем вашей работы является человек — руководитель, клиент или коллега из отдела маркетинга.

    Людям сложно воспринимать сухие цифры в многострочных таблицах. Чтобы ваши выводы были услышаны и поняты, данные необходимо визуализировать. А чтобы вам не приходилось строить одни и те же графики каждую неделю вручную, этот процесс нужно автоматизировать.

    Графики «из коробки»: метод plot

    Визуализация данных — это перевод числовой информации в графические образы. Хороший график способен за секунду показать то, на осознание чего при чтении таблицы ушли бы минуты.

    Библиотека Pandas имеет встроенные инструменты для создания графиков. Под капотом она использует мощную библиотеку Matplotlib, но Pandas делает работу с ней гораздо проще, оборачивая сложные команды в один удобный метод .plot().

    Представьте, что вы анализируете ежемесячную выручку сети кофеен. У вас есть сгруппированный одномерный массив (Series), где индексами выступают месяцы, а значениями — суммы в рублях.

    В этом примере параметр kind определяет тип графика, title задает заголовок, а figsize — размер холста в дюймах. Функция plt.show() дает команду отобразить получившуюся картинку на экране.

    Как выбрать правильный тип графика

    Выбор визуализации зависит от вопроса, на который вы хотите ответить. Метод .plot() поддерживает множество форматов, которые переключаются изменением одного слова в параметре kind.

    | Параметр kind | Тип графика | Когда использовать | Пример из бизнеса | | :--- | :--- | :--- | :--- | | line | Линейный график | Показ трендов и изменений во времени | Динамика посещаемости сайта по дням | | bar | Столбчатая диаграмма | Сравнение категорий между собой | Выручка по пяти разным филиалам | | scatter | Диаграмма рассеяния | Поиск взаимосвязи между двумя метриками | Зависимость продаж от затрат на рекламу | | hist | Гистограмма | Оценка распределения данных | Распределение возраста покупателей |

    Рассмотрим диаграмму рассеяния (scatter plot). Допустим, мы хотим понять, как рекламный бюджет влияет на количество привлеченных клиентов. Для оценки эффективности часто используется показатель окупаемости инвестиций.

    Формула возврата инвестиций выглядит так:

    Где: * — коэффициент возврата инвестиций (в процентах); * — деньги, полученные от рекламной кампании; * — деньги, потраченные на рекламу.

    Если мы построим точечный график, где по оси X будут расходы, а по оси Y — доходы, мы визуально увидим эту зависимость без сложных расчетов.

    Каждая точка на таком графике — это отдельная рекламная кампания. Если точки выстраиваются в диагональную линию, идущую вверх, значит, увеличение бюджета стабильно приводит к росту выручки.

    От рутины к конвейеру: автоматизация отчетов

    Умение строить графики и сводные таблицы — ценный навык. Но настоящая магия Python раскрывается, когда вы перестаете делать это вручную.

    > Автоматизация — это процесс делегирования повторяющихся задач компьютеру. Если вы делаете одно и то же действие в Excel каждую пятницу больше трех раз, это действие должен выполнять скрипт. > > Билл Гейтс

    Представьте классическую рабочую задачу: каждый понедельник вам на почту падает выгрузка из CRM-системы в формате CSV. Вам нужно:

  • Удалить пустые строки.
  • Отфильтровать только успешные сделки.
  • Сгруппировать выручку по менеджерам.
  • Построить график продаж.
  • Сохранить результат в красивый Excel-файл и отправить руководству.
  • Вместо того чтобы тратить на это час рабочего времени, мы можем написать скрипт — текстовый файл с кодом, который выполнит все шаги за секунду.

    !Схема автоматизированного конвейера обработки данных

    Упаковка логики в функции

    Чтобы код было легко использовать повторно, его оборачивают в функции. Функция работает как мясорубка: принимает на вход сырье (имя файла), перемалывает его (очищает и группирует) и выдает готовый фарш (отчет).

    Теперь каждый понедельник вам достаточно просто поменять название файла в последней строке и запустить код.

    Искусство экспорта: работа с ExcelWriter

    В примере выше мы использовали базовый метод .to_excel(). Он отлично работает для простых таблиц. Но бизнес часто требует сложных отчетов, где на одном листе находится сводная таблица, на другом — сырые данные для проверки, а на третьем — статистика по регионам.

    Pandas предоставляет мощный инструмент pd.ExcelWriter, который позволяет работать с Excel-файлом как с книгой, добавляя в нее множество листов.

    Конструкция with гарантирует, что после записи всех листов файл будет корректно сохранен и закрыт, даже если в процессе возникнет ошибка. Параметр sheet_name задает имя вкладки внизу окна Excel.

    Таким образом, вы можете сгенерировать полноценный корпоративный дашборд в формате Excel, не открывая саму программу. Вы просто отправляете готовый многостраничный файл коллегам, которые привыкли работать в привычном табличном интерфейсе.

    Освоив визуализацию и автоматизацию, вы замыкаете цикл работы с данными. Вы научились извлекать информацию, очищать ее от искажений, находить скрытые инсайты, подготавливать базу для умных алгоритмов и, наконец, красиво и быстро презентовать результаты бизнесу. Эти навыки превращают Python из простого языка программирования в ваш главный карьерный инструмент.