Анализ данных с помощью Python: Pandas и NumPy в действии

Раздел: Прикладное программирование -> Pandas и NumPy

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

Как загрузить и предварительно обработать данные из CSV файла с пропусками?

Наиболее эффективный способ использует Pandas с указанием типов столбцов и обработкой пропусков при чтении:

import pandas as pd
import numpy as np

# Чтение с указанием типов и преобразованием пропусков
df = pd.read_csv('data.csv',
                 dtype={'age': np.float64, 'salary': np.float64},
                 na_values=['NA', 'N/A', ''])
# Заполнение пропусков медианным значением
for col in ['age', 'salary']:
    if df[col].dtype in [np.float64, np.int64]:
        df[col].fillna(df[col].median(), inplace=True)
print(df.head())

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

Типичная ошибка: столбец содержит строковые значения NaN, но Pandas не распознаёт их как пропуски. Решение: явно указать список значений через na_values.

Проблема: при заполнении пропусков медианой для целочисленных столбцов тип может измениться на float. Для сохранения int используйте fillna с последующим преобразованием astype.

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

Вариант с методом groupby и списком функций:

grouped = df.groupby('category')['salary'].agg(['mean', 'std', 'count'])
print(grouped)

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

Другой вариант - использование NamedAgg для именования результатов:

import pandas as pd
agg_funcs = pd.NamedAgg(column='salary', aggfunc='median')
grouped2 = df.groupby('category').agg(avg_salary=pd.NamedAgg(column='salary', aggfunc='mean'),
                                          med_salary=agg_funcs)
print(grouped2)

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

Возможная ошибка: при использовании agg с несколькими функциями результат получается с MultiIndex. Для упрощения используйте reset_index или параметр as_index=False.

Как найти корреляцию между числовыми столбцами и визуализировать её?

Используется DataFrame.corr() и библиотека Seaborn:

corr_matrix = df[['age', 'salary', 'years_experience']].corr()
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('Корреляционная матрица')
plt.show()

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

Альтернатива - использование corrwith для одного столбца:

corr_with_salary = df.corrwith(df['salary'])
print(corr_with_salary.sort_values(ascending=False))

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

Ошибка: корреляция вычисляется только для числовых столбцов. Если в DataFrame есть строковые данные, они игнорируются. Решение: предварительно выделить числовые столбцы через select_dtypes.

Как очистить данные от дубликатов и выбросов?

Базовый вариант:

