Использование pandas и numpy для анализа информации

Раздел: Библиотеки -> Pandas и NumPy

Основные подходы к анализу данных с pandas и numpy

Эффективное решение: полный цикл анализа с загрузкой, очисткой и группировкой

Рассмотрим наиболее продуктивный способ выполнения типовых задач анализа данных с использованием pandas и numpy. Основной упор делается на векторизованные операции, которые работают значительно быстрее поэлементных циклов.


import pandas as pd
import numpy as np

# Загрузка данных (пример с синтетическим DataFrame)
df = pd.DataFrame({
    'Город': ['Москва', 'СПб', 'Казань', 'Москва', 'СПб'],
    'Продажи': [120, 150, 90, 110, 130],
    'Месяц': [1, 1, 2, 2, 2]
})

# Очистка: удаление дубликатов
df = df.drop_duplicates()

# Преобразование: новый столбец с бонусом (10% от продаж) с помощью numpy
df['Бонус'] = np.where(df['Продажи'] > 120, df['Продажи'] * 0.15, df['Продажи'] * 0.1)

# Группировка и агрегация
summary = df.groupby('Город')['Продажи'].agg(['sum', 'mean', 'count'])
print(summary)
  

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

В данном примере drop_duplicates удаляет повторяющиеся строки, а np.where позволяет векторизованно применить условие для вычисления бонуса. Группировка с агрегацией даёт сводку по городам.

Частая ошибка:

Забыть про inplace=True при использовании методов, изменяющих DataFrame. Многие методы возвращают копию, поэтому результат нужно присваивать.

Как выполнить фильтрацию строк с помощью булевой маски?

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


filtered_df = df[(df['Продажи'] > 100) & (df['Город'] == 'Москва')]
print(filtered_df)
  

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

Оператор & используется для логического И. Важно заключать каждое условие в скобки из-за приоритета операторов.

Типичная ошибка: использование and вместо &. Для поэлементной логики в pandas нужны битовые операторы.

Цель: отбор строк, удовлетворяющих нескольким критериям, без написания циклов.

Как применить пользовательскую функцию к столбцу?

Вариант: метод apply или transform.


def categorize_sales(x):
    if x > 120:
        return 'Высокие'
    elif x > 100:
        return 'Средние'
    else:
        return 'Низкие'

df['Категория'] = df['Продажи'].apply(categorize_sales)
  

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

apply поэлементно вызывает функцию для каждого значения. Медленнее векторизованных решений, но гибче.

Ошибка: изменение исходного DataFrame внутри функции без явного копирования может привести к неожиданностям. Лучше возвращать новое значение.

Случай использования: сложная логика, которую трудно выразить через np.where.

Как обработать пропущенные значения?

Вариант: fillna или dropna.


df.loc[2, 'Продажи'] = np.nan  # имитация пропуска
df['Продажи'] = df['Продажи'].fillna(df['Продажи'].mean())
  

Заполнение пропусков средним значением - одна из распространённых стратегий. Можно использовать метод вперёд/назад (method='ffill').

Проблема: заполнение средним искажает распределение, если пропусков много. Нужно понимать природу данных.

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

- анализ данных с использованием python (анализ данных с использованием python)
- Python анализ текстовых данных (анализ текстовых данных в python)
- аналитик данных python sql (аналитик данных python sql)

Расширенные примеры работы с pandas и numpy

Пример 1: Оконные функции и скользящее среднее

Пример

import pandas as pd
import numpy as np

dates = pd.date_range('2024-01-01', periods=10)
df = pd.DataFrame({'Дата': dates, 'Значение': np.random.randn(10).cumsum()})
df['Скользящее_среднее'] = df['Значение'].rolling(window=3).mean()
print(df)
       Дата   Значение  Скользящее_среднее
0 2024-01-01  1.234567                NaN
1 2024-01-02  2.345678                NaN
2 2024-01-03  3.456789                2.345678
3 2024-01-04  4.567890                3.456789
...

Используется для сглаживания временных рядов. Первые два значения NaN, так как окно не набирается.

Пример 2: Сводные таблицы (pivot_table)

Пример

df_sales = pd.DataFrame({
    'Год': [2023, 2023, 2024, 2024],
    'Квартал': ['Q1','Q2','Q1','Q2'],
    'Продажи': [100, 200, 150, 250]
})
pivot = df_sales.pivot_table(index='Год', columns='Квартал', values='Продажи', aggfunc='sum')
print(pivot)
Квартал   Q1   Q2
Год             
2023     100  200
2024     150  250

Позволяет перестроить данные в кросс-таблицу с агрегацией.

Пример 3: Условное присваивание с помощью numpy.select

Пример

conditions = [
    df['Продажи'] > 120,
    df['Продажи'] > 100
]
choices = ['Высокие', 'Средние']
df['Категория'] = np.select(conditions, choices, default='Низкие')

Более гибкий аналог np.where для множественных условий. Работает быстрее apply.

Пример 4: Объединение данных с merge (сложные ключи)

Пример

df_left = pd.DataFrame({'ID': [1,2,3], 'Имя': ['A','B','C']})
df_right = pd.DataFrame({'ID': [2,3,4], 'Оценка': [85,90,95]})
merged = pd.merge(df_left, df_right, on='ID', how='outer', indicator=True)
print(merged)
   ID Имя  Оценка      _merge
0   1   A     NaN   left_only
1   2   B    85.0        both
2   3   C    90.0        both
3   4 NaN    95.0  right_only

Индикатор показывает, из какой таблицы пришла строка.

Пример 5: Векторизованная работа с датами (numpy + pandas)

Пример

df['Дата'] = pd.to_datetime(df['Дата'])
df['Год'] = df['Дата'].dt.year
df['Разница_дней'] = (df['Дата'].max() - df['Дата']).dt.days
print(df[['Дата','Год','Разница_дней']].head())

Использование pd.to_datetime и доступа .dt для извлечения компонентов даты.

Анализ данных с pandas и numpy в Python - comments

En
анализ данных python pandas numpy (python)