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

Раздел: Data Science -> 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 задаёт минимальное количество наблюдений). Высокая корреляция не означает причинно-следственную связь.

- программирование и анализ данных на python (программирование и анализ данных на python)
- работа с табличными данными python (работа с табличными данными в python)
- распределение данных python (распределение данных в python)

Расширенные примеры анализа данных с 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 на разных типах данных ключа может произойти неявное приведение - следить за типами.

Методы анализа данных в Python - comments

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