Техники анализа данных с помощью библиотек Pandas и NumPy
Основные методы анализа данных в Pandas и NumPy
Как выполнить группировку и агрегацию данных с помощью groupby и agg?
Наиболее эффективное решение для сводки данных по категориям - использование метода groupby() в сочетании с agg(). Оно позволяет применить различные статистические функции к выбранным столбцам каждой группы.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Категория': ['A', 'B', 'A', 'B', 'A'],
'Продажи': [100, 200, 150, 250, 120],
'Прибыль': [20, 30, 25, 35, 22]
})
grouped = df.groupby('Категория').agg({'Продажи': 'sum', 'Прибыль': 'mean'})
print(grouped)Python для анализа данных (python для анализа данных)
Продажи Прибыль Категория A 370 22.333333 B 450 32.500000
анализ больших данных python (анализ больших данных в python)
Пояснение: группировка выполняется по столбцу 'Категория', затем для 'Продажи' применяется суммирование, а для 'Прибыль' - среднее значение. Метод agg принимает словарь с именами столбцов и функциями.
Типичная ошибка: передача списка функций без словаря приводит к применению всех функций ко всем столбцам. Например, groupby('Категория').agg(['sum','mean']) создаст мультииндекс, что может быть избыточно. Также возможна ошибка при указании несуществующей функции (например, 'med' вместо 'median').
Как получить описательную статистику для всего набора данных?
Метод describe() формирует сводку: количество, среднее, стандартное отклонение, минимум, квартили и максимум. Для категориальных столбцов удобно использовать value_counts().
print(df.describe())
Python анализ данных excel (анализ данных excel в python)
Продажи Прибыль count 5.000000 5.000000 mean 164.000000 26.400000 std 57.008772 5.856370 min 100.000000 20.000000 25% 110.000000 22.000000 50% 150.000000 25.000000 75% 200.000000 30.000000 max 250.000000 35.000000
анализ данных python pdf (анализ данных pdf в python)
Если в данных есть пропуски, describe() игнорирует их, что может исказить оценки. Рекомендуется предварительно обработать пропуски (например, с помощью fillna() или dropna()).
Как отфильтровать строки по сложному условию?
Метод query() позволяет записывать условия строкой, что делает код читаемым. Альтернатива - булева индексация.
df_filtered = df.query('Продажи > 150 and Прибыль > 25')
print(df_filtered)Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Категория Продажи Прибыль 1 B 200 30 3 B 250 35
анализ данных с использованием python (анализ данных с использованием python)
Ошибка возникает, если имена столбцов содержат пробелы или специальные символы. В таких случая имена нужно заключать в обратные кавычки: `column name`. Также query() не поддерживает все операции (например, вызов функций).
Как обработать пропуски в данных?
Для обнаружения пропусков используется isna(), для удаления - dropna(), для заполнения - fillna().
df_nan = pd.DataFrame({'A': [1, None, 3], 'B': [4, 5, None]})
print(df_nan.isna())
print(df_nan.fillna(0))
print(df_nan.dropna())Python анализ текстовых данных (анализ текстовых данных в python)
A B
0 False False
1 True False
2 False True
A B
0 1.0 4.0
1 0.0 5.0
2 3.0 0.0
A B
0 1.0 4.0аналитик данных python sql (аналитик данных python sql)
Частая ошибка - изменение типа данных после fillna (например, целые числа становятся float из-за NaN). Чтобы сохранить тип, можно использовать pd.NA или параметр downcast.
Как создать сводную таблицу с мультииндексами?
Функция pivot_table() позволяет агрегировать данные по нескольким измерениям. Основные параметры: index, columns, values, aggfunc.
df2 = pd.DataFrame({
'Город': ['Москва', 'СПб', 'Москва', 'СПб', 'Москва'],
'Товар': ['A', 'A', 'B', 'B', 'A'],
'Продажи': [100, 150, 200, 120, 130]
})
pivot = df2.pivot_table(index='Город', columns='Товар', values='Продажи', aggfunc='sum', fill_value=0)
print(pivot)Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
Товар A B Город Москва 230 200 СПб 150 120
библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))
Если не указать aggfunc, по умолчанию применяется среднее. Если в данных есть дубликаты по индексу и столбцам, возникнет ошибка. В таком случае нужно указать aggfunc явно.
Как применить пользовательскую функцию к столбцам или строкам?
Метод apply() позволяет выполнить произвольную функцию вдоль оси. Для поэлементной обработки используется applymap() (для DataFrame) или map() (для Series).
def discount(price):
return price * 0.9
df['Продажи_со_скидкой'] = df['Продажи'].apply(discount)
print(df[['Продажи', 'Продажи_со_скидкой']])математика и python для анализа данных (математика и python для анализа данных)
Продажи Продажи_со_скидкой 0 100 90.0 1 200 180.0 2 150 135.0 3 250 225.0 4 120 108.0
методы анализа данных python (методы анализа данных в python)
Производительность apply() ниже, чем у векторизованных операций (например, df['Продажи'] * 0.9). Для больших данных рекомендуется использовать векторизацию NumPy или методы Pandas.
Как вычислить корреляцию между признаками?
Метод corr() вычисляет парные корреляции Пирсона по умолчанию. Для других коэффициентов (Спирмена, Кендалла) используется параметр method.
print(df[['Продажи', 'Прибыль']].corr())Python для анализа данных обучение (обучение анализу данных на python)
Продажи Прибыль Продажи 1.000000 0.997881 Прибыль 0.997881 1.000000
Если данные содержат пропуски, corr() по умолчанию исключает пары с пропусками (параметр min_periods задаёт минимальное количество наблюдений). Высокая корреляция не означает причинно-следственную связь.
Расширенные примеры анализа данных с Pandas и NumPy
Пример 1: Множественная агрегация с пользовательскими функциями
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Группа': ['X', 'X', 'Y', 'Y', 'Z'],
'Значение1': [10, 20, 30, 40, 50],
'Значение2': [1, 2, 3, 4, 5]
})
def range_val(x):
return x.max() - x.min()
result = df.groupby('Группа').agg({
'Значение1': ['sum', 'mean', range_val],
'Значение2': ['min', 'max']
})
print(result) Значение1 Значение2
sum mean range_val min max
Группа
X 30 15.000000 10 1 2
Y 70 35.000000 10 3 4
Z 50 50.000000 0 5 5Здесь для 'Значение1' применяются три функции, включая пользовательскую range_val. Результат - мультиуровневый столбец.
Внимание: имена функций в мультииндексе могут быть длинными (например, 'range_val'). Для читаемости можно переименовать через rename.
Пример 2: Использование rolling и expanding для скользящих статистик
series = pd.Series(np.random.randn(10), name='X')
rolling_mean = series.rolling(window=3).mean()
expanding_sum = series.expanding(min_periods=2).sum()
df_roll = pd.DataFrame({'Исходные': series, 'Скользящее_среднее': rolling_mean, 'Нарастающая_сумма': expanding_sum})
print(df_roll)Исходные Скользящее_среднее Нарастающая_сумма 0 0.124204 NaN NaN 1 -0.457528 NaN -0.333324 2 0.355136 0.007271 0.021812 3 1.695840 0.531149 1.717652 4 -0.650984 0.466664 1.066668 5 -0.399089 0.215256 0.667579 6 0.071440 -0.326211 0.739019 7 -1.259861 -0.529170 -0.520842 8 2.125846 0.312475 1.605004 9 -0.156354 0.236544 1.448650
Параметр window задаёт размер окна, min_periods - минимальное количество наблюдений для расчёта. Rolling полезен для сглаживания временных рядов.
Пропуски в начале (NaN) возникают, пока не накоплено достаточно данных. Это нормальное поведение.
Пример 3: Векторизованные вычисления с NumPy
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Стандартизация (Z-оценки) по столбцам
mean = np.mean(arr, axis=0)
std = np.std(arr, axis=0, ddof=1)
z_scores = (arr - mean) / std
print(z_scores)[[-1.22474487 -1.22474487 -1.22474487] [ 0. 0. 0. ] [ 1.22474487 1.22474487 1.22474487]]
NumPy автоматически выполняет операции над массивами без циклов, что существенно ускоряет вычисления.
Ошибка: если std равно нулю (константный столбец), возникнет деление на ноль. Следует проверять дисперсию.
Пример 4: Создание разреженных матриц из категориальных данных
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
df_cat = pd.DataFrame({'Цвет': ['Красный', 'Синий', 'Зелёный', 'Синий', 'Красный']})
encoder = OneHotEncoder(sparse_output=False)
encoded = encoder.fit_transform(df_cat[['Цвет']])
df_encoded = pd.DataFrame(encoded, columns=encoder.get_feature_names_out(['Цвет']))
print(df_encoded)Цвет_Зелёный Цвет_Красный Цвет_Синий 0 0.0 1.0 0.0 1 0.0 0.0 1.0 2 1.0 0.0 0.0 3 0.0 0.0 1.0 4 0.0 1.0 0.0
OneHotEncoder из scikit-learn преобразует категории в бинарные признаки, которые можно объединить с исходным DataFrame.
Проблема: после кодирования может возникнуть мультиколлинеарность. Рекомендуется удалять один из столбцов (параметр drop='first').
Пример 5: Объединение таблиц с помощью merge и concat
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Имя': ['Анна', 'Борис', 'Виктор']})
df2 = pd.DataFrame({'ID': [1, 2, 4], 'Зарплата': [50000, 60000, 45000]})
inner_join = pd.merge(df1, df2, on='ID', how='inner')
left_join = pd.merge(df1, df2, on='ID', how='left')
concat_rows = pd.concat([df1, df2], axis=0, ignore_index=True)
print('Inner Join:')
print(inner_join)
print('\nLeft Join:')
print(left_join)
print('\nConcat rows:')
print(concat_rows)Inner Join: ID Имя Зарплата 0 1 Анна 50000 1 2 Борис 60000 Left Join: ID Имя Зарплата 0 1 Анна 50000.0 1 2 Борис 60000.0 2 3 Виктор NaN Concat rows: ID Имя Зарплата 0 1 Анна NaN 1 2 Борис NaN 2 3 Виктор NaN 3 1 NaN 50000.0 4 2 NaN 60000.0 5 4 NaN 45000.0
merge работает аналогично SQL-соединениям, concat просто склеивает по оси (строки или столбцы).
При использовании concat с разными порядками столбцов может возникнуть перемешивание. Лучше задать список столбцов явно. При merge на разных типах данных ключа может произойти неявное приведение - следить за типами.