Обработка данных и прогнозирование: возможности Pandas и NumPy

Раздел: Data Science -> Pandas и NumPy

Загрузка и первичный анализ данных

Как прочитать CSV файл в Pandas DataFrame с оптимальной производительностью?

Стандартный вызов pd.read_csv с автоопределением разделителя и типов столбцов. Код:

import pandas as pd
df = pd.read_csv('data.csv')
print(df.shape)
print(df.dtypes)

Python для анализа данных (python для анализа данных)

Пояснение: функция возвращает DataFrame, shape показывает размерность, dtypes типы столбцов. Это самый простой способ начать работу.

Типичная ошибка: неверный путь к файлу или отсутствие файла. Решение: проверить текущую директорию (os.getcwd()) и указать корректный относительный или абсолютный путь.

Как загрузить CSV с явным указанием типов столбцов для экономии памяти?

Использование параметра dtype словарём. Код:

dtype_map = {'user_id': 'int32', 'amount': 'float32', 'category': 'category'}
df = pd.read_csv('data.csv', dtype=dtype_map)
print(df.memory_usage(deep=True).sum())

анализ больших данных python (анализ больших данных в python)

Цель: уменьшить занимаемую память, особенно при большом количестве строк. Категориальный тип category эффективен для столбцов с повторяющимися текстовыми значениями.

Ошибка: если переданный тип несовместим с реальными данными, возникает ValueError. Решение: сначала загрузить без dtype, проанализировать уникальные значения, затем перезагрузить с подходящими типами.

Как прочитать CSV с нестандартным разделителем, например точкой с запятой?

Параметр sep (разделитель). Код:

df = pd.read_csv('data_europe.csv', sep=';', decimal=',')

анализ данных python pdf (анализ данных pdf в python)

Используется, когда десятичные числа записаны через запятую (европейский формат). Параметр decimal задаёт символ десятичного разделителя.

Проблема: если в файле смешанные разделители, чтение может сломаться. Решение: предварительно обработать файл или использовать pd.read_table с регулярным выражением.

Очистка данных: обработка пропусков

Как заполнить пропущенные значения медианой для числовых столбцов?

Использование fillna с медианой. Код:

import numpy as np
numeric_cols = df.select_dtypes(include=np.number).columns
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())

Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)

Пояснение: выбираем числовые столбцы, для каждого вычисляем медиану (не чувствительна к выбросам) и заполняем пропуски. Это сохраняет объём выборки.

Ошибка: заполнение средним, если распределение скошено - среднее может исказить данные. Медиана предпочтительнее для асимметричных распределений.

Когда лучше удалять строки с пропусками вместо заполнения?

Метод dropna. Код:

df_clean = df.dropna(axis=0)
print('Потеряно строк:', len(df) - len(df_clean))

анализ данных с использованием python (анализ данных с использованием python)

Целесообразно, если доля пропусков мала (менее 5%) и они случайны. В противном случае теряется много данных.

Проблема: удаление неслучайных пропусков может внести смещение. Решение: анализировать закономерности пропусков перед удалением.

Как использовать интерполяцию для временных рядов?

Метод interpolate с параметром method='linear' (по умолчанию). Код:

df_time = df.set_index('date').sort_index()
df_time['value'] = df_time['value'].interpolate()
print(df_time.head())

Python анализ текстовых данных (анализ текстовых данных в python)

Цель: заполнить пропуски между известными точками, предполагая линейное изменение. Работает, если индексы упорядочены.

Ошибка: интерполяция не подходит для категориальных данных. Решение: использовать для числовых или логических последовательностей.

Группировка и агрегирование

Как посчитать среднюю сумму продаж по месяцам и категориям?

Группировка через groupby и agg. Код:

result = df.groupby(['month', 'category'])['sales'].agg(['mean', 'sum']).reset_index()
print(result)

Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)

Пояснение: группируем по двум признакам, применяем несколько функций к колонке sales. reset_index превращает мультииндекс в обычный.

Типичная ошибка: группировка по столбцу с пропусками - они игнорируются. Решение: предварительно заполнить или удалить пропуски в ключах группы.

Как создать сводную таблицу (pivot table) для многомерного анализа?

Функция pd.pivot_table. Код:

pivot = pd.pivot_table(df, values='sales', index='month', columns='category', aggfunc='sum', fill_value=0)
print(pivot)

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

