Persano commited on
Commit
6b3a3d4
·
verified ·
1 Parent(s): 01afe76

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -177
app.py CHANGED
@@ -1,52 +1,45 @@
1
  import os
2
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
3
  os.makedirs('/tmp/fontconfig', exist_ok=True)
 
4
  import os
5
- from flask import Flask, render_template, request, send_file
6
- import matplotlib.pyplot as plt
7
- import pandas as pd
8
  import io
9
  import base64
 
 
 
10
  from matplotlib.ticker import FuncFormatter
11
- from xhtml2pdf import pisa
12
- from datetime import datetime
13
-
14
  import openai
15
 
16
- # Use sua chave da OpenAI
17
- openai.api_key = os.getenv("OPENAI_API_KEY") # ou coloque diretamente: openai.api_key = "sua-chave"
18
-
19
-
20
  app = Flask(__name__)
 
21
 
22
  def formatar_brl(valor):
23
  return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
24
 
25
- import openai
26
-
27
  def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
28
- base_texto = gerar_analise(investimentos_finais, capital, patrimonio_studio_final)
29
  prompt = f"""
30
- Você é um analista financeiro experiente. A seguir está uma análise básica dos resultados de investimentos simulados:
31
 
32
- {base_texto}
 
 
 
 
 
33
 
34
- Reescreva essa análise de forma mais detalhada, clara e profissional, adequada para ser entregue a um cliente leigo em finanças.
35
- Utilize linguagem acessível, exemplos simples e um tom consultivo e amigável.
36
  """
37
- try:
38
- resposta = openai.ChatCompletion.create(
39
- model="gpt-4o",
40
- messages=[
41
- {"role": "system", "content": "Você é um analista financeiro experiente."},
42
- {"role": "user", "content": prompt}
43
- ],
44
- temperature=0.7
45
- )
46
- return resposta.choices[0].message.content
47
- except Exception as e:
48
- # fallback caso ocorra erro na API da OpenAI
49
- return base_texto + f"\n\n(Erro ao gerar análise detalhada com IA: {e})"
50
 
51
  @app.route("/", methods=["GET", "POST"])
52
  def index():
@@ -69,15 +62,6 @@ def index():
69
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
70
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
71
 
