Persano commited on
Commit
233040a
·
verified ·
1 Parent(s): 0df9a4e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -76
app.py CHANGED
@@ -16,40 +16,32 @@ openai.api_key = os.getenv("OPENAI_API_KEY")
16
  def formatar_brl(valor):
17
  return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
18
 
19
- def data_por_extenso(dt):
20
- meses = {
21
- "January": "janeiro",
22
- "February": "fevereiro",
23
- "March": "março",
24
- "April": "abril",
25
- "May": "maio",
26
- "June": "junho",
27
- "July": "julho",
28
- "August": "agosto",
29
- "September": "setembro",
30
- "October": "outubro",
31
- "November": "novembro",
32
- "December": "dezembro"
33
- }
34
- dia = dt.day
35
- mes = meses[dt.strftime("%B")]
36
- ano = dt.year
37
- return f"São Paulo, {dia} de {mes} de {ano}"
38
 
39
  def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
40
  prompt = f"""
41
- Faça uma análise profissional e detalhada em linguagem clara e acessível sobre os seguintes dados financeiros:
42
- - Capital inicial: R$ {capital:,.2f}
43
- - Valor patrimonial final do Studio: R$ {patrimonio_studio_final:,.2f}
44
- - Investimentos finais após 5 anos:
45
- """
46
  for nome, valor in investimentos_finais.items():
47
- prompt += f" - {nome}: R$ {valor:,.2f}\n"
48
 
49
  prompt += """
50
- Destaque qual foi o melhor investimento, o retorno percentual sobre o capital, e comente sobre possíveis estratégias e perfis de risco.
51
- Use uma linguagem formal, com parágrafos claros e destaque para o investimento com maior retorno.
52
- """
53
 
