Системный анализ данных на Python

Раздел: Работа с данными -> Pandas и NumPy

Основные методы анализа данных

Рекомендуемый подход: группировка и агрегация с Pandas

Наиболее эффективный способ получения сводной статистики по категориям - использование метода groupby() с последующей агрегацией через agg(). Этот подход работает быстро даже на больших наборах данных и позволяет гибко комбинировать функции.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 15, 25, 12]
})

result = df.groupby('category')['value'].agg(['mean', 'sum', 'count'])
print(result)

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

            mean  sum  count
category                    
A         12.3333   37      3
B         22.5000   45      2

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

Такой код позволяет за один проход вычислить несколько статистик. Проблемы могут возникнуть при наличии пропусков: NaN по умолчанию исключаются из расчетов, но если нужно их учитывать, следует указать skipna=False.

Типичная ошибка:

Забыть указать ось при группировке по нескольким столбцам. Например, groupby(['cat1', 'cat2']) - нужно передавать список, а не кортеж. Также стоит помнить, что после groupby индексы становятся иерархическими, что может усложнить последующую визуализацию. Для сброса индекса используется reset_index().

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

Использование метода query() позволяет писать условия в виде строки, что удобно при динамических фильтрах.

df_filtered = df.query('value > 15 & category == "A"')
print(df_filtered)

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

  category  value
2        A     15

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

Проблема:

Если в именах столбцов есть пробелы, их нужно заключать в обратные кавычки, иначе query выдаст синтаксическую ошибку. Пример: df.query('`my column` > 10').

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

Метод apply() с осью axis=1 позволяет запустить пользовательскую функцию на каждой строке. Это удобно, но медленнее векторизированных решений.

def ratio(row):
    return row['value'] / row['value'].sum() if row['value'].sum() != 0 else 0

df['ratio'] = df.apply(ratio, axis=1)
print(df)

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

  category  value     ratio
0        A     10  0.270270
1        B     20  0.540541
2        A     15  0.405405
3        B     25  0.675676
4        A     12  0.324324

Типичная ошибка:

Забыть указать axis=1 – тогда функция применяется к каждому столбцу. Также стоит избегать использования apply в циклах, если есть векторизированная альтернатива (например, np.where).

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

Расширенные примеры анализа данных

1. Многоуровневая агрегация с пользовательскими функциями

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

df = pd.DataFrame({
    'city': ['Moscow', 'SPb', 'Moscow', 'SPb', 'Moscow'],
    'year': [2020, 2020, 2021, 2021, 2021],
    'sales': [100, 150, 120, 180, 130]
})

# группировка по двум ключам и несколько агрегаций
def range_metric(x):
    return x.max() - x.min()

agg_result = df.groupby(['city', 'year']).agg(
    total_sales=('sales', 'sum'),
    avg_sales=('sales', 'mean'),
    sales_range=('sales', range_metric),
    count=('sales', 'count')
)
print(agg_result)
            total_sales  avg_sales  sales_range  count
city   year                                           
Moscow 2020          100      100.0            0      1
       2021          250      125.0           10      2
SPb    2020          150      150.0            0      1
       2021          180      180.0            0      1

2. Анализ временных рядов с rolling и expanding

Пример
dates = pd.date_range('2023-01-01', periods=6, freq='D')
df_ts = pd.DataFrame({'date': dates, 'value': [5, np.nan, 8, 10, 12, 15]})
df_ts.set_index('date', inplace=True)

# скользящее среднее с окном 3 (минимум 2 наблюдения)
df_ts['rolling_mean'] = df_ts['value'].rolling(window=3, min_periods=2).mean()

# экспоненциальное сглаживание
df_ts['ewm_mean'] = df_ts['value'].ewm(alpha=0.5, adjust=False).mean()

print(df_ts)
            value  rolling_mean  ewm_mean
date                                    
2023-01-01    5.0           NaN  5.000000
2023-01-02    NaN           5.0  5.000000
2023-01-03    8.0           6.5  6.500000
2023-01-04   10.0           9.0  8.250000
2023-01-05   12.0          10.0  9.937500
2023-01-06   15.0          12.5 12.468750

3. Векторизированные вычисления с NumPy (замена apply)

Пример
import numpy as np
# создадим столбец с категорией на основе числового значения
conditions = [
    (df['value'] < 10),
    (df['value'] >= 10) & (df['value'] < 20),
    (df['value'] >= 20)
]
choices = ['low', 'mid', 'high']
df['level'] = np.select(conditions, choices, default='unknown')
print(df)
  category  value     ratio level
0        A     10  0.270270   mid
1        B     20  0.540541  high
2        A     15  0.405405   mid
3        B     25  0.675676  high
4        A     12  0.324324   mid

4. Обработка пропусков с интерполяцией

Пример
df_na = pd.DataFrame({'A': [1, np.nan, 3, np.nan, 5]})
df_na['linear'] = df_na['A'].interpolate(method='linear')
df_na['quadratic'] = df_na['A'].interpolate(method='quadratic')
print(df_na)
     A  linear  quadratic
0  1.0     1.0   1.000000
1  NaN     2.0   1.666667
2  3.0     3.0   3.000000
3  NaN     4.0   4.333333
4  5.0     5.0   5.000000

5. Пакетная обработка больших файлов с chunksize

Пример
chunk_iter = pd.read_csv('large_file.csv', chunksize=1000)
total_sum = 0
for chunk in chunk_iter:
    # предполагаем столбец 'value'
    total_sum += chunk['value'].sum()
print('Общая сумма:', total_sum)

Анализ данных с помощью Python - comments

En
Python системный анализ данных (python)