mam długi kod w python, który generuje raport w pdf. Chciałbym dodać do niego opcje, która dla wykresów:
- BASE Y-26 k=365
- PEAK Y-26 k=365

dodaje w lewym górnym rogu legendę: LtD: {wartosc}

{wartosc} - bierze się z excela, jest do dla  BASE Y-26 k=365 wartość z znajdująca się w kolumnie D, w wierszu 2 w arkuszu o nazwie "B_Y", ale PEAK Y-26 k=365 znajduję się rownież w kolumnie D w wierszu 2, ale w arkuszu "P_Y"

popraw kod poniżej, aby dodać to co wyżej opisałem:
import os
from datetime import datetime, timedelta
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.ticker import MultipleLocator
from reportlab.lib.pagesizes import landscape, A4
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor


# ==============================
# KONFIGURACJA I STAŁE
# ==============================
class Config:
    """Centralizacja ustawień konfiguracyjnych."""
    EXCEL_PATH = r"T:\Departament Zarządzania Portfelem (HP)\BIURO ANALIZ RYNKOWYCH (HPA)\RAPORTY BIURA ANALIZ RYNKOWYCH\RAPORTY DOBOWE\RAPORT DZIENNY\RAPORT\test_nowe_raporty\Dane-ee.xlsm"
    LOGO_PATH = r"T:\Departament Zarządzania Portfelem (HP)\BIURO ANALIZ RYNKOWYCH (HPA)\RAPORTY BIURA ANALIZ RYNKOWYCH\RAPORTY DOBOWE\RAPORT DZIENNY\RAPORT\test_nowe_raporty\logo_enei_rgb.png"
    OUTPUT_DIR = r"T:\Departament Zarządzania Portfelem (HP)\BIURO ANALIZ RYNKOWYCH (HPA)\RAPORTY BIURA ANALIZ RYNKOWYCH\RAPORTY DOBOWE\RAPORT DZIENNY\RAPORT\test_nowe_raporty"

    TODAY_STR = datetime.today().strftime("%Y-%m-%d")
    PDF_FILENAME = f"Raport dobowy - rynek energii {TODAY_STR}.pdf"
    PDF_PATH = os.path.join(OUTPUT_DIR, PDF_FILENAME)

    # Parametry strony PDF
    PAGE_SIZE = landscape(A4)
    PAGE_WIDTH, PAGE_HEIGHT = PAGE_SIZE
    LOGO_WIDTH, LOGO_HEIGHT = 120, 60

    # Marginesy i layout
    MARGIN_LEFT = 40
    MARGIN_RIGHT = 40
    MARGIN_TOP = 80
    MARGIN_BOTTOM = 50
    FOOTER_TEXT = "ENEA Trading Sp. z o.o./Departament Analiz i Zarzadzania Portfelem"

    # Konfiguracja wykresów
    CHART_CONFIGS = [
        {
            "sheet": "B_Y",
            "title": "BASE Y-26 k=365",
            "color": "#1E90FF",
            "days": 365,
            "output": os.path.join(OUTPUT_DIR, "chart_base_y26_365.png")
        },
        {
            "sheet": "P_Y",
            "title": "PEAK Y-26 k=365",
            "color": "#FF7F0E",
            "days": 365,
            "output": os.path.join(OUTPUT_DIR, "chart_peak_y26_365.png")
        },
        {
            "sheet": "B_Y",
            "title": "BASE Y-26 k=30",
            "color": "#1E90FF",
            "days": 30,
            "output": os.path.join(OUTPUT_DIR, "chart_base_y26_30.png")
        },
        {
            "sheet": "P_Y",
            "title": "PEAK Y-26 k=30",
            "color": "#FF7F0E",
            "days": 30,
            "output": os.path.join(OUTPUT_DIR, "chart_peak_y26_30.png")
        }
    ]


# ==============================
# FUNKCJE POMOCNICZE
# ==============================
def setup_directories():
    """Utworzenie katalogów wyjściowych jeśli nie istnieją."""
    os.makedirs(Config.OUTPUT_DIR, exist_ok=True)


