Persano commited on
Commit
200b8a3
·
verified ·
1 Parent(s): ab1393d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -14
app.py CHANGED
@@ -13,10 +13,19 @@ from datetime import datetime
13
 
14
  app = Flask(__name__)
15
 
 
 
 
 
 
 
 
 
 
 
16
  @app.route("/", methods=["GET", "POST"])
17
  def index():
18
  if request.method == "POST":
19
- # Entrada de dados do formulário
20
  capital = float(request.form["capital"])
21
  studio_ret = float(request.form["studio_ret"])
22
  valorizacao = float(request.form["valorizacao"])
@@ -27,37 +36,38 @@ def index():
27
 
28
  anos = list(range(1, 6))
29
 
30
- # Cálculo dos investimentos
31
  studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
32
  franquia = [capital + (franquia_ret * ano) for ano in anos]
33
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
34
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
 
35
 
36
  dados = {
37
  "Ano": anos,
38
  "Studio": studio,
39
  "Franquia": franquia,
40
  "Ações": acoes,
41
- "Renda Fixa": renda_fixa_valores
 
42
  }
43
  df = pd.DataFrame(dados)
44
 
45
- # Melhor investimento
46
  investimentos_finais = {
47
  "Studio": studio[-1],
48
  "Franquia": franquia[-1],
49
  "Ações": acoes[-1],
50
  "Renda Fixa": renda_fixa_valores[-1],
51
  }
 
52
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
53
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
54
 
55
- # Gráfico base64
56
  plt.figure(figsize=(8, 5))
57
  plt.plot(anos, studio, label="Studio", marker="o")
58
  plt.plot(anos, franquia, label="Franquia", marker="o")
59
  plt.plot(anos, acoes, label="Ações", marker="o")
60
  plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
 
61
  plt.title("Projeção de Investimentos")
62
  plt.xlabel("Ano")
63
  plt.ylabel("Valor (R$)")
@@ -77,13 +87,36 @@ def index():
77
  buf.close()
78
  plt.close()
79
 
80
- # Tabela com formatação
81
  df_formatado = df.copy()
82
- for col in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
83
  df_formatado[col] = df_formatado[col].apply(lambda x: f"R$ {x:,.2f}".replace(",", "."))
84
 
85
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  return render_template(
88
  "index.html",
89
  capital=capital,
@@ -97,11 +130,15 @@ def index():
97
  tabela=tabela,
98
  grafico=grafico_base64,
99
  investimento_mais_valorizado=investimento_mais_valorizado,
100
- valor_mais_alto=valor_mais_alto
 
 
 
101
  )
102
 
103
  return render_template("index.html")
104
 
 
105
  @app.route("/download_pdf", methods=["POST"])
106
  def download_pdf():
107
  capital_inicial = float(request.form["capital"])
@@ -118,13 +155,15 @@ def download_pdf():
118
  valores_franquia = [capital_inicial + (lucro_anual_franquia * ano) for ano in anos]
119
  valores_acoes = [capital_inicial * ((1 + retorno_anual_acoes / 100) ** ano) for ano in anos]
120
  valores_renda_fixa = [capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano) for ano in anos]
 
121
 
122
  df = pd.DataFrame({
123
  "Ano": anos,
124
  "Studio": valores_studio,
125
  "Franquia": valores_franquia,
126
  "Ações": valores_acoes,
127
- "Renda Fixa": valores_renda_fixa
 
128
  })
129
 
130
  investimentos_finais = {
@@ -133,14 +172,16 @@ def download_pdf():
133
  "Ações": valores_acoes[-1],
134
  "Renda Fixa": valores_renda_fixa[-1],
135
  }
 
136
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
137
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
138
 
139
  plt.figure(figsize=(8, 5))
140
- plt.plot(anos, valores_studio, label="Studio")
141
- plt.plot(anos, valores_franquia, label="Franquia")
142
- plt.plot(anos, valores_acoes, label="Ações")
143
- plt.plot(anos, valores_renda_fixa, label="Renda Fixa")
 
144
  plt.title("Comparação dos Investimentos")
145
  plt.xlabel("Ano")
146
  plt.ylabel("Valor (R$)")
@@ -155,11 +196,34 @@ def download_pdf():
155
  plt.close()
156
 
157
  df_formatado = df.copy()
158
- for col in ["Studio", "Franquia", "Ações", "Renda Fixa"]:
159
  df_formatado[col] = df_formatado[col].apply(lambda x: f"R$ {x:,.2f}".replace(",", "."))
160
 
161
  tabela = df_formatado.to_html(index=False, classes="table table-sm table-bordered", border=1)
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  html = render_template(
164
  "relatorio_pdf.html",
165
  capital=capital_inicial,
@@ -174,6 +238,9 @@ def download_pdf():
174
  grafico=grafico_base64,
175
  investimento_mais_valorizado=investimento_mais_valorizado,
176
  valor_mais_alto=valor_mais_alto,
 
 
 
177
  now=datetime.now()
178
  )
179
 
@@ -185,5 +252,7 @@ def download_pdf():
185
  pdf.seek(0)
