Data Science

Python для Data Science

DJ Patil и Jeff Hammerbacher стали CDO LinkedIn и Facebook в 2008 году. В 2012 году Harvard Business Review назвал data scientist 'самой сексуальной профессией 21 века'. За 15 лет из хобби математиков - индустрия с 11M вакансий. И почти все они начинаются с одного и того же стека: NumPy, Pandas, Matplotlib, Jupyter.

  • **Netflix** использует Pandas для EDA паттернов просмотра 260M+ пользователей. Прототипирование - в Jupyter, production - в Python-сервисах
  • **NASA** обрабатывает данные телескопов Hubble и James Webb через NumPy и Matplotlib. Первое изображение чёрной дыры (2019) - обработано NumPy
  • **Kaggle** - 87% участников пишут на Python, стек тот же: pandas + numpy + seaborn
  • **OpenAI** - весь preprocessing обучающих данных для GPT идёт через NumPy-совместимые пайплайны
  • **Spotify** - Jupyter notebooks для анализа 100B+ событий прослушивания в рамках A/B тестов

Джон Тьюки и рождение современного анализа данных

В 1962 году математик Джон Тьюки опубликовал «The Future of Data Analysis» - статью, которая впервые описала data science как отдельную дисциплину. Тьюки ввёл понятия EDA (Exploratory Data Analysis), box plot, разработал Fast Fourier Transform. Именно он сформулировал философию: 'Лучше приближённый ответ на правильный вопрос, чем точный ответ на неправильный'. Трэвис Олифант, создавая NumPy в 2005, опирался на традицию, которую Тьюки заложил 40 лет назад.

Предварительные знания

  • What is Data Science

NumPy: векторизация вместо циклов

Python - один из самых медленных популярных языков. Цикл по списку из миллиона чисел работает в 100 раз медленнее, чем аналог на C. Это звучало бы как приговор - но в 2005 году Трэвис Олифант создал **NumPy**, и всё изменилось. Секрет прост: операции выполняются не в Python, а в оптимизированном C-коде с SIMD-инструкциями процессора.

Главная структура данных NumPy - **ndarray**. В отличие от Python-списка, все элементы ndarray одного типа (int32, float64), хранятся непрерывно в памяти и обрабатываются **векторизованными операциями** без единого цикла. Именно на ndarray строится PyTorch: тензор - это ndarray с поддержкой autograd. Каждая операция `model(x)` внутри - это сотни NumPy-подобных векторных операций.

**Почему такая разница?** Python list хранит указатели на объекты, разбросанные по памяти. Для каждого элемента Python проверяет тип, распаковывает значение, выполняет операцию, упаковывает обратно. NumPy хранит сырые числа подряд в памяти и вызывает C-код, который обрабатывает весь блок за одну операцию.

**Slicing создаёт view, не копию.** `b = a[1:4]` - это ссылка на тот же участок памяти. Изменение `b` изменит `a`. Для независимой копии: `b = a[1:4].copy()`. Эта оптимизация экономит память, но ловит новичков врасплох.

Дана матрица `m = np.arange(20).reshape(4, 5)`. Что вернёт `m[1:3, ::2]`?

Pandas: DataFrame как первый класс

2008 год. Уэс Маккинни работает в AQR Capital Management и устал от неудобной работы с финансовыми таблицами. Он пишет **Pandas** за свободное время - библиотеку, которая превратила Python в инструмент, сопоставимый с Excel и R. Сегодня это 27 миллионов загрузок в неделю. Kaggle: 87% участников пишут первые строки `pd.read_csv()`.

Две структуры: **Series** - одномерный массив с индексом, **DataFrame** - двумерная таблица. В отличие от NumPy ndarray, столбцы DataFrame могут быть разных типов: int, float, string, datetime, bool. SQL-операции - groupby, merge, filter - работают из коробки.

ОперацияSQLPandas
ФильтрацияWHERE age > 30df[df['age'] > 30]
СортировкаORDER BY salary DESCdf.sort_values('salary', ascending=False)
ГруппировкаGROUP BY deptdf.groupby('dept')
JoinJOIN ON iddf1.merge(df2, on='id')
LimitLIMIT 10df.head(10)

Нужно найти средний чек по каждому городу, но только для заказов больше 50. Что правильно?

Matplotlib и Seaborn: данные, которые говорят

2003 год. Нейробиолог Джон Хантер устал от MATLAB и создал **Matplotlib** - потому что хотел анализировать мозговые волны в Python. Сегодня каждая статья в Nature, каждый Kaggle-ноутбук, каждый отчёт в Airbnb начинается с `import matplotlib.pyplot as plt`. **Seaborn** - надстройка для статистических графиков: корреляционные матрицы, распределения, регрессии за одну строку.

Два API Matplotlib: **pyplot** (`plt.plot()`) - быстро, но ограниченно. **Figure/Axes OOP API** (`fig, ax = plt.subplots()`) - полный контроль. В профессиональной работе всегда используется Axes API: он предсказуемый при нескольких графиках и кастомизации.