72
- dados = {
73
- "Ano": anos,
74
- "Studio (Patrimônio + Renda)": studio_total,
75
- "Franquia": franquia,
76
- "Ações": acoes,
77
- "Renda Fixa": renda_fixa_valores
78
- }
79
- df = pd.DataFrame(dados)
80
-
81
  investimentos_finais = {
82
  "Studio": studio_total[-1],
83
  "Franquia": franquia[-1],
@@ -105,13 +89,20 @@ def index():
105
  buf.close()
106
  plt.close()
107
 
 
 
 
 
 
 
 
 
108
  df_formatado = df.copy()
109
  for col in df.columns:
110
  if col != "Ano":
111
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
112
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
113
 
114
- # Aqui a chamada para a análise com GPT
115
  analise_final = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
116
 
117
  return render_template(
@@ -124,143 +115,7 @@ def index():
124
 
125
  return render_template("index.html")
126
 
127
- @app.route("/download_pdf", methods=["POST"])
128
- def download_pdf():
129
- capital = float(request.form["capital"])
130
- studio_ret = float(request.form["studio_ret"])
131
- valorizacao = float(request.form["valorizacao"])
132
- franquia_ret = float(request.form["franquia_ret"])
133
- acoes_ret = float(request.form["acoes_ret"])
134
- renda_fixa = float(request.form["renda_fixa"])
135
- inflacao = float(request.form["inflacao"])
136
-
137
- anos = list(range(1, 6))
138
-
139
- patrimonio_studio = [capital * ((1 + valorizacao / 100) ** ano) for ano in anos]
140
- renda_acumulada_studio = [capital * (((1 + studio_ret / 100) ** (12 * ano)) - 1) for ano in anos]
141
- studio_total = [p + r for p, r in zip(patrimonio_studio, renda_acumulada_studio)]
142
- franquia = [capital + (franquia_ret * ano) for ano in anos]
143
- acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
144
- renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
145
-
146
- dados = {
147
- "Ano": anos,
148
- "Studio (Patrimônio + Renda)": studio_total,
149
- "Franquia": franquia,
150
- "Ações": acoes,
151
- "Renda Fixa": renda_fixa_valores
152
- }
153
- df = pd.DataFrame(dados)
154
-
155
- investimentos_finais = {
156
- "Studio": studio_total[-1],
157
- "Franquia": franquia[-1],
158
- "Ações": acoes[-1],
159
- "Renda Fixa": renda_fixa_valores[-1],
160
- }
161
- investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
162
- valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
163
-
164
- # Gráfico PNG para PDF
165
- plt.figure(figsize=(8, 5))
166
- plt.plot(anos, studio_total, label="Studio (Patrimônio + Renda)", marker="o")
167
- plt.plot(anos, franquia, label="Franquia", marker="o")
168
- plt.plot(anos, acoes, label="Ações", marker="o")
169
- plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
170
- plt.title("Projeção de Investimentos (5 anos)")
171
- plt.xlabel("Ano")
172
- plt.ylabel("Valor (R$)")
173
- plt.legend()
174
- plt.grid(True)
175
- plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x, _: f"R${x:,.0f}".replace(",", ".")))
176
- plt.tight_layout()
177
-
178
- img_buf = io.BytesIO()
179
- plt.savefig(img_buf, format='png')
180
- img_buf.seek(0)
181
- img_base64 = base64.b64encode(img_buf.getvalue()).decode("utf-8")
182
- img_buf.close()
183
- plt.close()
184
-
185
- df_formatado = df.copy()
186
- for col in df.columns:
187
- if col != "Ano":
188
- df_formatado[col] = df_formatado[col].apply(formatar_brl)
189
- tabela_html = df_formatado.to_html(index=False, border=1, classes="table-pdf")
190
-
191
- analise = gerar_analise(investimentos_finais, capital, patrimonio_studio[-1])
192
-
193
- # Tabela de entrada de dados (para relatório)
194
- tabela_entrada = f"""
195
- <table border="1" class="table-pdf" style="border-collapse: collapse; width: 100%;">
196
- <thead>
197
- <tr style="background-color: #f0f0f0;">
198
- <th>Parâmetro</th>
199
- <th>Valor</th>
200
- </tr>
201
- </thead>
202
- <tbody>
203
- <tr><td>Capital Inicial</td><td>{formatar_brl(capital)}</td></tr>
204
- <tr><td>Retorno Mensal Studio (%)</td><td>{studio_ret:.2f}%</td></tr>
205
- <tr><td>Valorização Anual Studio (%)</td><td>{valorizacao:.2f}%</td></tr>
206
- <tr><td>Retorno Anual Franquia (R$)</td><td>{formatar_brl(franquia_ret)}</td></tr>
207
- <tr><td>Retorno Anual Ações (%)</td><td>{acoes_ret:.2f}%</td></tr>
208
- <tr><td>Retorno Anual Renda Fixa (%)</td><td>{renda_fixa:.2f}%</td></tr>
209
- <tr><td>Inflação Anual (%)</td><td>{inflacao:.2f}%</td></tr>
210
- </tbody>
211
- </table>
212
- """
213
-
214
- html = f"""
215
- <html>
216
- <head>
217
- <meta charset="utf-8">
218
- <style>
219
- body {{ font-family: Arial, sans-serif; font-size: 14px; color: #333; }}
220
- h2 {{ color: #2c3e50; }}
221
- table.table-pdf {{ width: 100%; border-collapse: collapse; margin-top: 15px; }}
222
- table.table-pdf th, table.table-pdf td {{ border: 1px solid #ccc; padding: 6px; text-align: right; }}
223
- table.table-pdf th {{ background-color: #f0f0f0; }}
224
- .destaque {{ background: #e8f5e9; padding: 10px; margin-top: 20px; border-left: 6px solid #2e7d32; font-size: 14px; }}
225
- img {{ margin-top: 20px; max-width: 100%; height: auto; }}
226
- </style>
227
- </head>
228
- <body>
229
- <h2>Relatório de Simulação de Investimentos</h2>
230
- <p>Data da Simulação: {datetime.today().strftime('%d/%m/%Y')}</p>
231
-
232
- <h3>Dados de Entrada</h3>
233
- {tabela_entrada}
234
-
235
- <div class="destaque">{analise}</div>
236
-
237
- <h3>Projeção Gráfica</h3>
238
- <img src="data:image/png;base64,{img_base64}" />
239
-
240
- <h3>Evolução dos Investimentos (Ano a Ano)</h3>
241
- {tabela_html}
242
- </body>
243
- </html>
244
- """
245
-
246
- pdf_buffer = io.BytesIO()
247
- pisa_status = pisa.CreatePDF(io.StringIO(html), dest=pdf_buffer)
248
-
249
- if pisa_status.err:
250
- return "Erro ao gerar PDF", 500
251
-
252
- pdf_buffer.seek(0)
253
- return send_file(
254
- pdf_buffer,
255
- mimetype="application/pdf",
256
- as_attachment=True,
257
- download_name="relatorio_investimentos.pdf"
258
- )
259
-
260
  if __name__ == "__main__":