Цель: строки - месяцы, столбцы - категории, значения - сумма продаж. fill_value=0 заменяет отсутствующие комбинации нулём.

Проблема: если в данных несколько строк с одинаковыми индексами и столбцами, aggfunc определяет способ агрегации. Без него - ошибка. Решение: выбрать подходящую функцию (sum, mean, first).

Как применить пользовательскую функцию к каждой группе через transform?

Использование transform для создания нового столбца с результатом групповой операции. Код:

df['rank_by_category'] = df.groupby('category')['sales'].transform(lambda x: x.rank(ascending=False))
print(df[['category', 'sales', 'rank_by_category']].head())

математика и python для анализа данных (математика и python для анализа данных)

Цель: добавить столбец, содержащий ранг продажи внутри каждой категории, не уменьшая число строк.

Ошибка: использование transform с агрегирующей функцией (например, sum) возвращает повторённое значение для каждой строки, но если функция возвращает нескаляр, может возникнуть несоответствие размерности. Решение: убедиться, что возвращаемый объект по длине равен исходной группе.

Подготовка данных для машинного обучения

Как стандартизировать числовые признаки с помощью StandardScaler?

Класс sklearn.preprocessing.StandardScaler. Код:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
numeric_features = ['age', 'income', 'spending_score']
df[numeric_features] = scaler.fit_transform(df[numeric_features])
print(df[numeric_features].describe())

методы анализа данных python (методы анализа данных в python)

Пояснение: StandardScaler вычитает среднее и делит на стандартное отклонение. После преобразования признаки имеют нулевое среднее и единичную дисперсию.

Ошибка: подгонка scaler на всём наборе данных до разделения на train/test - это утечка данных. Решение: сначала разделить, затем fit_transform на train, transform на test.

Когда применять MinMaxScaler вместо StandardScaler?

MinMaxScaler приводит значения к диапазону [0, 1]. Код:

from sklearn.preprocessing import MinMaxScaler
scaler_mm = MinMaxScaler()
df_scaled = scaler_mm.fit_transform(df[['income']])

Python для анализа данных обучение (обучение анализу данных на python)

Цель: когда распределение не является нормальным и важно сохранить границы (например, для нейронных сетей с активацией sigmoid).

Проблема: выбросы сильно сжимают нормальные значения. Решение: предварительно обработать выбросы или использовать RobustScaler.

Как закодировать категориальные признаки с помощью OneHotEncoder?

OneHotEncoder создаёт бинарные столбцы для каждого уникального значения. Код:

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore')
encoded = encoder.fit_transform(df[['category']])
# Получить DataFrame с именами столбцов
import pandas as pd
encoded_df = pd.DataFrame(encoded, columns=encoder.get_feature_names_out(['category']))
df = pd.concat([df, encoded_df], axis=1).drop('category', axis=1)

Цель: преобразовать категориальные переменные в числовой формат для моделей машинного обучения. Параметр handle_unknown='ignore' позволяет не ломаться на новых категориях в тестовых данных.

Ошибка: большое количество уникальных значений приводит к проклятию размерности. Решение: использовать pd.factorize с ordinal кодированием или TargetEncoder.

- распределение данных python (распределение данных в python)
- статистический анализ данных python (статистический анализ данных в python)
- Python функции анализа данных (функции анализа данных в python)

Расширенные примеры с NumPy и Pandas

Векторизованные операции с NumPy для быстрого пересчёта признаков

Создадим новый признак как отношение двух столбцов с использованием broadcasting. Код:

Пример
import numpy as np
import pandas as pd

# Исходные данные
df = pd.DataFrame({'total_spent': [100, 200, 150, 300],
                   'num_visits': [10, 25, 15, 40]})
# Векторизованное вычисление: средняя трата за визит
avg_spent_per_visit = df['total_spent'].values / df['num_visits'].values  # numpy array
df['avg_spent'] = avg_spent_per_visit
print(df)
   total_spent  num_visits  avg_spent
0          100          10       10.0
1          200          25        8.0
2          150          15       10.0
3          300          40        7.5

Пояснение: использование .values возвращает массив NumPy, операции выполняются поэлементно без циклов. Это быстрее, чем apply.

Применение пользовательской функции через apply с сохранением производительности

Допустим, нужно нормализовать каждый признак отдельно, но с разными условиями. Используем apply с lambda. Код:

Пример
df_norm = df.apply(lambda x: (x - x.min()) / (x.max() - x.min()) if x.dtype == 'float64' else x)
print(df_norm.head())
   total_spent  num_visits  avg_spent
