Эффективные методы анализа данных с помощью Pandas и NumPy
Основные подходы к анализу данных
Наиболее эффективным решением для комплексного анализа данных является совместное использование библиотек Pandas и NumPy. Pandas обеспечивает удобные структуры данных (DataFrame, Series) для работы с табличными данными, а NumPy предоставляет быстрые векторизованные операции и многомерные массивы. Ниже представлен типовой конвейер: загрузка, очистка, трансформация и вычисление статистик.
import pandas as pd
import numpy as np
# Загрузка данных из CSV
df = pd.read_csv('data.csv', encoding='utf-8')
# Удаление строк с пропущенными значениями в критичных столбцах
df.dropna(subset=['age', 'salary'], inplace=True)
# Заполнение остальных пропусков средним значением
for col in ['bonus', 'experience']:
df[col].fillna(df[col].mean(), inplace=True)
# Создание нового признака на основе существующих
df['income_per_year'] = df['salary'] + df['bonus']
# Группировка и агрегация
grouped = df.groupby('department').agg({
'salary': ['mean', 'std'],
'income_per_year': 'sum'
})
# Вычисление процентилей с помощью NumPy
percentiles = np.percentile(df['salary'], [25, 50, 75])
print(percentiles)Python для анализа данных (python для анализа данных)
Такой подход позволяет быстро получить основные статистические характеристики и подготовить данные для дальнейшего моделирования.
Как загрузить данные из файла CSV с правильной кодировкой?
import pandas as pd
# Основной способ с указанием кодировки
df = pd.read_csv('sales.csv', encoding='cp1251', sep=';')
# Альтернативный вариант с автоматическим определением кодировки
import chardet
with open('sales.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
df = pd.read_csv('sales.csv', encoding=result['encoding'], sep=';')анализ больших данных python (анализ больших данных в python)
Типичная ошибка:
При использовании неправильной кодировки возникает UnicodeDecodeError. Решение: перебор популярных кодировок ('utf-8', 'cp1251', 'latin1') или использование модуля chardet для автоматического определения.
Каким образом можно обработать пропущенные значения в числовых столбцах?
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [np.nan, 2, 3, 4],
'C': [1, np.nan, np.nan, 4]
})
# Вариант 1: удаление всех строк с хотя бы одним NaN
df_dropped = df.dropna()
# Вариант 2: заполнение медианой
df_filled = df.fillna(df.median())
# Вариант 3: интерполяция (линейная)
df_interpolated = df.interpolate(method='linear')анализ данных python pdf (анализ данных pdf в python)
Возможная проблема:
При удалении строк можно потерять значительный объём данных, особенно если пропуски распределены неравномерно. Рекомендуется сначала оценить долю пропусков и выбрать стратегию: заполнение средним/медианой для числовых признаков, модой для категориальных, или использование моделей машинного обучения для предсказания пропусков.
Как эффективно выполнить группировку данных и вычисление нескольких агрегатов?
import pandas as pd
df = pd.read_csv('employees.csv')
# Обычная группировка с одним агрегатом
grouped_single = df.groupby('department')['salary'].mean()
# Множественные агрегаты для нескольких столбцов
grouped_multi = df.groupby('department').agg({
'salary': ['mean', 'max', 'min'],
'age': 'median',
'bonus': 'sum'
})
# Использование именованных агрегатов (Pandas 0.25+)
grouped_named = df.groupby('department').agg(
avg_salary=('salary', 'mean'),
max_age=('age', 'max'),
total_bonus=('bonus', 'sum')
)Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Распространённая ошибка:
Попытка применить агрегацию к столбцу, содержащему нечисловые данные, приводит к ошибке TypeError. Проверяйте типы данных с помощью df.dtypes и при необходимости приводите их к числовому типу (pd.to_numeric).
Каким образом можно использовать возможности NumPy для ускорения вычислений?
import numpy as np
# Пример: вычисление евклидова расстояния между двумя массивами
A = np.random.rand(1000000, 3)
B = np.random.rand(1000000, 3)
# Векторизованная операция (быстро)
distances = np.sqrt(np.sum((A - B)**2, axis=1))
# То же с циклами (медленно)
def slow_distance(a, b):
result = np.empty(a.shape[0])
for i in range(a.shape[0]):
result[i] = np.sqrt(np.sum((a[i] - b[i])**2))
return result
# Использование broadcasting для матричных операций
matrix = np.random.rand(5, 3)
row = np.array([1, 0, -1])
normalized = matrix - row # broadcastingТипичная ошибка:
Несоответствие размерностей массивов при broadcasting. NumPy требует совместимости размерностей (правила broadcasting). Если возникает ошибка ValueError, проверьте формы массивов с помощью .shape и при необходимости используйте .reshape() или np.newaxis.
Расширенные примеры применения Pandas и NumPy
Ниже представлены более сложные сценарии, которые редко встречаются в базовых руководствах, но полезны на практике.
Пример 1: Работа с временными рядами и скользящими окнами
import pandas as pd
import numpy as np
# Генерация временного ряда
dates = pd.date_range('2023-01-01', periods=100, freq='D')
data = np.random.randn(100).cumsum() # случайное блуждание
ts = pd.Series(data, index=dates)
# Скользящее среднее с окном 7 дней
rolling_mean = ts.rolling(window=7, min_periods=1).mean()
# Экспоненциально взвешенное скользящее среднее
ewm = ts.ewm(span=10, adjust=False).mean()
# Расчёт скользящей корреляции между двумя рядами
ts2 = pd.Series(np.random.randn(100).cumsum(), index=dates)
rolling_corr = ts.rolling(30).corr(ts2)
print(rolling_mean.head(10))2023-01-01 -0.792323 2023-01-02 -0.632109 2023-01-03 -0.614752 ... (вывод усечён)
Пример 2: Векторизованная обработка категориальных данных с помощью np.where и np.select
import pandas as pd
import numpy as np
df = pd.DataFrame({'value': np.random.randint(0, 100, 50)})
# Создание категорий на основе условий
conditions = [
(df['value'] < 30),
(df['value'] >= 30) & (df['value'] < 70),
(df['value'] >= 70)
]
choices = ['низкий', 'средний', 'высокий']
df['category'] = np.select(conditions, choices, default='неизвестно')
# Альтернатива с pd.cut (более удобно для непрерывных интервалов)
df['category2'] = pd.cut(df['value'], bins=[0, 30, 70, 100], labels=['низкий', 'средний', 'высокий'], right=False)
print(df.head())value category category2 0 42 средний средний 1 87 высокий высокий 2 12 низкий низкий ... (вывод усечён)
Пример 3: Применение пользовательской функции с помощью .apply и её векторизация через NumPy
import pandas as pd
import numpy as np
df = pd.DataFrame({'x': np.random.rand(1000), 'y': np.random.rand(1000)})
# Медленный способ с apply
def distance_from_origin(row):
return np.sqrt(row['x']**2 + row['y']**2)
df['dist_apply'] = df.apply(distance_from_origin, axis=1)
# Быстрый векторизованный способ с NumPy
df['dist_vec'] = np.sqrt(df['x']**2 + df['y']**2)
# Проверка идентичности
print(np.allclose(df['dist_apply'], df['dist_vec'])) # TrueTrue
Пример 4: Использование NumPy для быстрого поиска выбросов (метод z-score)
import pandas as pd
import numpy as np
data = np.random.randn(1000)
data[10] = 50 # добавляем выброс
# Вычисление z-оценок
z_scores = np.abs((data - np.mean(data)) / np.std(data))
# Порог для выбросов (например, 3)
threshold = 3
outliers = np.where(z_scores > threshold)
print('Индексы выбросов:', outliers[0])Индексы выбросов: [10]
Пример 5: Многомерные массивы и тензорные операции (например, для изображений)
import numpy as np
# Создание трёхмерного массива (RGB изображение 2x2)
img = np.random.randint(0, 256, (2, 2, 3), dtype=np.uint8)
print('Исходное изображение:')
print(img)
# Изменение цветового канала: увеличение красного на 20%
img_adjusted = img.copy()
img_adjusted[:,:,0] = np.clip(img[:,:,0] * 1.2, 0, 255).astype(np.uint8)
# Нормализация по каналам
normalized = img / 255.0
# Свёртка (простой пример с ядром 3x3)
kernel = np.ones((3,3)) / 9 # среднее
# Для одноканального изображения
from scipy import signal
# (требуется scipy, но можно реализовать через np.lib.stride_tricks)
print('Изменённое изображение (красный канал усилен):')
print(img_adjusted)Исходное изображение: [[[ 23 45 123] [ 67 89 200]] [[200 78 55] [ 12 34 90]]] Изменённое изображение (красный канал усилен): [[[ 27 45 123] [ 80 89 200]] [[240 78 55] [ 14 34 90]]]