186
  return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
187
 
 
188
  if __name__ == '__main__':
189
  app.run(host='0.0.0.0', port=7860, debug=True)
 
 
13
 
14
  app = Flask(__name__)
15
 
16
+ def gerar_analise(investimentos_finais, capital):
17
+ melhor = max(investimentos_finais, key=investimentos_finais.get)
18
+ valor_melhor = investimentos_finais[melhor]
19
+ retorno_pct = ((valor_melhor - capital) / capital) * 100
20
+ analise = f"""
21
+ Após análise dos cenários projetados para 5 anos, o investimento <strong>{melhor}</strong> apresenta o melhor desempenho,
22
+ com um valor final estimado de <strong>R$ {valor_melhor:,.2f}</strong>, equivalente a um retorno de <strong>{retorno_pct:.1f}%</strong>.
23
+ """
24
+ return analise.replace(",", ".")
25
+
26
  @app.route("/", methods=["GET", "POST"])
27
  def index():
28
  if request.method == "POST":
 
29
  capital = float(request.form["capital"])
30
  studio_ret = float(request.form["studio_ret"])
31
  valorizacao = float(request.form["valorizacao"])
 
36
 
37
  anos = list(range(1, 6))
38
 
 
39
  studio = [capital * ((1 + studio_ret / 100) ** (12 * ano)) for ano in anos]
40
  franquia = [capital + (franquia_ret * ano) for ano in anos]
41
  acoes = [capital * ((1 + acoes_ret / 100) ** ano) for ano in anos]
42
  renda_fixa_valores = [capital * ((1 + renda_fixa / 100) ** ano) for ano in anos]
43
+ ajustado_inflacao = [valor / ((1 + inflacao / 100) ** ano) for valor, ano in zip(studio, anos)]
44
 
45
  dados = {
46
  "Ano": anos,
47
  "Studio": studio,
48
  "Franquia": franquia,
49
  "Ações": acoes,
50
+ "Renda Fixa": renda_fixa_valores,
51
+ "Studio c/ Inflação": ajustado_inflacao,
52
  }
53
  df = pd.DataFrame(dados)
54
 
 
55
  investimentos_finais = {
56
  "Studio": studio[-1],
57
  "Franquia": franquia[-1],
58
  "Ações": acoes[-1],
59
  "Renda Fixa": renda_fixa_valores[-1],
60
  }
61
+
62
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
63
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
64
 
 
65
  plt.figure(figsize=(8, 5))
66
  plt.plot(anos, studio, label="Studio", marker="o")
67
  plt.plot(anos, franquia, label="Franquia", marker="o")
68
  plt.plot(anos, acoes, label="Ações", marker="o")
69
  plt.plot(anos, renda_fixa_valores, label="Renda Fixa", marker="o")
70
+ plt.plot(anos, ajustado_inflacao, label="Studio c/ Inflação", linestyle="--", marker="o")
71
  plt.title("Projeção de Investimentos")
72
  plt.xlabel("Ano")
73
  plt.ylabel("Valor (R$)")
 
87
  buf.close()
88
  plt.close()
89
 
 
90
  df_formatado = df.copy()
91
+ for col in ["Studio", "Franquia", "Ações", "Renda Fixa", "Studio c/ Inflação"]:
92
  df_formatado[col] = df_formatado[col].apply(lambda x: f"R$ {x:,.2f}".replace(",", "."))
93
 
94
  tabela = df_formatado.to_html(index=False, classes="table table-striped table-sm", border=0)
95
 
96
+ analise_final = gerar_analise(investimentos_finais, capital)
97
+
98
+ # Tabela resumo
99
+ resumo = []
100
+ for nome, valor_final in investimentos_finais.items():
101
+ retorno_abs = valor_final - capital
102
+ retorno_pct = (retorno_abs / capital) * 100
103
+ resumo.append({
104
+ "Investimento": nome,
105
+ "Valor Final": f"R$ {valor_final:,.2f}".replace(",", "."),
106
+ "Retorno Absoluto": f"R$ {retorno_abs:,.2f}".replace(",", "."),
107
+ "Retorno (%)": f"{retorno_pct:.1f}%"
108
+ })
109
+ resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "")), reverse=True)
110
+
111
+ diferenca_pct = float(resumo[0]["Retorno (%)"].replace("%", "")) - float(resumo[1]["Retorno (%)"].replace("%", ""))
112
+ comentario_extra = ""
113
+ if diferenca_pct < 5:
114
+ comentario_extra = f"""
115
+ Apesar do <strong>{resumo[0]['Investimento']}</strong> ter se destacado, a diferença em relação ao segundo colocado
116
+ (<strong>{resumo[1]['Investimento']}</strong>) foi de apenas {diferenca_pct:.1f} pontos percentuais.
117
+ Isso indica que ambas as estratégias podem ser consideradas, dependendo do perfil de risco e objetivos do investidor.
118
+ """.replace(",", ".")
119
+
120
  return render_template(
121
  "index.html",
122
  capital=capital,
 
130
  tabela=tabela,
131
  grafico=grafico_base64,
132
  investimento_mais_valorizado=investimento_mais_valorizado,
133
+ valor_mais_alto=valor_mais_alto,
134
+ analise_final=analise_final,
135
+ comentario_extra=comentario_extra,
136
+ resumo=resumo
137
  )