0     0.000000    0.000000   1.000000
1     0.500000    0.500000   0.200000
2     0.250000    0.166667   0.571429
3     1.000000    1.000000   0.000000

Цель: масштабировать только вещественные признаки. Обратите внимание: apply применяется ко всему DataFrame по столбцам, условия проверяются для каждого столбца.

Создание признаков на основе даты с использованием dt accessor

Из колонки даты можно извлечь день недели, месяц, квартал и т.д. Код:

Пример
df_dates = pd.DataFrame({'date': pd.date_range('2023-01-01', periods=10, freq='D')})
df_dates['weekday'] = df_dates['date'].dt.dayofweek
df_dates['month'] = df_dates['date'].dt.month
df_dates['is_weekend'] = (df_dates['weekday'] >= 5).astype(int)
print(df_dates)
        date  weekday  month  is_weekend
0 2023-01-01        6      1           1
1 2023-01-02        0      1           0
2 2023-01-03        1      1           0
3 2023-01-04        2      1           0
4 2023-01-05        3      1           0
5 2023-01-06        4      1           0
6 2023-01-07        5      1           1
7 2023-01-08        6      1           1
8 2023-01-09        0      1           0
9 2023-01-10        1      1           0

Пояснение: dt доступен для столбцов типа datetime, предоставляет множество атрибутов. Используется в дата-инжиниринге.

Группировка с множественными агрегациями и пользовательскими именами

Можно передать словарь в agg, где ключ - название нового столбца, а значение - функция. Код:

Пример
df_grouped = df.groupby('category').agg(
    avg_total=('total_spent', 'mean'),
    max_visits=('num_visits', 'max'),
    sum_avg=('avg_spent', 'sum')
).reset_index()
print(df_grouped)
  category  avg_total  max_visits  sum_avg
0    A      150.0       30          25.0
1    B      200.0       40          35.0

Цель: создание компактного отчёта с понятными именами столбцов без мультииндекса.

Эффективная работа с многомерными массивами: broadcasting и reshaping

Создадим матрицу признаков и добавим фиктивный столбец для константы. Код:

Пример
X = np.array([[1, 2], [3, 4], [5, 6]])
# Добавляем столбец единиц (intercept term) через broadcast
X_with_intercept = np.hstack([np.ones((X.shape[0], 1)), X])
print(X_with_intercept)
[[1. 1. 2.]
 [1. 3. 4.]
 [1. 5. 6.]]

Пояснение: np.hstack объединяет по горизонтали. Broadcasting позволяет выполнять операции над массивами разных форм, например, добавление константы ко всем строкам.

Использование rolling window для скользящих статистик (скользящее среднее)

Скользящее среднее по временному ряду с окном 3. Код:

Пример
sales = [10, 20, 15, 25, 30, 35]
s = pd.Series(sales)
rolling_mean = s.rolling(window=3).mean()
print(rolling_mean)
0          NaN
1          NaN
2    15.000000
3    20.000000
4    23.333333
5    30.000000
dtype: float64

Цель: сглаживание временных рядов, выявление тренда. Первые (window-1) значений NaN, их можно отбросить или заполнить.

Объединение таблиц: concat и merge с разными ключами

Соединим DataFrame по столбцу id с внутренним, левым и внешним соединениями. Код:

Пример
df1 = pd.DataFrame({'id': [1,2,3], 'name': ['Alice','Bob','Charlie']})
df2 = pd.DataFrame({'id': [1,2,4], 'score': [90,85,95]})
inner = pd.merge(df1, df2, on='id', how='inner')
left = pd.merge(df1, df2, on='id', how='left')
outer = pd.merge(df1, df2, on='id', how='outer')
print('Inner:\n', inner)
print('Left:\n', left)
print('Outer:\n', outer)
Inner:
    id   name  score
0   1  Alice     90
1   2    Bob     85
Left:
    id     name  score
0   1    Alice   90.0
1   2      Bob   85.0
2   3  Charlie    NaN
Outer:
    id     name  score
0   1    Alice   90.0
1   2      Bob   85.0
2   3  Charlie    NaN
3   4      NaN   95.0

Пояснение: выбор типа соединения зависит от задачи - сохранить все строки левого, только пересечение или все уникальные ключи.

Анализ данных и машинное обучение на Python - comments

En
Python анализ данных и машинное обучение (python)