popov . dev

Main

Library

Articles

Боевое руководст...

Боевое руководство по анализу данных с помощью бибиотеки 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.

Comments

In order to leave your opinion, you need to register on the website