Эффективные методы анализа данных с помощью Pandas и NumPy

Раздел: Data Science -> 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.

- Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
- библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))
- математика и python для анализа данных (математика и python для анализа данных)

Расширенные примеры применения 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']))  # True
True

Пример 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]]]

Приложения анализа данных на Python - comments

En
приложения анализа данных на python (python)