Persano commited on
Commit
c5a9b0c
·
verified ·
1 Parent(s): 22fe4df

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -85
app.py CHANGED
@@ -1,94 +1,121 @@
1
- from flask import Flask, request, jsonify
 
 
 
2
  import matplotlib.pyplot as plt
3
  import io
4
  import base64
 
5
 
6
  app = Flask(__name__)
7
 
8
- @app.route('/')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  def index():
10
- return "Backend para o simulador está rodando."
11
-
12
- @app.route('/simular', methods=['POST'])
13
- def simular():
14
- try:
15
- # Recebe os dados do formulário
16
- capital = float(request.form.get('capital', 0))
17
- studio_ret = float(request.form.get('studio_ret', 0)) / 100
18
- valorizacao = float(request.form.get('valorizacao', 0)) / 100
19
- franquia_ret = float(request.form.get('franquia_ret', 0))
20
- acoes_ret = float(request.form.get('acoes_ret', 0)) / 100
21
- renda_fixa = float(request.form.get('renda_fixa', 0)) / 100
22
- inflacao = float(request.form.get('inflacao', 0)) / 100
23
-
24
- anos = 10
25
-
26
- # Simulação simples: calcular valor acumulado após 10 anos para cada investimento
27
-
28
- # Studio: retorno mensal aplicado com juros compostos
29
- studio_acumulado = capital * ((1 + studio_ret) ** (12 * anos))
30
-
31
- # Imóvel: valorização anual composta + franquia lucro fixo anual
32
- valor_imovel = capital * ((1 + valorizacao) ** anos)
33
- lucro_franquia_total = franquia_ret * anos
34
- imovel_acumulado = valor_imovel + lucro_franquia_total
35
-
36
- # Ações: retorno anual composto
37
- acoes_acumulado = capital * ((1 + acoes_ret) ** anos)
38
-
39
- # Renda fixa: retorno anual composto
40
- renda_fixa_acumulado = capital * ((1 + renda_fixa) ** anos)
41
-
42
- # Inflação acumulada
43
- inflacao_acumulada = (1 + inflacao) ** anos
44
-
45
- # Ajustando valores pela inflação (poder de compra atual)
46
- studio_real = studio_acumulado / inflacao_acumulada
47
- imovel_real = imovel_acumulado / inflacao_acumulada
48
- acoes_real = acoes_acumulado / inflacao_acumulada
49
- renda_fixa_real = renda_fixa_acumulado / inflacao_acumulada
50
-
51
- # Texto explicativo
52
- texto = f"""
53
- Simulação para {anos} anos com capital inicial de R$ {capital:,.2f}:
54
-
55
- - Studio (retorno mensal de {studio_ret*100:.2f}%): R$ {studio_real:,.2f} (valor corrigido pela inflação)
56
- - Imóvel (valorização anual de {valorizacao*100:.2f}% + lucro franquia anual R$ {franquia_ret:,.2f}): R$ {imovel_real:,.2f}
57
- - Ações (retorno anual de {acoes_ret*100:.2f}%): R$ {acoes_real:,.2f}
58
- - Renda Fixa (retorno anual de {renda_fixa*100:.2f}%): R$ {renda_fixa_real:,.2f}
59
-
60
- Nota: Todos os valores estão ajustados pela inflação média anual de {inflacao*100:.2f}%.
61
- """
62
-
63
- # Gerar gráfico comparativo
64
- labels = ['Studio', 'Imóvel', 'Ações', 'Renda Fixa']
65
- valores = [studio_real, imovel_real, acoes_real, renda_fixa_real]
66
-
67
- fig, ax = plt.subplots(figsize=(8,5))
68
- bars = ax.bar(labels, valores, color=['#00c9a7', '#007cf0', '#ffa500', '#dd1144'])
69
- ax.set_title(f'Valor acumulado corrigido pela inflação em {anos} anos', fontsize=14, pad=15)
70
- ax.set_ylabel('Valor (R$)')
71
- ax.grid(axis='y', linestyle='--', alpha=0.6)
72
-
73
- # Mostrar valores em cima das barras
74
- for bar in bars:
75
- yval = bar.get_height()
76
- ax.text(bar.get_x() + bar.get_width()/2, yval + max(valores)*0.02, f'R$ {yval:,.0f}', ha='center', fontsize=11)
77
-
78
- # Salvar gráfico em PNG na memória
79
- buf = io.BytesIO()
80
- plt.tight_layout()
81
- plt.savefig(buf, format='png')
82
- plt.close(fig)
83
- buf.seek(0)
84
- img_base64 = base64.b64encode(buf.read()).decode('utf-8')
85
-
86
- return jsonify({'texto': texto.strip(), 'graficoBase64': img_base64})
87
-
88
- except Exception as e:
89
- return jsonify({'error': str(e)}), 400
90
-
91
- if __name__ == "__main__":
92
- app.run(debug=True)
93
 
94
 
 
1
+ import os
2
+ os.environ['MPLCONFIGDIR'] = '/tmp/matplotlib-config'
3
+
4
+ from flask import Flask, render_template, request
5
  import matplotlib.pyplot as plt
