Example #1
0
def make_report(report_name: str, portfolio: Portfolio):
    """Формирует отчет из pdf-файла и исходных xlsx-данных.

    Отчет сохраняется в PDF_PATH. Для каждого отчета создается папка с наименованием и датой, куда
    помещаются pdf- и xlsx-файлы.
    """
    data = read_data(report_name)
    # Верхний колонтитул
    date = portfolio.date
    pdf_path, xlsx_path = make_report_files_path(report_name, date)
    canvas = pdf_style.make_blank_report(pdf_path)
    pdf_style.make_header(canvas, date)
    # Верхний блок
    upper_block_position = pdf_style.BlockPosition(
        canvas=canvas,
        x=pdf_style.left_margin(),
        y=pdf_style.bottom_margin() + FIRST_BLOCK_HEIGHT,
        width=pdf_style.blank_width(),
        height=pdf_style.blank_height() - FIRST_BLOCK_HEIGHT,
    )
    pdf_upper.flow_and_dividends_block(data[-61:], upper_block_position)
    # Разделитель между верхним и средним блоком
    pdf_style.make_section_delimiter(
        canvas, pdf_style.bottom_margin() + FIRST_BLOCK_HEIGHT
    )
    # Средний блок
    middle_block_position = pdf_style.BlockPosition(
        canvas=canvas,
        x=pdf_style.left_margin(),
        y=pdf_style.bottom_margin() + SECOND_BLOCK_HEIGHT,
        width=pdf_style.blank_width(),
        height=FIRST_BLOCK_HEIGHT - SECOND_BLOCK_HEIGHT,
    )
    pdf_middle.portfolio_return_block(data[-61:], middle_block_position)
    # Разделитель между средним и нижним блоком
    pdf_style.make_section_delimiter(
        canvas, pdf_style.bottom_margin() + SECOND_BLOCK_HEIGHT
    )
    # Нижний блок
    lower_block_position = pdf_style.BlockPosition(
        canvas=canvas,
        x=pdf_style.left_margin(),
        y=pdf_style.bottom_margin() + THIRD_BLOCK_HEIGHT,
        width=pdf_style.blank_width(),
        height=SECOND_BLOCK_HEIGHT - THIRD_BLOCK_HEIGHT,
    )
    pdf_lower.portfolio_structure_block(portfolio, lower_block_position)
    # Сохранение pdf-отчета и xlsx-данных
    canvas.save()
    data.to_excel(xlsx_path, SHEET_NAME)
Example #2
0
"""Хранение истории стоимости портфеля и составление отчетов."""
import numpy as np
import pandas as pd

from poptimizer.config import REPORTS_PATH, POptimizerError
from poptimizer.portfolio import Portfolio, PORTFOLIO
from poptimizer.reports import pdf_style, pdf_upper, pdf_middle, pdf_lower

# Каталог с pdf-отчетами
PDF_PATH = REPORTS_PATH / "pdf"

# Лист с данными
SHEET_NAME = "Data"

# Положение блоков относительно нижнего поля
FIRST_BLOCK_HEIGHT = pdf_style.blank_height() * 0.76
SECOND_BLOCK_HEIGHT = pdf_style.blank_height() * 0.38
THIRD_BLOCK_HEIGHT = pdf_style.blank_height() * 0


def read_data(report_name: str):
    """Читает исходные данные по стоимости портфеля из файла."""
    data = pd.read_excel(
        REPORTS_PATH / f"{report_name}.xlsx",
        sheet_name=SHEET_NAME,
        header=0,
        index_col=0,
        converters={"Date": pd.to_datetime},
        engine="openpyxl",
    )
    return data