| | import openpyxl |
| | import xgboost as xgb |
| | import gradio as gr |
| | import joblib |
| | import pandas as pd |
| | import numpy as np |
| | import seaborn as sns |
| | import statsmodels.api as sm |
| | import matplotlib.pyplot as plt |
| | import io |
| | from sklearn.preprocessing import MinMaxScaler |
| | from reportlab.lib import colors |
| | from reportlab.lib.units import inch |
| | from reportlab.lib.pagesizes import A4, landscape |
| | from reportlab.lib.styles import getSampleStyleSheet |
| | from reportlab.pdfgen.canvas import Canvas |
| | from reportlab.platypus import SimpleDocTemplate, Spacer, Image, Frame, PageTemplate, BaseDocTemplate, Table, Paragraph, NextPageTemplate, PageBreak |
| |
|
| | def get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, pred): |
| | |
| | pagesize = A4 |
| |
|
| |
|
| | def on_page(canvas, doc): |
| | page_num = canvas.getPageNumber() |
| | canvas.drawCentredString(pagesize[0] / 2, 50, str(page_num)) |
| |
|
| | def on_page_landscape(canvas, doc): |
| | return on_page(canvas, doc, pagesize=landscape(A4)) |
| | |
| | padding = dict( |
| | leftPadding=72, |
| | rightPadding=72, |
| | topPadding=72, |
| | bottomPadding=18) |
| |
|
| | portrait_frame = Frame(0, 0, *A4, **padding) |
| | landscape_frame = Frame(0, 0, *landscape(A4), **padding) |
| |
|
| | portrait_template = PageTemplate(id='portrait', |
| | frames=portrait_frame, |
| | onPage=on_page, |
| | pagesize=A4) |
| |
|
| | landscape_template = PageTemplate(id='landscape', |
| | frames=landscape_frame, |
| | onPage=on_page_landscape, |
| | pagesize=landscape(A4)) |
| |
|
| | doc = BaseDocTemplate('report.pdf', |
| | pageTemplates=[portrait_template,landscape_template]) |
| | |
| | styles = getSampleStyleSheet() |
| |
|
| | story = [ |
| | Image('DAI.png', width=6.4 * inch, height=1.28 * inch), |
| | Spacer(1, 36), |
| | Paragraph('Modelo para Boxes de Estacionamento - XGBoost Regressor - 2024', styles['Heading1']), |
| | Paragraph('Parâmetros do cálculo', styles['Heading2']), |
| | Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']), |
| | Paragraph(f"Região Homogênea: {RH}", styles['Normal']), |
| | Paragraph(f"Coordenada X (TM-POA): {X}", styles['Normal']), |
| | Paragraph(f"Coordenada Y (TM-POA): {Y}", styles['Normal']), |
| | Paragraph(f"Área Total (Conforme Cadastro Imobiliário): {ATOTAL}", styles['Normal']), |
| | Paragraph(f"Ano 2019 - Exercício Fiscal 2020: {'Sim' if ANO_2019 else 'Não'}", styles['Normal']), |
| | Paragraph(f"Ano 2020 - Exercício Fiscal 2021: {'Sim' if ANO_2020 else 'Não'}", styles['Normal']), |
| | Paragraph(f"Ano 2021 - Exercício Fiscal 2022: {'Sim' if ANO_2021 else 'Não'}", styles['Normal']), |
| | Paragraph(f"Ano 2022 - Exercício Fiscal 2023: {'Sim' if ANO_2022 else 'Não'}", styles['Normal']), |
| | Paragraph(f"Ano 2023 - Exercício Fiscal 2024: {'Sim' if ANO_2023 else 'Não'}", styles['Normal']), |
| | Spacer(1, 36), |
| | Paragraph('Resultado', styles['Heading1']), |
| | Paragraph('Valor do imóvel (R$)', styles['Heading2']), |
| | Paragraph(f"R$ {round(pred[0][0] * ATOTAL, -2)}", styles['Normal']), |
| | ] |
| | |
| | doc.build(story) |
| | |
| |
|
| |
|
| | def execute(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023): |
| | df = pd.DataFrame.from_dict({'ANO_CONST': [ANO_CONST], |
| | 'RH': [RH], |
| | 'X': [X], |
| | 'Y': [Y], |
| | 'ATOTAL': np.log(ATOTAL), |
| | 'ANO_2019': 1 if ANO_2019 else 0, |
| | 'ANO_2020': 1 if ANO_2020 else 0, |
| | 'ANO_2021': 1 if ANO_2021 else 0, |
| | 'ANO_2022': 1 if ANO_2022 else 0, |
| | 'ANO_2023': 1 if ANO_2023 else 0, |
| | }) |
| |
|
| | print(df) |
| | print(ATOTAL) |
| |
|
| | input_scaler = joblib.load("dados/boxes/input_scaler_boxes_2023_VU_v3.save") |
| | df = input_scaler.transform(df) |
| | cols = ['ANO_CONST', 'RH', 'X', 'Y', 'ATOTAL', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023'] |
| | aval = pd.DataFrame(df, columns = cols) |
| | df = xgb.DMatrix(aval) |
| | loaded_model = xgb.Booster() |
| | loaded_model.load_model("dados/boxes/boxes_2020_2021_2022_2023_2024_VU_v3.model") |
| | pred = loaded_model.predict(df) |
| | output_scaler = joblib.load("dados/boxes/output_scaler_boxes_2023_VU_v3.save") |
| | pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1)) |
| | pred = np.exp(pred) |
| |
|
| | get_report(ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, pred) |
| | |
| | return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf' |
| |
|
| | def load_inputs(): |
| | ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)') |
| | RH = gr.Number(value=120, label='Região Homogênea') |
| | X = gr.Number(label='Coordenada X (TM-POA)', value=281554.) |
| | Y = gr.Number(label='Coordenada Y (TM-POA)', value=1675418.) |
| | ATOTAL = gr.Number(label='Área Total (Conforme Cadastro Imobiliário)', value=12.) |
| | ANO_2019 = gr.Checkbox(label='Ano 2019 - Carga Geral 2020', value=False) |
| | ANO_2020 = gr.Checkbox(label='Ano 2020 - Carga Geral 2021', value=False) |
| | ANO_2021 = gr.Checkbox(label='Ano 2021 - Carga Geral 2022', value=False) |
| | ANO_2022 = gr.Checkbox(label='Ano 2022 - Carga Geral 2023', value=False) |
| | ANO_2023 = gr.Checkbox(label='Ano 2023 - Carga Geral 2024', value=True) |
| | return [ANO_CONST, RH, X, Y, ATOTAL, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023] |
| |
|
| | title = 'Boxes - XGBoost Regressor - 2024' |
| |
|
| |
|
| | description = f""" |
| | # <p style="text-align: center;">Modelo para Boxes de Estacionamento - XGBoost Regressor - 2024</p> |
| | <p style="text-align: center;">7.479 dados efetivamente utilizados, referentes aos anos 2019 a 2023.</p> |
| | <hr style="color: #333; background-color: #333; height: 1px; border: none;"> |
| | """ |
| |
|