6
  import io
7
  import base64
8
+ import pandas as pd
9
 
10
  app = Flask(__name__)
11
 
12
+ def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao):
13
+ # Simulação de 10 anos
14
+ anos = list(range(11))
15
+ studio_valor = []
16
+ franquia_valor = []
17
+ acoes_valor = []
18
+ renda_fixa_valor = []
19
+
20
+ cap_studio = capital
21
+ cap_franquia = capital
22
+ cap_acoes = capital
23
+ cap_rf = capital
24
+
25
+ for ano in anos:
26
+ # Studio (rendimento mensal *12 + valorização anual)
27
+ rent_studio = cap_studio * (studio_ret/100) * 12
28
+ val_studio = cap_studio * (valorizacao/100)
29
+ cap_studio += rent_studio + val_studio
30
+
31
+ # Franquia (lucro fixo anual)
32
+ cap_franquia += franquia_ret
33
+
34
+ # Ações (rendimento anual percentual)
35
+ cap_acoes += cap_acoes * (acoes_ret/100)
36
+
37
+ # Renda fixa (rendimento anual percentual)
38
+ cap_rf += cap_rf * (renda_fixa/100)
39
+
40
+ # Ajuste pela inflação
41
+ cap_studio /= (1 + inflacao/100)
42
+ cap_franquia /= (1 + inflacao/100)
43
+ cap_acoes /= (1 + inflacao/100)
44
+ cap_rf /= (1 + inflacao/100)
45
+
46
+ # Armazena valores ajustados
47
+ studio_valor.append(cap_studio)
48
+ franquia_valor.append(cap_franquia)
49
+ acoes_valor.append(cap_acoes)
50
+ renda_fixa_valor.append(cap_rf)
51
+
52
+ # Monta DataFrame para excel e gráfico
53
+ df = pd.DataFrame({
54
+ 'Ano': anos,
55
+ 'Studio (R$)': [round(v,2) for v in studio_valor],
56
+ 'Franquia (R$)': [round(v,2) for v in franquia_valor],
57
+ 'Ações (R$)': [round(v,2) for v in acoes_valor],
58
+ 'Renda Fixa (R$)': [round(v,2) for v in renda_fixa_valor],
59
+ })
60
+
61
+ return df
62
+
63
+ def criar_grafico(df):
64
+ plt.style.use('seaborn-darkgrid')
65
+ fig, ax = plt.subplots(figsize=(10,6))
66
+ ax.plot(df['Ano'], df['Studio (R$)'], label='Studio')
67
+ ax.plot(df['Ano'], df['Franquia (R$)'], label='Franquia')
68
+ ax.plot(df['Ano'], df['Ações (R$)'], label='Ações')
69
+ ax.plot(df['Ano'], df['Renda Fixa (R$)'], label='Renda Fixa')
70
+ ax.set_title('Simulação de Investimentos - Valor Ajustado pela Inflação')
71
+ ax.set_xlabel('Ano')
72
+ ax.set_ylabel('Valor acumulado (R$)')
73
+ ax.legend()
74
+ plt.tight_layout()
75
+
76
+ buf = io.BytesIO()
77
+ plt.savefig(buf, format='png')
78
+ plt.close(fig)
79
+ buf.seek(0)
80
+ img_png = base64.b64encode(buf.getvalue()).decode('utf-8')
81
+ return img_png
82
+
83
+ @app.route('/', methods=['GET', 'POST'])
84
  def index():
85
+ grafico = None
86
+ df = None
87
+ if request.method == 'POST':
88
+ capital = float(request.form['capital'])
89
+ studio_ret = float(request.form['studio_ret'])
90
+ valorizacao = float(request.form['valorizacao'])
91
+ franquia_ret = float(request.form['franquia_ret'])
92
+ acoes_ret = float(request.form['acoes_ret'])
93
+ renda_fixa = float(request.form['renda_fixa'])
94
+ inflacao = float(request.form['inflacao'])
95
+
96
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
97
+ grafico = criar_grafico(df)
98
+
99
+ return render_template('index.html', grafico=grafico, capital=request.form.get('capital', ''),
100
+ studio_ret=request.form.get('studio_ret', ''),
101
+ valorizacao=request.form.get('valorizacao', ''),
102
+ franquia_ret=request.form.get('franquia_ret', ''),
103
+ acoes_ret=request.form.get('acoes_ret', ''),
104
+ renda_fixa=request.form.get('renda_fixa', ''),
105
+ inflacao=request.form.get('inflacao', ''))
106
+
107
+ @app.route('/download_excel', methods=['POST'])
108
+ def download_excel():
109
+ from flask import send_file
110
+ capital = float(request.form['capital'])
111
+ studio_ret = float(request.form['studio_ret'])
112
+ valorizacao = float(request.form['valorizacao'])
113
+ franquia_ret = float(request.form['franquia_ret'])
114
+ acoes_ret = float(request.form['acoes_ret'])
115
+ renda_fixa = float(request.form['renda_fixa'])
116
+ inflacao = float(request.form['inflacao'])
117
+
118
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret,
119
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121