def load_excel_data(sheet_name):
    """Wczytanie danych z Excela (raz na arkusz, aby uniknąć powtórzeń)."""
    if not os.path.exists(Config.EXCEL_PATH):
        raise FileNotFoundError(f"Plik Excel nie znaleziony: {Config.EXCEL_PATH}")

    try:
        df = pd.read_excel(Config.EXCEL_PATH, sheet_name=sheet_name, engine='openpyxl')
        df.iloc[:, 0] = pd.to_datetime(df.iloc[:, 0], format='%Y-%m-%d', errors='coerce')
        return df.dropna(subset=[df.columns[0]])  # Usunięcie wierszy z nieprawidłowymi datami
    except Exception as e:
        raise RuntimeError(f"Błąd wczytywania arkusza {sheet_name}: {e}")


def create_chart(df, title, color, output_img, days=365):
    """Generowanie wykresu na podstawie przygotowanych danych."""
    # Filtracja danych według zakresu dat
    start_date = datetime.today() - timedelta(days=days)
    df_recent = df[df.iloc[:, 0] >= start_date].copy()

    if df_recent.empty:
        raise ValueError(f"Brak danych dla zakresu {days} dni w arkuszu")

    dates = df_recent.iloc[:, 0]
    prices = df_recent.iloc[:, 1]
    volumes = df_recent.iloc[:, 2]

    # Utworzenie wykresu
    fig, ax1 = plt.subplots(figsize=(10, 5))

    # Wykres cen (linia)
    ax1.plot(dates, prices, color=color, linewidth=2.5, label='PLN/MWh')
    ax1.set_ylabel('PLN/MWh', color=color, fontsize=12)
    ax1.tick_params(axis='y', labelcolor=color, labelsize=12)
    ax1.grid(True, which='major', axis='y', linestyle='--', alpha=0.7)

    # Wykres wolumenów (słupki)
    ax2 = ax1.twinx()
    ax2.bar(dates, volumes, color='gray', alpha=0.6, label='Wolumen')
    ax2.set_ylabel('MW', color='gray', fontsize=12)
    ax2.tick_params(axis='y', labelcolor='gray', labelsize=12)

    # Dostosowanie osi Y dla wolumenów
    max_volume = volumes.max()
    if days <= 30:
        ax2.set_ylim(0, ((max_volume // 5) + 1) * 5)
        ax2.yaxis.set_major_locator(MultipleLocator(5))
    elif days > 300:
        ax2.set_ylim(0, ((max_volume // 10) + 1) * 10)
        ax2.yaxis.set_major_locator(MultipleLocator(10))

    # Formatowanie osi X (daty)
    ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    locator = mdates.WeekdayLocator(interval=3) if days > 180 else mdates.DayLocator(interval=2)
    ax1.xaxis.set_major_locator(locator)
    plt.setp(ax1.get_xticklabels(), rotation=45, ha='right', fontsize=10)

    # Legenda
    lines_1, labels_1 = ax1.get_legend_handles_labels()
    lines_2, labels_2 = ax2.get_legend_handles_labels()
    ax1.legend(
        lines_1 + lines_2, labels_1 + labels_2,
        loc='upper center', bbox_to_anchor=(0.5, -0.3),
        ncol=2, fontsize=10, frameon=False
    )

    # Zapis wykresu
    plt.title(title, fontsize=14, pad=20)
    plt.tight_layout(rect=(0, 0, 1, 0.95))
    plt.savefig(output_img, bbox_inches='tight', dpi=300)
    plt.close(fig)  # Zwolnienie pamięci


def draw_header(c):
    """Rysowanie logo w prawym górnym rogu."""
    try:
        c.drawImage(
            Config.LOGO_PATH,
            Config.PAGE_WIDTH - Config.LOGO_WIDTH - 20,  # Margines prawo: 20
            Config.PAGE_HEIGHT - Config.LOGO_HEIGHT - 20,  # Margines góra: 20
            width=Config.LOGO_WIDTH,
            height=Config.LOGO_HEIGHT,
            mask='auto'
        )
    except Exception as e:
        print(f"Ostrzeżenie: Nie udało się załadować logo: {e}")


def draw_footer(c, page_num):
    """Rysowanie stopki z informacjami i numerem strony."""
    c.setFont("Helvetica", 10)
    c.drawString(Config.MARGIN_LEFT, Config.MARGIN_BOTTOM - 10, Config.FOOTER_TEXT)
    c.drawRightString(Config.PAGE_WIDTH - Config.MARGIN_RIGHT, Config.MARGIN_BOTTOM - 10, f"{page_num}")


# ==============================
# GŁÓWNA LOGIKA GENEROWANIA PDF
# ==============================
def generate_pdf():
    """Tworzenie pełnego raportu PDF."""
    c = canvas.Canvas(Config.PDF_PATH, pagesize=Config.PAGE_SIZE)

    # Strona tytułowa
    draw_header(c)
    c.setFillColor(HexColor("#003366"))
    c.setFont("Helvetica-Bold", 32)
    c.drawCentredString(Config.PAGE_WIDTH / 2, Config.PAGE_HEIGHT - 150, "Raport dobowy")
    c.setFont("Helvetica-Bold", 24)
    c.drawCentredString(Config.PAGE_WIDTH / 2, Config.PAGE_HEIGHT - 200, "Rynek energii")
    c.setFillColor(HexColor("#000000"))
    c.setFont("Helvetica-Oblique", 16)
    c.drawCentredString(Config.PAGE_WIDTH / 2, Config.PAGE_HEIGHT - 380, f"Raport z dnia: {Config.TODAY_STR}")
    draw_footer(c, 1)
    c.showPage()

    # Strona 2 (możesz dodać treść)
    draw_header(c)
    draw_footer(c, 2)
    c.showPage()

    # Strona 3 z wykresami
    draw_header(c)

    # Tytuł sekcji
    c.setFont("Helvetica-Bold", 16)
    c.drawString(Config.MARGIN_LEFT, Config.PAGE_HEIGHT - Config.MARGIN_TOP,
                 "Notowania cen energii elektrycznej dla produktów rocznych na 2026 r.")

    # Wymiary i pozycje wykresów (2 wiersze, 2 kolumny)
    chart_width = (Config.PAGE_WIDTH - 2 * Config.MARGIN_LEFT) / 2 - 10  # Margines między wykresami: 10
    chart_height = (
                               Config.PAGE_HEIGHT - Config.MARGIN_TOP - Config.MARGIN_BOTTOM - 40) / 2  # 40 = odstęp między wierszami
    x_positions = [Config.MARGIN_LEFT, Config.MARGIN_LEFT + chart_width + 10]
    y_positions = [Config.PAGE_HEIGHT - Config.MARGIN_TOP - 40 - chart_height,
                   Config.PAGE_HEIGHT - Config.MARGIN_TOP - 40 - 2 * chart_height - 20]

    # Dodawanie wykresów
    charts = [
        Config.CHART_CONFIGS[0]["output"],  # base_365 (górny lewy)
        Config.CHART_CONFIGS[2]["output"],  # base_30 (górny prawy)
        Config.CHART_CONFIGS[1]["output"],  # peak_365 (dolny lewy)
        Config.CHART_CONFIGS[3]["output"]  # peak_30 (dolny prawy)
    ]

    for i, img_path in enumerate(charts):
        row = i // 2
        col = i % 2
        c.drawImage(
            img_path,
            x_positions[col],
            y_positions[row],
            width=chart_width,
            height=chart_height,
            preserveAspectRatio=True
        )

    draw_footer(c, 3)
    c.showPage()

    c.save()
    print(f"PDF zapisany: {Config.PDF_PATH}")


# ==============================
# URUCHOMIENIE SKRYPTU
# ==============================
def main():
    try:
        setup_directories()

        # Wczytanie danych raz na arkusz (zamiast czterokrotnie)
        data_cache = {}
        for config in Config.CHART_CONFIGS:
            sheet = config["sheet"]
            if sheet not in data_cache:
                data_cache[sheet] = load_excel_data(sheet)

        # Generowanie wykresów
        for config in Config.CHART_CONFIGS:
            create_chart(
                df=data_cache[config["sheet"]],
                title=config["title"],
                color=config["color"],
                output_img=config["output"],
                days=config["days"]
            )

        # Generowanie PDF
        generate_pdf()
        print("Proces zakończony pomyślnie.")

    except Exception as e:
        print(f"Błąd: {e}")
        exit(1)


if __name__ == "__main__":
    main()