# Удаление дубликатов по всем столбцам
df_clean = df.drop_duplicates()
# Удаление строк с выбросами (метод межквартильного размаха)
Q1 = df['salary'].quantile(0.25)
Q3 = df['salary'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df_no_outliers = df[(df['salary'] >= lower_bound) & (df['salary'] <= upper_bound)]
print(f'Было строк: {len(df)}, стало: {len(df_no_outliers)}')

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

Проблема: выбросы могут быть значимыми для анализа. Перед удалением стоит рассмотреть цензурирование (замена на границы) или отдельную обработку. Для проверки используйте boxplot.

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

Через apply для столбца:

def categorize_salary(val):
    if val < 30000:
        return 'low'
    elif val < 70000:
        return 'medium'
    else:
        return 'high'
df['salary_category'] = df['salary'].apply(categorize_salary)

Python анализ текстовых данных (анализ текстовых данных в python)

Для группы - transform:

df['salary_normalized'] = df.groupby('category')['salary'].transform(lambda x: (x - x.mean()) / x.std())

Ошибка: apply возвращает Series с индексом, что может вызвать проблемы при добавлении в DataFrame. Используйте result_type='expand' для возврата DataFrame.

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

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

Как выполнить слияние нескольких таблиц разных структур?

Пример
# Пример объединения трёх DataFrame с разными ключами
import pandas as pd

df_orders = pd.DataFrame({'order_id': [1,2,3],
                          'customer_id': [101,102,103],
                          'amount': [250, 300, 150]})
df_customers = pd.DataFrame({'customer_id': [101,102,104],
                              'name': ['Иван', 'Мария', 'Петр']})
df_items = pd.DataFrame({'order_id': [1,2,2,3],
                          'item': ['ноутбук', 'мышь', 'клавиатура', 'монитор']})

# Сначала left join customers к orders
merged = pd.merge(df_orders, df_customers, on='customer_id', how='left')
# Затем inner join с items
final = pd.merge(merged, df_items, on='order_id', how='inner')
print(final)
   order_id  customer_id  amount name    item
0         1          101     250  Иван  ноутбук
1         2          102     300 Мария    мышь
2         2          102     300 Мария клавиатура
3         3          103     150  NaN  монитор

Как создать сводную таблицу (pivot) с множественными индексами и значениями?

Пример
# Предположим, есть данные о продажах по месяцам и категориям
sales = pd.DataFrame({
    'month': ['Янв','Янв','Фев','Фев','Мар','Мар'],
    'category': ['A','B','A','B','A','B'],
    'revenue': [100, 200, 150, 250, 130, 210],
    'quantity': [10, 20, 15, 25, 13, 21]
})
# Сводная: строки - месяц, столбцы - категория, значения - сумма revenue
pivot_table = pd.pivot_table(sales,
                             values='revenue',
                             index='month',
                             columns='category',
                             aggfunc='sum',
                             fill_value=0)
print(pivot_table)
category    A    B
month            
Фев       150  250
Мар       130  210
Янв       100  200

Как работать с временными рядами: ресемплинг и скользящее среднее?

Пример
# Создание временного ряда с датами
dates = pd.date_range('2023-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100).cumsum(), index=dates)
# Ресемплинг по неделям и усреднение
weekly = ts.resample('W').mean()
# Скользящее среднее за 7 дней
rolling = ts.rolling(window=7).mean()
# Вывод первых 10 значений исходного ряда и скользящего среднего
print(pd.concat([ts.head(10), rolling.head(10)], axis=1).head(10))
                   0         1
2023-01-01 -0.975260       NaN
2023-01-02 -1.814599       NaN
2023-01-03 -2.724632       NaN
2023-01-04 -3.312218       NaN
2023-01-05 -2.937545       NaN
2023-01-06 -3.564893       NaN
2023-01-07 -3.079528 -2.629811
2023-01-08 -3.891894 -3.046473
2023-01-09 -3.428841 -3.277079
2023-01-10 -3.970819 -3.312248

Как использовать NumPy для быстрых математических операций с DataFrame?

Пример
# Применение numpy функций к столбцам
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
df['c'] = np.sqrt(df['a']**2 + df['b']**2)  # евклидово расстояние
# Векторизованная замена значений с np.where
df['d'] = np.where(df['a'] > df['b'].mean(), 'big', 'small')
print(df)
   a  b         c      d
0  1  4  4.123106  small
1  2  5  5.385165  small
2  3  6  6.708204  small

Как выполнить перекрёстную таблицу (crosstab) с нормализацией?

Пример
# Данные опроса: пол и предпочтения
data = {'gender': ['M','F','M','F','M','F'],
        'preference': ['A','A','B','B','A','B']}
df_survey = pd.DataFrame(data)
# Перекрёстная таблица с процентами по строкам
ct = pd.crosstab(df_survey['gender'], df_survey['preference'], normalize='index')
print(ct)
preference         A         B
gender                      
F           0.333333  0.666667
M           0.666667  0.333333

Как обрабатывать категориальные данные с помощью get_dummies и OneHotEncoder?

Пример
# Простой способ: pd.get_dummies
df = pd.DataFrame({'city': ['Moscow','SPb','Moscow','Kazan']})
dummies = pd.get_dummies(df['city'], prefix='city')
df = pd.concat([df, dummies], axis=1)
print(df)
    city  city_Kazan  city_Moscow  city_SPb
0  Moscow           0            1         0
1    SPb           0            0         1
2  Moscow           0            1         0
3   Kazan           1            0         0

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

Пример
# Фильтрация с помощью f-строк в query
min_salary = 40000
max_salary = 80000
# Безопасно передаём переменные через @
filtered = df.query('salary >= @min_salary and salary <= @max_salary')
print(filtered.shape)
(15, 5)  # примерное количество строк

Как объединить несколько Excel файлов с разными листами в один DataFrame?

Пример
import glob

all_files = glob.glob('data/*.xlsx')
df_list = []
for file in all_files:
    # Чтение всех листов
    xls = pd.ExcelFile(file)
    for sheet in xls.sheet_names:
        temp = pd.read_excel(file, sheet_name=sheet)
        temp['source'] = f'{file}_{sheet}'
        df_list.append(temp)
df_combined = pd.concat(df_list, ignore_index=True)
print(f'Всего строк: {len(df_combined)}')

Анализ данных на Python - comments

En
примеры анализа данных python (python)