ЗадачаГрафикБиблиотека
Тренд во времениLine plotmatplotlib
Сравнение категорийBar plotmatplotlib / seaborn
Связь двух числовых переменныхScatter plotmatplotlib / seaborn
Распределение + выбросыBox plot / Violin plotseaborn
КорреляцииHeatmapseaborn
Многомерные зависимостиPair plotseaborn

**Заголовок = вывод, не описание.** Не «Выручка по месяцам», а «Выручка выросла на 83% за год, аномальный провал в марте». Читатель не должен сам интерпретировать - график говорит за себя.

**Pie charts для сравнения не работают.** Человеческий глаз плохо сравнивает углы. Если доли близки (33% vs 28%), на pie chart разница незаметна. Bar chart в 5 раз нагляднее. Pie допустим только для 2-3 категорий с закономерной разницей.

Нужно показать связь дохода с возрастом для 5000 клиентов и выделить выбросы. Какой график лучший?

Jupyter: лаборатория data scientist

2014 год. Фернандо Перез переименовал IPython в **Jupyter** - от Julia + Python + R. Идея: единая среда, где код, текст, формулы и визуализации живут вместе. Сегодня на GitHub более 10 миллионов notebooks. Весь Kaggle построен на Jupyter. Но есть граница, которую нарушать нельзя: Jupyter - среда исследования, не продакшна.

**Когда Jupyter - правильный выбор:** EDA, прототипирование, презентация результатов, обучение. **Когда Jupyter - плохой выбор:** production ETL-пайплайны, микросервисы, cron jobs, командная разработка (merge conflicts в JSON-формате notebook - nightmare). Netflix, Airbnb, Spotify - все используют Jupyter для исследований, деплоят чистый Python через CI/CD.

**Скрытое состояние - главная ловушка Jupyter.** Ячейки выполняются в любом порядке. Удалили переменную в ячейке 5, но ячейка 3 всё ещё её использует - и всё работает до следующего restart. Правило: периодически делать **Kernel -> Restart & Run All**, чтобы убедиться, что notebook работает сверху вниз.

**Рабочий процесс:** исследование в Jupyter, стабильный код переносить в `.py`-файлы и импортировать обратно: `from src.preprocessing import clean_data`. Интерактивность Jupyter плюс тестируемость обычных Python-файлов.

Jupyter подходит для production-кода. Если модель работает в notebook, можно деплоить как есть.

Jupyter - для исследования и EDA. Production-код живёт в .py-файлах с тестами, логированием и CI/CD.

Notebooks имеют скрытое состояние, плохо работают с git (JSON-формат даёт нечитаемые diff), не поддерживают нормальную обработку ошибок. Netflix, Airbnb, Spotify используют Jupyter для исследований, но деплоят через CI/CD-пайплайны.

Команда написала модель в Jupyter Notebook. Что делать для production-деплоя?

Ключевые идеи

  • **NumPy** - фундамент: ndarray с типизацией + vectorized ops = C-скорость при Python-удобстве. Broadcasting убирает циклы
  • **Pandas** - таблицы (DataFrame) с .loc/.iloc, groupby и method chaining. SQL-эквивалент в Python, 27M загрузок в неделю
  • **Matplotlib + Seaborn** - Axes API для контроля. Один график - одна мысль. Заголовок = вывод, не описание
  • **Jupyter** - лаборатория для исследований, не production. Restart & Run All - обязательный ритуал
  • **Стек вместе** - NumPy + Pandas + Matplotlib + Jupyter покрывают 90% инструментария data scientist от Netflix до Kaggle
  • **История** - Тьюки 1962 заложил философию EDA, Маккинни 2008 воплотил её в Pandas, Олифант 2005 дал скорость через NumPy

Связанные темы

Python-инструменты - основа для всех последующих тем Data Science:

  • Что такое Data Science — NumPy, Pandas, Matplotlib реализуют каждый этап data pipeline из первого урока
  • Описательная статистика — NumPy и Pandas предоставляют mean, median, std из коробки
  • Machine Learning: введение — Scikit-learn построен на NumPy. Pandas - путь к обучению моделей

Вопросы для размышления

  • CSV-файл с 10 миллионами строк. Цикл `for row in df.iterrows()` работает 40 минут. Как ускорить используя знания из этого урока?
  • Коллега прислал Jupyter Notebook с 80 ячейками. Запустили Restart & Run All - упало на ячейке 45. Что скорее всего пошло не так?
  • Когда стоит использовать Pandas, а когда - чистый SQL? Какой порог по размеру данных?

Связанные уроки

  • ds-01 — Data pipeline и жизненный цикл проекта из первого урока
  • ds-03 — NumPy и Pandas - основа для описательной статистики
  • ml-04-data-preprocessing — Pandas transforms и NumPy ops - ядро ML preprocessing
  • ml-01-intro — Scikit-learn строится поверх NumPy; Pandas - путь к обучению моделей
  • prob-01-intro — NumPy random ops - практическая вероятность
  • stat-31-eda — Pandas + Seaborn - инструментарий EDA в statistical analysis
Python для Data Science

0

1

Войти