54
  resposta = openai.ChatCompletion.create(
55
  model="gpt-4o",
@@ -100,7 +92,7 @@ def index():
100
  df = pd.DataFrame(dados)
101
 
102
  investimentos_finais = {
103
- "Studio (Patrimônio + Renda)": studio_total[-1],
104
  "Franquia": franquia[-1],
105
  "Ações": acoes[-1],
106
  "Renda Fixa": renda_fixa_valores[-1],
@@ -132,7 +124,7 @@ def index():
132
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
133
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm text-end", border=0)
134
 
135
- analise_final = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
136
 
137
  return render_template(
138
  "index.html",
@@ -159,7 +151,6 @@ def gerar_pdf():
159
  patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
160
  renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
161
  studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
162
-
163
  franquia = [capital + (franquia_ret * ano) for ano in anos]
164
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
165
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
@@ -174,46 +165,44 @@ def gerar_pdf():
174
  df = pd.DataFrame(dados)
175
 
176
  investimentos_finais = {
177
- "Studio (Patrimônio + Renda)": studio_total[-1],
178
  "Franquia": franquia[-1],
179
  "Ações": acoes[-1],
180
  "Renda Fixa": renda_fixa_valores[-1],
181
  }
182
 
183
- # Premissas formatadas
184
- premissas = {
185
- "Capital Inicial": formatar_brl(capital),
186
- "Retorno Mensal Studio (%)": f"{studio_ret:.2f}%",
187
- "Valorização Anual Studio (%)": f"{valorizacao:.2f}%",
188
- "Retorno Anual Franquia (R$)": formatar_brl(franquia_ret),
189
- "Retorno Anual Ações (%)": f"{acoes_ret:.2f}%",
190
- "Retorno Anual Renda Fixa (%)": f"{renda_fixa:.2f}%",
191
- "Inflação Anual (%)": f"{inflacao:.2f}%"
192
- }
193
-
194
- # Destacar melhor investimento na tabela
195
- melhor_investimento = max(investimentos_finais, key=investimentos_finais.get)
 
 
 
 
196
 
197
  df_formatado = df.copy()
198
  for col in df.columns:
199
  if col != "Ano":
200
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
201
- if col == melhor_investimento:
202
- df_formatado[col] = df_formatado[col].apply(lambda v: f'<strong style="color:green">{v}</strong>')
203
-
204
- tabela_html = df_formatado.to_html(index=False, classes="tabela", escape=False, border=0)
205
 
206
  analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
207
 
208
- data_hoje = data_por_extenso(datetime.now())
209
-
210
  context = {
211
  "capital": capital,
212
- "grafico": base64.b64encode(plot_grafico(anos, studio_total, franquia, acoes, renda_fixa_valores)).decode("utf-8"),
213
  "tabela": tabela_html,
214
  "analise_final": analise_final_ia,
215
- "premissas": premissas,
216
- "data_hoje": data_hoje
217
  }
218
 
219
  pdf = render_pdf("relatorio.html", context)
@@ -222,27 +211,6 @@ def gerar_pdf():
222
  else:
223
  return "Erro ao gerar PDF", 500
224
 
225
- def plot_grafico(anos, studio_total, franquia, acoes, renda_fixa_valores):
226
- plt.figure(figsize=(8, 5))
227
- plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
228
- plt.plot(anos, franquia, label="Franquia", marker="o")
229
- plt.plot(anos, acoes, label="Ações", marker="o")
230
- plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
231
- plt.title("Projeção de Investimentos (5 anos)")
232
- plt.xlabel("Ano")
233
- plt.ylabel("Valor (R$)")
234
- plt.legend()
235
- plt.grid(True)
236
- plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
237
- plt.tight_layout()
238
-
239
- buf = io.BytesIO()
240
- plt.savefig(buf, format="png")
241
- buf.seek(0)
242
- img_bytes = buf.getvalue()
243
- buf.close()
244
- plt.close()
245
- return img_bytes
246
-
247
  if __name__ == "__main__":
248
  app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
 
 
16
  def formatar_brl(valor):
17
  return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
18
 
19
+ def gerar_analise(investimentos_finais, capital, patrimonio_studio_final):
20
+ melhor = max(investimentos_finais, key=investimentos_finais.get)
21
+ valor_melhor = investimentos_finais[melhor]
22
+ retorno_pct = ((valor_melhor - capital) / capital) * 100
23
+ texto = f"""
24
+ Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
25
+ com um valor final estimado de <strong>{formatar_brl(valor_melhor)}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong>.
26
+ <br><br>
27
+ O valor patrimonial do Studio, conforme normas contábeis e profissionais de investimento, representa o valor acumulado do imóvel sem considerar a renda gerada,
28
+ ou seja, é o aumento do patrimônio bruto estimado. Neste cenário, o valor patrimonial final do Studio é <strong>{formatar_brl(patrimonio_studio_final)}</strong>.
29
+ """
30
+ return texto
 
 
 
 
 
 
 
31
 
32
  def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
33
  prompt = f"""
34
+ Faça uma análise profissional e detalhada em linguagem clara e acessível sobre os seguintes dados financeiros:
35
+ - Capital inicial: R$ {capital:,.2f}
36
+ - Valor patrimonial final do Studio: R$ {patrimonio_studio_final:,.2f}
37
+ - Investimentos finais após 5 anos:
38
+ """
39
  for nome, valor in investimentos_finais.items():
40
+ prompt += f" - {nome}: R$ {valor:,.2f}\n"
41
 
42
  prompt += """
43
+ Destaque qual foi o melhor investimento, o retorno percentual sobre o capital, e comente sobre possíveis estratégias e perfis de risco. Seja objetivo, claro e com tom consultivo.
44
+ """
 
45
 
46
  resposta = openai.ChatCompletion.create(
47
  model="gpt-4o",
 
92
  df = pd.DataFrame(dados)
93
 
94
  investimentos_finais = {
95
+ "Studio": studio_total[-1],
96
  "Franquia": franquia[-1],
97
  "Ações": acoes[-1],
98
  "Renda Fixa": renda_fixa_valores[-1],
 
124
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
125
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm text-end", border=0)
126
 
127
+ analise_final = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
128
 
129
  return render_template(
130
  "index.html",
 
151
  patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
152
  renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
153
  studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
 
154
  franquia = [capital + (franquia_ret * ano) for ano in anos]
155
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
156
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
 
165
  df = pd.DataFrame(dados)
166
 
167
  investimentos_finais = {
168
+ "Studio": studio_total[-1],
169
  "Franquia": franquia[-1],
170
  "Ações": acoes[-1],
171
  "Renda Fixa": renda_fixa_valores[-1],
172
  }
173
 
174
+ buf = io.BytesIO()
175
+ plt.figure(figsize=(8, 5))
176
+ plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
177
+ plt.plot(anos, franquia, label="Franquia", marker="o")
178
+ plt.plot(anos, acoes, label="Ações", marker="o")
179
+ plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
180
+ plt.title("Projeção de Investimentos (5 anos)")
181
+ plt.xlabel("Ano")
182
+ plt.ylabel("Valor (R$)")
183
+ plt.legend()
184
+ plt.grid(True)
185
+ plt.tight_layout()
186
+ plt.savefig(buf, format="png")
187
+ buf.seek(0)
188
+ grafico_base64 = base64.b64encode(buf.read()).decode("utf-8")
189
+ buf.close()
190
+ plt.close()
191
 
192
  df_formatado = df.copy()
193
  for col in df.columns:
194
  if col != "Ano":
195
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
196
+ tabela_html = df_formatado.to_html(index=False, classes="tabela", border=0)
 
 
 
197
 
198
  analise_final_ia = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
199
 
 
 
200
  context = {
201
  "capital": capital,
202
+ "grafico": grafico_base64,
203
  "tabela": tabela_html,
204
  "analise_final": analise_final_ia,
205
+ "data_hoje": datetime.now().strftime("São Paulo, %d de %B de %Y")
 
206
  }
207
 
208
  pdf = render_pdf("relatorio.html", context)
 
211
  else:
212
  return "Erro ao gerar PDF", 500
213
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  if __name__ == "__main__":
215
  app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
216
+