Боевое руководство по анализу данных с помощью бибиотеки Pandas в Python
1. Введение в Pandas
Pandas - это библиотека с открытым исходным кодом на Python, используемая для обработки и анализа данных. Она предлагает структуры данных и операции для работы с числовыми таблицами и временными рядами. Особенно хорошо подходит для работы со структурированными данными, т.е. данными, организованными в таблицы.
Ряды (Series) и датафреймы (DataFrames): две основные структуры данных в Pandas.
- Ряд - это одномерная структура, похожая на массив.
- Датафрейм - это двумерная, изменяемая по размеру и потенциально неоднородная табличная структура данных.
Пример 1. Создание ряда
import pandas as pd
s = pd.Series([1, 3, 5, 7, 9])
print(s)
Пример 2. Создание датафрейма
data = {'Name': ['Игорь', 'Ирина', 'Петр', 'Василий'],
'Age': [28, 34, 29, 32]}
df = pd.DataFrame(data)
print(df)
# Создание датафрейма из словаря.
import pandas as pd
data = {
'Name': ['Петр', 'Иван', 'Алексей'],
'Age': [25, 30, 35],
'City': ['Москва', 'Санкт-Петербург', 'Екатеринбург']
}
df = pd.DataFrame(data)
print(df)
2. Импорт и экспорт данных
Pandas поддерживает различные форматы данных для импорта и экспорта, такие как CSV, Excel и базы данных SQL.
Чтение из CSV
df = pd.read_csv('path/to/your/file.csv')
print(df.head())
Запись данных в формат CSV
df.to_csv('path/to/save/file.csv', index=False)
Подробнее об импорте/экспорте читайте в документации Pandas IO Tools
3. Основные операции с данными
Эти операции включают в себя просмотр, выбор, индексацию и срез данных.
Просмотр данных
# Просмотр первых нескольких строк датафрейма
print(df.head())
Выбор столбца
# Доступ к столбцу в датафрейме
ages = df['Age']
print(ages)
print(df['Name']) # Отображает столбец Name
Срез строк
subset = df[0:2] # Первые две строки
print(subset)
Фильтрация данных: выбор строк по условию.
filtered_df = df[df['Age'] > 30] # строки где возраст больше 30
print(filtered_df)
Добавление столбцов: вы можете добавлять новые столбцы в датафрейм.
df['AgeInTenYears'] = df['Age'] + 10
print(df)
4. Очистка данных
Очистка данных включает в себя обработку отсутствующих данных, преобразование типов данных и переименование/замену значений.
Обработка недостающих данных
df.fillna(0, inplace=True) # замена отсутствующих значений нулями
Преобразование типов данных
df['Age'] = df['Age'].astype(float)
Переименование столбцов
df.rename(columns={'Age': 'AgeYears'}, inplace=True)
5. Простой анализ данных
Pandas предоставляет функции для выполнения простой описательной статистики и агрегирования данных.
Описательная статистика
# быстрый вывод статистической сводки
print(df.describe())
Агрегация
print(df['Age'].mean()) # Средний возраст
6. Простая визуализация данных
Pandas может интегрироваться с Matplotlib и Seaborn для простого построения графиков.
Линейный график
df.plot(kind='line')
Столбчатый график
df['Age'].plot(kind='bar')
7. Расширенные возможности работы с данными
Такие операции требуют более сложных методов индексации, отбора и фильтрации.
Множественная индексация или мультииндексация
arrays = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('letter', 'number'))
df_multi = pd.DataFrame({'data': [100, 200, 300, 400]}, index=index)
print(df_multi)
Множественная индексация позволяет вам иметь несколько уровней индексации на одной оси. Это позволяет работать с данными более высокой размерности в виде данных меньшей размерности.
Пример: создание и использование мультииндексированного датафрейма.
import pandas as pd
# Исходные данные
arrays = [
['a', 'a', 'b', 'b'],
[1, 2, 1, 2]
]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
print(df)
# Выборка данных с мультииндексацией
print(df.loc['a']) # Выделение всех строк с первым индексом a
Условная выборка
# Выбор строк где Age больше 30
print(df[df['Age'] > 30])
filtered_df = df[df['Age'] > 30] # ячейки где возраст больше 30
print(filtered_df)
Продвинутые методы индексации
# Выбор строк по индексу
print(df.iloc[1:3])
8. Преобразование данных
Преобразование данных с использованием таких функций, как apply, и выполнение групповых операций.
Использование Apply
# Применяет функцию к каждому элементу столбца
df['AgeSquared'] = df['Age'].apply(lambda x: x**2)
Операции GroupBy
# Группировка данных и вычисление среднего
# значения для каждой группы
grouped = df.groupby('Department')
print(grouped['Salary'].mean())
Сводные таблицы
# Создание сводной таблицы
pivot = df.pivot_table(values='Sales', index='Region', columns='Year')
print(pivot)
Для получения дополнительной информации о преобразовании данных ознакомьтесь с документацией Pandas GroupBy.
9. Данные временных рядов
Pandas отлично подходит для манипулирования данными временных рядов.
Обработка даты и времени
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dt.month) # Извлечь месяц
Индексация по времени
df.set_index('Date', inplace=True)
print(df.loc['2024–01']) # Даты с января 2024
Повторная выборка временных рядов
monthly_data = df.resample('M').mean()
print(monthly_data)
Pandas исключительно хорошо подходит для работы с данными временных рядов, особенно с его DatetimeIndex.
Пример: Работа с DatetimeIndex и повторная выборка.
# Создание данных временного ряда
ts = pd.date_range('2021-01-01', periods=5, freq='D')
time_series = pd.DataFrame({'value': [10, 20, 15, 30, 45]}, index=ts)
print(time_series)
# Повторная выборка (e.g., finding mean value for each month)
monthly_resample = time_series.resample('M').mean()
print(monthly_resample)
Для получения дополнительной информации ознакомьтесь с функциональностью временных рядов/данных Pandas.
10. Объединение данных
Слияние, объединение и конкатенация наборов данных имеют решающее значение при объединении данных из разных источников.
Метод Merge (слияние)
merged = pd.merge(df1, df2, on='key')
Метод Join (присоединение)
joined = df1.join(df2, lsuffix='_df1', rsuffix='_df2')
Конкатенация
concatenated = pd.concat([df1, df2], axis=0)
Сложные слияния и присоединения
Pandas предоставляет SQL-подобные функциональные возможности для соединения или слияния различных датасетов по общим ключам.
Пример: выполнение внутреннего и внешнего соединений (inner/outer join).
# Исходные датафреймы
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value': [4, 5, 6]})
# Внутреннее соединение
inner_join = pd.merge(df1, df2, on='key', how='inner', suffixes=('_df1', '_df2'))
print(inner_join)
# Внешнее соединение
outer_join = pd.merge(df1, df2, on='key', how='outer', suffixes=('_df1', '_df2'))
print(outer_join)
Ознакомьтесь с разделом Объединение фреймов данных с Pandas для получения более подробной информации.
11. Расширенная очистка данных
Включает в себя более сложные методы очистки данных, такие как устранение выбросов и условное вычисление пропущенных данных.
Работа с выбросами (outliers)
Выбросом считается значение в данных, которое находится далеко за пределами других наблюдений.
# Удаление выбросов
Q1 = df['Salary'].quantile(0.25)
Q3 = df['Salary'].quantile(0.75)
IQR = Q3 - Q1
filter = (df['Salary'] >= Q1–1.5 * IQR) & (df['Salary'] <= Q3 + 1.5 * IQR)
df = df.loc[filter]
Сложное вычисление недостающих данных
# заполнение пропущенных значений средним по столбцу
df['Salary'].fillna(df['Salary'].mean(), inplace=True)
12. Производительность и результативность
Оптимизация работы Pandas для повышения производительности.
Использование категориальных типов данных
df['Category'] = df['Category'].astype('category')
Оптимизация операций
# Используйте iterrows() эффективно
for index, row in df.iterrows():
# Выполняйте операции
Использование эффективных типов данных: по умолчанию в Pandas используются типы данных с большим объемом памяти. Оптимизация типов данных, особенно для больших наборов данных, позволяет сэкономить память и повысить производительность.
Пример: Преобразование типов данных.
# Для столбцов с небольшим количеством уникальных значений
df['column'] = df['column'].astype('category')
df['int_column'] = pd.to_numeric(df['int_column'], downcast='integer')
Обработка данных частями: Для очень больших датасетов, которые не помещаются в память, вы можете считывать и обрабатывать данные частями (чанками).
Пример: Обработка большого CSV-файла по частям.
chunk_size = 10000 # указывайте в соответствии с объемом вашей памяти
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
process(chunk)
Использование эффективных функций и отсутствие циклов: Векторизованные операции выполняются намного быстрее, чем применение функций по строкам или использование циклов.
Пример: Использование векторизованных операций вместо циклов.
df['new_column'] = df['column1'] + df['column2'] # Векторное сложение
Чтобы узнать больше об оптимизации производительности Pandas, посетите раздел Повышение производительности в Pandas.
13. Кастомные операции
Использование window функций
# Скользящее среднее
df['RollingMean'] = df['Column'].rolling(window=3).mean()
Кастомные агрегации с помощью GroupBy
def custom_agg(x):
return x.max() - x.min()
grouped = df.groupby('Category')['Value']
grouped.agg(custom_agg)
Pandas позволяет вам определять свои функции и применять их к вашим данным, что особенно полезно для конкретных задач агрегирования.
Использование функции apply(): она позволяет вам применить свою функцию к каждой строке/столбцу датафрейма.
Пример: своя функция с помощью apply().
def custom_func(x):
return x.max() - x.min()
df['range'] = df.apply(custom_func, axis=1) # применение к каждой строке
Кастомная агрегация с помощью groupby(): Для сгруппированных данных вы можете использовать свои функции агрегации.
Пример: своя функция агрегации с помощью groupby().
def custom_agg(x):
return x.quantile(0.75) - x.quantile(0.25)
grouped = df.groupby('category')['value']
custom_agg_result = grouped.agg(custom_agg)
Используйте applymap() для поэлементных операций: если вам нужно применить функцию к каждому элементу в датафрейма, applymap() будет полезен.
Пример собственной операции по элементам.
df = df.applymap(lambda x: x*2 if x > 0 else x)
14. Расширенная аналитика и моделирование
Интеграция со статистическими библиотеками и библиотеками машинного обучения для более глубокого анализа данных.
Статистический анализ
Интеграция со статистическими библиотеками: Pandas может быть интегрирован с такими библиотеками, как statsmodels и scikit-learn, для расширенного статистического анализа и машинного обучения.
Пример: линейная регрессия с использованием statsmodels.
import statsmodels.api as sm
# Допустим, df - датафрейм Pandas с предикторными переменными
# и конечной переменной y
X = df.drop('y', axis=1)
y = df['y']
# Добавление константы в модель (перехват)
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
print(model.summary())
Интеграция машинного обучения
Машинное обучение с помощью Scikit-learn: для задач машинного обучения вы можете подготовить свои данные с помощью Pandas, а затем ввести их в модель scikit-learn.
Пример: использование фрейма данных Pandas с моделью scikit-learn.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# Разделение датасета на обучающие и тестовые наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# Обучение модели линейной регрессии
model = LinearRegression().fit(X_train, y_train)
# Составление прогнозов и оценка модели
predictions = model.predict(X_test)
15. Высокая производительность Pandas
Работа с большими датасетами и оптимизация производительности.
Разделение больших датасетов на части (чанки)
chunk_size = 10000
for chunk in pd.read_csv('large_dataset.csv', chunksize=chunk_size):
process(chunk)
Параллельная обработка с помощью Dask
Используйте библиотеки, такие как Dask или Ray, для параллельной обработки больших наборов данных.
# Пример использования Dask для параллельной обработки данных
import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=10)
result = ddf.groupby('column').mean().compute()
Дополнительные сведения о Dask см. в документации по Dask.
16. Визуализация и дашборды (информационные панели)
Создание интерактивных визуализаций и информационных панелей с использованием Pandas и других библиотек.
Интерактивные визуализации с помощью Plotly
import plotly.express as px
fig = px.line(df, x='Date', y='Value', title='Time Series Plot')
fig.show()
Создание информационных панелей с помощью Dash Plotly
import dash
import dash_core_components as dcc
import dash_html_components as html
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Graph(figure=fig)
])
Больше о возможностях Dash Plotly вы сможете найти на сайте Dash Plotly.
17. Глубокое погружение в исходный код Pandas
Понимание принципа работы Pandas может помочь внести свой вклад в их развитие.
Погружение в исходный код включает в себя:
- Знакомство с репозиторием Pandas на GitHub
- Понимание кода на Python, Cython и C, который поддерживает Pandas
- Участие в разработке Pandas
18. Специализированные типы данных
Обработка более сложных типов данных, таких как текст и категориальные данные.
Операции с текстовыми данными
# Строковые операции
df['TextColumn'].str.upper()
df['TextColumn'].str.contains('pattern')
Расширенная обработка категориальных данных
df['Category'] = df['Category'].astype('category')
df['Category'].cat.reorder_categories(['Low', 'Medium', 'High'], ordered=True)
Документация Pandas по-прежнему является бесценным ресурсом для более глубокого понимания этих сложных тем. Кроме того, специализированные книги и онлайн-курсы, посвященные высокоуровневому анализу данных и машинному обучению, могут предоставить больше информации о контексте и применении этих функций Pandas.
Комментарии
Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте