Исходный код analysis
import pandas as pd
import matplotlib.pyplot as plt
[документация]
def transactions_to_df(transactions: list) -> pd.DataFrame:
"""Преобразует список объектов транзакций в объект pandas DataFrame.
Функция собирает данные из объектов транзакций и выполняет постобработку:
преобразует строковые даты в объекты `datetime64`, что позволяет в дальнейшем
проводить временной анализ (группировку по месяцам, расчет трендов и т.д.).
Args:
transactions (list[Transaction]): Список экземпляров класса :class:`Transaction`.
Returns:
pd.DataFrame: Таблица данных с колонками, соответствующими полям транзакции.
Если список пуст, возвращается пустой DataFrame. Колонки результата:
'amount', 'category', 'date', 'description', 'transaction_type'.
Note:
Столбец 'date' автоматически конвертируется в формат :obj:`pandas.Timestamp`
только в том случае, если DataFrame не пуст.
Example:
>>> transactions = [Transaction(100.0, "Еда", "2026-01-06")]
>>> df = transactions_to_df(transactions)
>>> print(df['date'].dtype)
datetime64[ns]
"""
df = pd.DataFrame([tr.to_dict() for tr in transactions])
if not df.empty:
# Приведение к формату datetime для корректной работы с временными рядами
df["date"] = pd.to_datetime(df["date"])
return df
[документация]
def group_by_category(df: pd.DataFrame, transaction_type: str) -> pd.Series:
"""Группирует данные по категориям и вычисляет суммарный объем средств.
Функция фильтрует входной DataFrame по указанному типу транзакций (доход или расход)
и суммирует значения в столбце 'amount' для каждой уникальной категории.
Args:
df (pd.DataFrame): Таблица данных, содержащая столбцы 'transaction_type',
'category' и 'amount'.
transaction_type (str): Тип операции для фильтрации (например, 'expense'
или 'income').
Returns:
pd.Series: Объект Series, где индексами являются названия категорий,
а значениями — общие суммы по каждой категории.
Example:
>>> # Получение суммы расходов по категориям
>>> expenses_by_cat = group_by_category(df, 'expense')
>>> print(expenses_by_cat['Еда'])
5000.0
"""
filtered = df[df["transaction_type"] == transaction_type]
return filtered.groupby("category")["amount"].sum()
[документация]
def plot_pie_by_category(df: pd.DataFrame, transaction_type: str):
"""Строит круговую диаграмму распределения финансов по категориям.
Функция агрегирует данные для выбранного типа операций (доходы или расходы)
и визуализирует процентное соотношение каждой категории в общем объеме.
Если данные для указанного типа отсутствуют, график не строится.
Args:
df (pd.DataFrame): Таблица данных, содержащая как минимум колонки
'transaction_type', 'category' и 'amount'.
transaction_type (str): Тип операций для отображения: 'expense' (расходы)
или 'income' (доходы).
Note:
- Функция использует метод `plt.show()` для отображения графика, что
может блокировать выполнение кода в зависимости от настроек бэкенда Matplotlib.
- Для корректного отображения меток категорий на русском языке убедитесь,
что в Matplotlib настроены шрифты с поддержкой кириллицы.
Returns:
None: Функция отображает интерактивное окно с графиком через `plt.show()`.
"""
data = group_by_category(df, transaction_type)
if data.empty:
print(f"Нет данных для {transaction_type}")
return
# Построение диаграммы с настройками размера и отображением процентов
data.plot(
kind="pie",
autopct="%1.1f%%",
figsize=(6,6),
title=f"{transaction_type.capitalize()} по категориям"
)
plt.ylabel("") # Скрываем стандартную подпись оси Y (название Series)
plt.show()
[документация]
def plot_income_expence_over_time(df: pd.DataFrame):
"""Визуализирует динамику доходов и расходов во времени.
Функция группирует транзакции по датам и типам, вычисляет ежедневные суммы
и строит линейный график. Позволяет наглядно сравнить притоки и оттоки
денежных средств на временной шкале.
Args:
df (pd.DataFrame): Таблица данных. Должна содержать колонки 'date',
'transaction_type' и 'amount'. Колонка 'date' должна иметь
тип datetime64.
Note:
- Если в определенную дату отсутствует один из типов операций (например,
только расходы), функция подставит 0 для корректного отображения графика.
- Для корректной работы функции рекомендуется предварительно обработать
DataFrame функцией :func:`transactions_to_df`.
Returns:
None: Функция отображает интерактивное окно с графиком через `plt.show()`.
Raises:
KeyError: Если в DataFrame отсутствуют необходимые колонки.
"""
if df.empty:
print("Нет данных для графика")
return
# Группировка по дате и типу, затем разворачивание типов в отдельные колонки
df_grouped = df.groupby(["date", "transaction_type"])["amount"].sum().unstack(fill_value=0)
# Построение графика с маркерами на каждой точке данных
df_grouped.plot(
figsize=(8,5),
marker="o",
title="Доходы и расходы по времени"
)
plt.xlabel("Дата")
plt.ylabel("Сумма")
plt.grid(True)
plt.show()