pandas, numpy, matplotlib — инструменты которые используются в работе каждый день. С примерами кода.
read_csv, head, info, describe, shape — первые команды при работе с любым датасетом.
import pandas as pd
df = pd.read_csv('data.csv', parse_dates=['date'])
# Первичный осмотр
df.shape # (строк, столбцов)
df.head(5) # первые 5 строк
df.info() # типы, пустые значения
df.describe() # статистика по числовым
df.dtypes # типы каждого столбца
# Фильтрация
active = df[df['status'] == 'active']
big_orders = df[df['amount'] > 10000]
df[(df['country'] == 'KZ') & (df['amount'] > 5000)]
# Выборка столбцов
df[['user_id', 'email', 'amount']]
df.loc[0:4, 'user_id':'email'] # по меткам
df.iloc[0:5, 0:3] # по индексамГруппировка данных, сводные таблицы, несколько агрегатных функций за раз.
# groupby — аналог GROUP BY в SQL
monthly = df.groupby(df['date'].dt.to_period('M'))['amount'].agg(
revenue='sum',
orders='count',
avg_check='mean'
).reset_index()
# Несколько уровней группировки
df.groupby(['country', 'category'])['amount'].sum().unstack()
# pivot_table — удобно для матриц
pivot = df.pivot_table(
values='amount',
index='country',
columns='category',
aggfunc='sum',
fill_value=0
)
# apply — произвольная функция
df['bucket'] = df['amount'].apply(
lambda x: 'high' if x > 50000 else ('mid' if x > 10000 else 'low')
)fillna, dropna, duplicated, astype — стандартные операции подготовки данных перед анализом.
# Пропущенные значения
df.isnull().sum() # сколько NaN в каждом столбце
df['age'].fillna(df['age'].median()) # заменить медианой
df.dropna(subset=['user_id', 'date']) # удалить строки с NaN в ключевых полях
# Дубликаты
df.duplicated().sum() # количество дублей
df.drop_duplicates(subset=['user_id', 'order_id'], inplace=True)
# Изменение типов
df['date'] = pd.to_datetime(df['date'])
df['amount'] = df['amount'].astype(float)
df['is_paid'] = df['status'].map({'paid': True, 'pending': False})
# Строковые операции
df['email'] = df['email'].str.lower().str.strip()
df['city'] = df['city'].str.replace(' ', '_')
# Winsorize — обрезать выбросы
p99 = df['amount'].quantile(0.99)
df['amount_clipped'] = df['amount'].clip(upper=p99)Линейный график, гистограмма, scatter plot, box plot — быстрый EDA и красивые отчёты.
import matplotlib.pyplot as plt
import seaborn as sns
# Линейный — динамика метрики
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(df['date'], df['revenue'], color='#22C55E', linewidth=2)
ax.set_title('Выручка по дням')
ax.set_xlabel('Дата')
ax.set_ylabel('₸')
plt.tight_layout()
# Гистограмма распределения
sns.histplot(df['amount'], bins=30, kde=True, color='#3B82F6')
# Scatter — корреляция двух метрик
sns.scatterplot(data=df, x='sessions', y='revenue', hue='country')
# Box plot — выбросы и медиана
sns.boxplot(data=df, x='category', y='amount', palette='Set2')
# Тепловая карта корреляций
corr = df[['revenue', 'sessions', 'cac', 'ltv']].corr()
sns.heatmap(corr, annot=True, cmap='RdYlGn', center=0)mean, std, percentile, corrcoef — быстрые статистические вычисления без циклов.
import numpy as np
arr = df['amount'].values # pandas → numpy array
np.mean(arr) # среднее
np.median(arr) # медиана
np.std(arr) # стандартное отклонение
np.var(arr) # дисперсия
np.percentile(arr, [25, 75]) # квартили
np.corrcoef(df['sessions'], df['revenue']) # матрица корреляций
# Векторные операции — без циклов
prices = np.array([100, 200, 300])
tax = prices * 0.12 # элементно
discounted = np.where(prices > 150, prices * 0.9, prices)
# Случайные числа (для A/B симуляций)
np.random.seed(42)
control = np.random.normal(loc=100, scale=20, size=1000)
variant = np.random.normal(loc=108, scale=20, size=1000)
from scipy import stats
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Python для аналитика',
description: 'pandas, numpy, matplotlib — инструменты для работы с данными каждый день.',
openGraph: { title: 'Python для аналитика', description: 'pandas, numpy, matplotlib — инструменты для работы с данными каждый день.' },
};
t_stat, p_value = stats.ttest_ind(control, variant)
print(f'p-value = {p_value:.4f}') # < 0.05 → значимо