261
- # Porta 7860 padrão do Hugging Face Spaces
262
- port = int(os.environ.get("PORT", 7860))
263
- app.run(host="0.0.0.0", port=port)
264
-
265
 
266
 
 
1
  import os
2
  os.environ['FONTCONFIG_PATH'] = '/tmp/fontconfig'
3
  os.makedirs('/tmp/fontconfig', exist_ok=True)
4
+
5
  import os
 
 
 
6
  import io
7
  import base64
8
+ import pandas as pd
9
+ import matplotlib.pyplot as plt
10
+ from flask import Flask, render_template, request
11
  from matplotlib.ticker import FuncFormatter
 
 
 
12
  import openai
13
 
 
 
 
 
14
  app = Flask(__name__)
15
+ openai.api_key = os.getenv("OPENAI_API_KEY")
16
 
17
  def formatar_brl(valor):
18
  return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
19
 
 
 
20
  def gerar_analise_ia(investimentos_finais, capital, patrimonio_studio_final):
 
21
  prompt = f"""
22
+ Faça uma análise profissional e detalhada em linguagem clara e acessível sobre os seguintes dados financeiros:
23
 
24
+ - Capital inicial: R$ {capital:,.2f}
25
+ - Valor patrimonial final do Studio: R$ {patrimonio_studio_final:,.2f}
26
+ - Investimentos finais após 5 anos:
27
+ """
28
+ for nome, valor in investimentos_finais.items():
29
+ prompt += f" - {nome}: R$ {valor:,.2f}\n"
30
 
31
+ prompt += """
32
+ 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.
33
  """
34
+
35
+ resposta = openai.ChatCompletion.create(
36
+ model="gpt-4o",
37
+ messages=[
38
+ {"role": "system", "content": "Você é um analista financeiro experiente."},
39
+ {"role": "user", "content": prompt}
40
+ ]
41
+ )
42
+ return resposta.choices[0].message.content
 
 
 
 
43
 
44
  @app.route("/", methods=["GET", "POST"])
45
  def index():
 
62
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
63
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
64
 
 
 
 
 
 
 
 
 
 
65
  investimentos_finais = {
66
  "Studio": studio_total[-1],
67
  "Franquia": franquia[-1],
 
89
  buf.close()
90
  plt.close()
91
 
92
+ df = pd.DataFrame({
93
+ "Ano": anos,
94
+ "Studio (Patrimônio + Renda)": studio_total,
95
+ "Franquia": franquia,
96
+ "Ações": acoes,
97
+ "Renda Fixa": renda_fixa_valores
98
+ })
99
+
100
  df_formatado = df.copy()
101
  for col in df.columns:
102
  if col != "Ano":
103
  df_formatado[col] = df_formatado[col].apply(formatar_brl)
104
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
105
 
 
106
  analise_final = gerar_analise_ia(investimentos_finais, capital, patrimonio_studio[-1])
107
 
108
  return render_template(
 
115
 
116
  return render_template("index.html")
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  if __name__ == "__main__":
119
+ app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
 
 
 
120
 
121