Spaces:
Running
Running
| 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(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E, pred): | |
| # Define the page size | |
| pagesize = A4 # You can adjust the page size as needed | |
| 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 Salas Comerciais - XGBoost Regressor - 2024', styles['Heading1']), | |
| Paragraph('Parâmetros do cálculo', styles['Heading2']), | |
| Paragraph(f"Fonte (Transação ou Oferta): {FON}", styles['Normal']), | |
| Paragraph(f"Ano de Construção (Conforme Cadastro Imobiliário): {ANO_CONST}", styles['Normal']), | |
| Paragraph(f"Andar (Conforme Cadastro Imobiliário): {ANDAR}", 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"Região Homogênea: {RH}", 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']), | |
| Paragraph(f"Padrão Construtivo C: {'Sim' if C else 'Não'}", styles['Normal']), | |
| Paragraph(f"Padrão Construtivo D: {'Sim' if D else 'Não'}", styles['Normal']), | |
| Paragraph(f"Padrão Construtivo E: {'Sim' if E 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(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E): | |
| df = pd.DataFrame.from_dict({'FON': [FON], | |
| 'ANO_CONST': [ANO_CONST], | |
| 'ANDAR': [ANDAR], | |
| 'X': [X], | |
| 'Y': [Y], | |
| 'ATOTAL': np.log(ATOTAL), | |
| 'RH': np.log(RH), | |
| '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, | |
| 'A': 0, | |
| 'B': 0, | |
| 'C': 1 if C else 0, | |
| 'D': 1 if D else 0, | |
| 'E': 1 if E else 0, | |
| }) | |
| input_scaler = joblib.load("dados/apartamentos/input_scaler_ape_DEZ2023.save") | |
| df = input_scaler.transform(df) | |
| cols = ['FON', 'ANO_CONST', 'ANDAR', 'X', 'Y', 'ATOTAL', 'RH', 'ANO_2019', 'ANO_2020', 'ANO_2021', 'ANO_2022', 'ANO_2023', 'A', 'B', 'C', 'D', 'E'] | |
| aval = pd.DataFrame(df, columns = cols) | |
| df = xgb.DMatrix(aval) | |
| loaded_model = xgb.Booster() | |
| loaded_model.load_model("dados/apartamentos/APARTAMENTO_2020_2021_2022_2023_2024.model") | |
| pred = loaded_model.predict(df) | |
| output_scaler = joblib.load("dados/apartamentos/output_scaler_ape_DEZ2023.save") | |
| pred = output_scaler.inverse_transform(np.array(pred).reshape(-1,1)) | |
| pred = np.exp(pred) | |
| get_report(FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E, pred) | |
| return f"""R${round(pred[0][0] * ATOTAL, -2)}""", 'report.pdf' | |
| def load_inputs(): | |
| FON = gr.Checkbox(label='Fonte (Transação: desmarcar | Oferta: marcar)', value=False) | |
| ANO_CONST = gr.Number(value=2020, label='Ano de Construção (Conforme Cadastro Imobiliário)') | |
| ANDAR = gr.Number(value=4, label='Andar (Conforme Cadastro Imobiliário)') | |
| 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=60.) | |
| RH = gr.Number(value=120, label='Região Homogênea') | |
| 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) | |
| C = gr.Checkbox(label='Padrão Construtivo C', value=True) | |
| D = gr.Checkbox(label='Padrão Construtivo D', value=False) | |
| E = gr.Checkbox(label='Padrão Construtivo E', value=False) | |
| return [FON, ANO_CONST, ANDAR, X, Y, ATOTAL, RH, ANO_2019, ANO_2020, ANO_2021, ANO_2022, ANO_2023, C, D, E] | |
| title = 'Apartamentos - XGBoost Regressor - 2024' | |
| description = f""" | |
| # <p style="text-align: center;">Modelo para Apartamentos - XGBoost Regressor - 2024</p> | |
| <p style="text-align: center;">39.732 dados efetivamente utilizados, referentes aos anos 2019 a 2023.</p> | |
| <hr style="color: #333; background-color: #333; height: 1px; border: none;"> | |
| """ | |