138
 
139
  return render_template("index.html")
140
 
141
+
142
  @app.route("/download_pdf", methods=["POST"])
143
  def download_pdf():
144
  capital_inicial = float(request.form["capital"])
 
155
  valores_franquia = [capital_inicial + (lucro_anual_franquia * ano) for ano in anos]
156
  valores_acoes = [capital_inicial * ((1 + retorno_anual_acoes / 100) ** ano) for ano in anos]
157
  valores_renda_fixa = [capital_inicial * ((1 + retorno_anual_renda_fixa / 100) ** ano) for ano in anos]
158
+ valores_studio_ajustado_inflacao = [v / ((1 + inflacao_anual / 100) ** ano) for v, ano in zip(valores_studio, anos)]
159
 
160
  df = pd.DataFrame({
161
  "Ano": anos,
162
  "Studio": valores_studio,
163
  "Franquia": valores_franquia,
164
  "Ações": valores_acoes,
165
+ "Renda Fixa": valores_renda_fixa,
166
+ "Studio c/ Inflação": valores_studio_ajustado_inflacao,
167
  })
168
 
169
  investimentos_finais = {
 
172
  "Ações": valores_acoes[-1],
173
  "Renda Fixa": valores_renda_fixa[-1],
174
  }
175
+
176
  investimento_mais_valorizado = max(investimentos_finais, key=investimentos_finais.get)
177
  valor_mais_alto = investimentos_finais[investimento_mais_valorizado]
178
 
179
  plt.figure(figsize=(8, 5))
180
+ plt.plot(anos, valores_studio, label="Studio", marker="o")
181
+ plt.plot(anos, valores_franquia, label="Franquia", marker="o")
182
+ plt.plot(anos, valores_acoes, label="Ações", marker="o")
183
+ plt.plot(anos, valores_renda_fixa, label="Renda Fixa", marker="o")
184
+ plt.plot(anos, valores_studio_ajustado_inflacao, label="Studio c/ Inflação", linestyle='--', marker="o")
185
  plt.title("Comparação dos Investimentos")
186
  plt.xlabel("Ano")
187
  plt.ylabel("Valor (R$)")
 
196
  plt.close()
197
 
198
  df_formatado = df.copy()
199
+ for col in ["Studio", "Franquia", "Ações", "Renda Fixa", "Studio c/ Inflação"]:
200
  df_formatado[col] = df_formatado[col].apply(lambda x: f"R$ {x:,.2f}".replace(",", "."))
201
 
202
  tabela = df_formatado.to_html(index=False, classes="table table-sm table-bordered", border=1)
203
 
204
+ analise_final = gerar_analise(investimentos_finais, capital_inicial)
205
+
206
+ resumo = []
207
+ for nome, valor_final in investimentos_finais.items():
208
+ retorno_abs = valor_final - capital_inicial
209
+ retorno_pct = (retorno_abs / capital_inicial) * 100
210
+ resumo.append({
211
+ "Investimento": nome,
212
+ "Valor Final": f"R$ {valor_final:,.2f}".replace(",", "."),
213
+ "Retorno Absoluto": f"R$ {retorno_abs:,.2f}".replace(",", "."),
214
+ "Retorno (%)": f"{retorno_pct:.1f}%"
215
+ })
216
+ resumo = sorted(resumo, key=lambda x: float(x["Retorno (%)"].replace("%", "")), reverse=True)
217
+
218
+ diferenca_pct = float(resumo[0]["Retorno (%)"].replace("%", "")) - float(resumo[1]["Retorno (%)"].replace("%", ""))
219
+ comentario_extra = ""
220
+ if diferenca_pct < 5:
221
+ comentario_extra = f"""
222
+ Apesar do <strong>{resumo[0]['Investimento']}</strong> ter se destacado, a diferença em relação ao segundo colocado
223
+ (<strong>{resumo[1]['Investimento']}</strong>) foi de apenas {diferenca_pct:.1f} pontos percentuais.
224
+ Isso indica que ambas as estratégias podem ser consideradas, dependendo do perfil de risco e objetivos do investidor.
225
+ """.replace(",", ".")
226
+
227
  html = render_template(
228
  "relatorio_pdf.html",
229
  capital=capital_inicial,
 
238
  grafico=grafico_base64,
239
  investimento_mais_valorizado=investimento_mais_valorizado,
240
  valor_mais_alto=valor_mais_alto,
241
+ analise_final=analise_final,
242
+ comentario_extra=comentario_extra,
243
+ resumo=resumo,
244
  now=datetime.now()
245
  )
246
 
 
252
  pdf.seek(0)
253
  return send_file(pdf, mimetype="application/pdf", as_attachment=True, download_name="relatorio_simulacao.pdf")
254
 
255
+
256
  if __name__ == '__main__':
257
  app.run(host='0.0.0.0', port=7860, debug=True)
258
+