Объединение возможностей библиотек для научных вычислений
Комбинация Pandas, NumPy и Matplotlib в научных вычислениях
Три библиотеки Pandas, NumPy и Matplotlib образуют мощный инструментарий для научных вычислений в Python. Pandas обеспечивает удобные структуры данных и функции для работы с табличными данными. NumPy предоставляет эффективные численные операции над массивами. Matplotlib позволяет создавать графические представления данных. Совместное использование этих библиотек позволяет реализовать полный цикл обработки данных: загрузку, очистку, анализ, визуализацию.
Основной пайплайн: загрузка, обработка, визуализация
Рассмотрим типичный сценарий: имеется CSV-файл с данными о продажах. Необходимо загрузить данные, вычислить скользящее среднее и построить график.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Загрузка данных
df = pd.read_csv('sales.csv')
# Преобразование столбца даты
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# Вычисление скользящего среднего с помощью NumPy
window = 7
rolling_mean = np.convolve(df['sales'], np.ones(window)/window, mode='same')
# Построение графика
plt.figure(figsize=(10,5))
plt.plot(df.index, df['sales'], label='Фактические продажи', alpha=0.5)
plt.plot(df.index, rolling_mean, label=f'Скользящее среднее ({window} дней)', color='red')
plt.xlabel('Дата')
plt.ylabel('Продажи')
plt.title('Анализ продаж со скользящим средним')
plt.legend()
plt.grid(True)
plt.show()
Python pandas numpy matplotlib (pandas, numpy, matplotlib в python)
(График с двумя линиями: синяя пунктирная фактические данные, красная линия скользящее среднее)
Пояснение: Pandas загружает таблицу, NumPy выполняет свертку для скользящего среднего, Matplotlib отображает результат.
Типичная ошибка: Использование np.convolve с mode='same' может давать смещение из-за граничных эффектов. Альтернатива: df['sales'].rolling(window).mean() из Pandas, который корректно обрабатывает края, возвращая NaN для недостающих значений.
Как вычислить корреляционную матрицу и построить тепловую карту?
Для анализа взаимосвязей между числовыми переменными.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Загрузка или создание данных
df = pd.DataFrame(np.random.randn(100, 5), columns=['A','B','C','D','E'])
# Вычисление корреляции с помощью Pandas
corr = df.corr()
# Визуализация тепловой карты с помощью Matplotlib
plt.figure(figsize=(8,6))
plt.imshow(corr, cmap='coolwarm', interpolation='none')
plt.colorbar(label='Коэффициент корреляции')
plt.xticks(range(len(corr.columns)), corr.columns, rotation=45)
plt.yticks(range(len(corr.index)), corr.index)
for i in range(len(corr.columns)):
for j in range(len(corr.index)):
plt.text(j, i, f'{corr.iloc[i,j]:.2f}', ha='center', va='center', color='black')
plt.title('Корреляционная матрица')
plt.show()
Цель: Быстро оценить линейные зависимости между переменными.
Проблема: При большом количестве переменных подписи могут накладываться. Решение: увеличить размер фигуры или использовать plt.tight_layout().
Как выполнить группировку данных и построить столбчатую диаграмму средних?
Пример: средние продажи по категориям.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({'category': ['A','B','A','B','C'], 'sales': [10, 20, 15, 25, 30]})
# Группировка с помощью Pandas
grouped = df.groupby('category')['sales'].mean()
# Построение столбчатой диаграммы
plt.bar(grouped.index, grouped.values, color='skyblue')
plt.xlabel('Категория')
plt.ylabel('Средние продажи')
plt.title('Средние продажи по категориям')
plt.show()
Как использовать NumPy для быстрой фильтрации и matplotlib для гистограммы?
Фильтрация по условию и построение распределения.
import numpy as np
import matplotlib.pyplot as plt
data = np.random.exponential(scale=2, size=1000)
# Фильтрация: оставить только значения меньше 5
filtered = data[data < 5]
# Гистограмма
plt.hist(filtered, bins=30, density=True, alpha=0.7, color='green')
plt.xlabel('Значение')
plt.ylabel('Плотность')
plt.title('Распределение отфильтрованных данных')
plt.grid(True)
plt.show()
Как объединить несколько графиков на одном полотне с разными масштабами?
Создание подграфиков (subplots) с общей осью X.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.exp(-x/3) * 100
fig, ax1 = plt.subplots()
ax1.plot(x, y1, 'b-', label='sin(x)')
ax1.set_xlabel('x')
ax1.set_ylabel('sin(x)', color='b')
ax1.tick_params(axis='y', labelcolor='b')
ax2 = ax1.twinx()
ax2.plot(x, y2, 'r--', label='exp')
ax2.set_ylabel('exp(-x/3)*100', color='r')
ax2.tick_params(axis='y', labelcolor='r')
plt.title('Две шкалы на одном графике')
fig.tight_layout()
plt.show()
Расширенные примеры комбинированного использования
Пример 1: Временной ряд с доверительным интервалом
Загрузка данных о температуре, вычисление скользящего среднего и стандартного отклонения, построение графика с закрашенной областью.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Генерация искусственных данных
dates = pd.date_range('2023-01-01', periods=365, freq='D')
temp = 15 + 10*np.sin(2*np.pi*np.arange(365)/365) + np.random.randn(365)*2
df = pd.DataFrame({'date': dates, 'temp': temp})
df.set_index('date', inplace=True)
# Параметры окна
window = 14
rolling_mean = df['temp'].rolling(window).mean()
rolling_std = df['temp'].rolling(window).std()
# Построение
plt.figure(figsize=(12,6))
plt.plot(df.index, df['temp'], 'lightgray', label='Исходные данные', alpha=0.6)
plt.plot(df.index, rolling_mean, 'b', label=f'Скользящее среднее (окно {window})')
plt.fill_between(df.index, rolling_mean - 2*rolling_std, rolling_mean + 2*rolling_std,
color='b', alpha=0.2, label='95% доверительный интервал')
plt.xlabel('Дата')
plt.ylabel('Температура (°C)')
plt.title('Сезонные колебания температуры с доверительным интервалом')
plt.legend()
plt.grid(True)
plt.show()
(График: серые точки данных, синяя линия среднего, полупрозрачная синяя полоса)
Пример 2: 3D поверхность из функции
Использование NumPy для создания сетки и Matplotlib для трехмерного графика.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D поверхность sin(sqrt(x^2+y^2))')
plt.show()
(Трехмерный график с цветной поверхностью)
Пример 3: Чтение большого файла по частям и построение гистограммы
Экономия памяти при обработке больших данных.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Предположим, файл 'large.csv' с колонкой 'value'
chunk_size = 10000
all_values = []
for chunk in pd.read_csv('large.csv', chunksize=chunk_size):
# Фильтрация по условию (если нужно)
chunk = chunk[(chunk['value'] > 0) & (chunk['value'] < 100)]
all_values.append(chunk['value'].values)
values = np.concatenate(all_values)
plt.hist(values, bins=50, density=True, alpha=0.7, color='purple')
plt.xlabel('Значение')
plt.ylabel('Плотность')
plt.title('Распределение значений из большого файла')
plt.grid(True)
plt.show()
Пояснение: chunk_size определяет количество строк за раз. После объединения NumPy массивов строится гистограмма.
Пример 4: Использование Pandas и NumPy для быстрой статистики и Matplotlib для нескольких подграфиков
Вычисление среднего, медианы, стандартного отклонения для разных групп и отображение в виде ящиков с усами.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
groups = ['X']*100 + ['Y']*100 + ['Z']*100
values = np.concatenate([np.random.normal(5, 1, 100),
np.random.normal(7, 1.5, 100),
np.random.normal(3, 0.8, 100)])
df = pd.DataFrame({'group': groups, 'value': values})
# Статистика по группам
stats = df.groupby('group')['value'].agg(['mean', 'median', 'std'])
print(stats)
# Box plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5))
df.boxplot(column='value', by='group', ax=ax1)
ax1.set_title('Ящики с усами по группам')
ax1.set_ylabel('Значение')
# Bar plot средних с ошибками
ax2.bar(stats.index, stats['mean'], yerr=stats['std'], capsize=5, color='orange')
ax2.set_title('Средние значения с стандартным отклонением')
ax2.set_ylabel('Среднее')
plt.suptitle('Статистический анализ по группам')
plt.tight_layout()
plt.show()
(Таблица статистики и два графика: boxplot и столбчатая диаграмма с планками погрешностей)