Системный анализ данных на Python
Основные методы анализа данных
Рекомендуемый подход: группировка и агрегация с 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).
Расширенные примеры анализа данных
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 12. Анализ временных рядов с 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)