Persano commited on
Commit
b107c50
·
verified ·
1 Parent(s): 0147f30

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -92
app.py CHANGED
@@ -1,95 +1,120 @@
1
  from flask import Flask, render_template, request, send_file
2
- import io
3
- import base64
4
  import matplotlib.pyplot as plt
5
  import pandas as pd
 
 
6
 
7
  app = Flask(__name__)
8
 
9
- def gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao):
10
- # Cria DataFrame com dados simulados para 10 anos
11
- anos = list(range(1, 11))
12
- dados = {
13
- 'Ano': anos,
14
- 'Studio_Rentabilidade_Bruta': [],
15
- 'Studio_Valorizacao': [],
16
- 'Franquia_Lucro_Anual': [],
17
- 'Acoes_Retorno': [],
18
- 'Renda_Fixa_Retorno': [],
19
- }
20
-
21
- capital_studio = capital
22
- capital_acoes = capital
23
- capital_rf = capital
24
-
25
- for ano in anos:
26
- # Studio: rentabilidade mensal bruta acumulada no ano + valorização
27
- rent_mes = studio_ret / 100
28
- rent_anual = ((1 + rent_mes) ** 12 - 1) * capital_studio
29
- val_ano = (valorizacao / 100) * capital_studio
30
- dados['Studio_Rentabilidade_Bruta'].append(rent_anual)
31
- dados['Studio_Valorizacao'].append(val_ano)
32
-
33
- # Franquia: valor fixo anual informado (pode ser ajustado depois)
34
- dados['Franquia_Lucro_Anual'].append(franquia_ret)
35
-
36
- # Ações e RF: acumulam juros compostos
37
- capital_acoes = capital_acoes * (1 + (acoes_ret / 100))
38
- capital_rf = capital_rf * (1 + (renda_fixa / 100))
39
-
40
- dados['Acoes_Retorno'].append(capital_acoes - capital)
41
- dados['Renda_Fixa_Retorno'].append(capital_rf - capital)
42
-
43
- df = pd.DataFrame(dados)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  return df
45
 
46
- def gerar_grafico(df):
47
  plt.figure(figsize=(10,6))
48
- plt.plot(df['Ano'], df['Studio_Rentabilidade_Bruta'], label='Studio - Renda Bruta')
49
- plt.plot(df['Ano'], df['Studio_Valorizacao'], label='Studio - Valorização')
50
- plt.plot(df['Ano'], df['Franquia_Lucro_Anual'], label='Franquia - Lucro Anual')
51
- plt.plot(df['Ano'], df['Acoes_Retorno'], label='Ações - Retorno Acumulado')
52
- plt.plot(df['Ano'], df['Renda_Fixa_Retorno'], label='Renda Fixa - Retorno Acumulado')
53
  plt.xlabel('Ano')
54
- plt.ylabel('Retorno (R$)')
55
- plt.title('Simulação de Retorno de Investimentos')
56
  plt.legend()
57
- plt.grid(True)
58
-
59
  buf = io.BytesIO()
60
- plt.savefig(buf, format='png', bbox_inches='tight')
61
  plt.close()
62
  buf.seek(0)
63
- img_base64 = base64.b64encode(buf.read()).decode('utf-8')
64
  return img_base64
65
 
66
  @app.route('/', methods=['GET', 'POST'])
67
  def index():
 
 
68
  if request.method == 'POST':
69
- capital = float(request.form['capital'])
70
- studio_ret = float(request.form['studio_ret'])
71
- valorizacao = float(request.form['valorizacao'])
72
- franquia_ret = float(request.form['franquia_ret'])
73
- acoes_ret = float(request.form['acoes_ret'])
74
- renda_fixa = float(request.form['renda_fixa'])
75
- inflacao = float(request.form['inflacao'])
76
-
77
- df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
78
- grafico = gerar_grafico(df)
79
-
80
- return render_template(
81
- 'index.html',
82
- grafico=grafico,
83
- capital=capital,
84
- studio_ret=studio_ret,
85
- valorizacao=valorizacao,
86
- franquia_ret=franquia_ret,
87
- acoes_ret=acoes_ret,
88
- renda_fixa=renda_fixa,
89
- inflacao=inflacao
90
- )
91
- else:
92
- return render_template('index.html')
93
 
94
  @app.route('/download_excel', methods=['POST'])
95
  def download_excel():
@@ -100,29 +125,19 @@ def download_excel():
100
  acoes_ret = float(request.form['acoes_ret'])
101
  renda_fixa = float(request.form['renda_fixa'])
102
  inflacao = float(request.form['inflacao'])
103
-
104
- df = gerar_simulacao(
105
- capital,
106
- studio_ret,
107
- valorizacao,
108
- franquia_ret,
109
- acoes_ret,
110
- renda_fixa,
111
- inflacao
112
- )
113
-
114
  output = io.BytesIO()
115
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
116
  df.to_excel(writer, index=False, sheet_name='Simulação')
117
- writer.save()
118
  output.seek(0)
119
-
120
- return send_file(
121
- output,
122
- download_name="simulacao_investimentos.xlsx",
123
- as_attachment=True,
124
- mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
125
- )
126
 
127
  if __name__ == '__main__':
128
  app.run(host='0.0.0.0', port=7860, debug=True)
 
1
  from flask import Flask, render_template, request, send_file
 
 
2
  import matplotlib.pyplot as plt
3
  import pandas as pd
4
+ import io
5
+ import base64
6
 
7
  app = Flask(__name__)
8
 
9
+ def gerar_simulacao(capital, studio_ret_mensal, valorizacao_anual, franquia_ret_anual,
10
+ acoes_ret_anual, renda_fixa_anual, inflacao_anual, anos=10):
11
+ """
12
+ Gera DataFrame com projeção de investimentos ao longo dos anos.
13
+ - studio_ret_mensal em % (ex: 1.0)
14
+ - valorizacao_anual em % (ex: 6.0)
15
+ - franquia_ret_anual em R$ (lucro fixo anual)
16
+ - acoes_ret_anual em % (ex: 10.0)
17
+ - renda_fixa_anual em % (ex: 9.0)
18
+ - inflacao_anual em %
19
+ """
20
+
21
+ # Inicializa listas para armazenar os valores ano a ano
22
+ anos_lista = list(range(1, anos + 1))
23
+ studio_valor = []
24
+ franquia_valor = []
25
+ acoes_valor = []
26
+ renda_fixa_valor = []
27
+
28
+ # Capital inicial para cada investimento
29
+ studio_capital = capital
30
+ franquia_capital = capital
31
+ acoes_capital = capital
32
+ renda_fixa_capital = capital
33
+
34
+ # Retornos mensais para o studio (convertendo % para decimal)
35
+ studio_ret_mensal /= 100
36
+ valorizacao_anual /= 100
37
+ acoes_ret_anual /= 100
38
+ renda_fixa_anual /= 100
39
+ inflacao_anual /= 100
40
+
41
+ for ano in anos_lista:
42
+ # Studio:
43
+ # 1) Rentabilidade mensal capitalizada 12 meses
44
+ renda_mensal = studio_capital * studio_ret_mensal
45
+ renda_anual = renda_mensal * 12
46
+ # 2) Valorização anual do imóvel aplicada ao capital investido
47
+ studio_capital = (studio_capital + renda_anual) * (1 + valorizacao_anual)
48
+ studio_valor.append(studio_capital)
49
+
50
+ # Franquia:
51
+ # Considera lucro anual fixo + reinvestimento (simplificação)
52
+ franquia_capital = (franquia_capital + franquia_ret_anual) * (1 + inflacao_anual * 0.2) # pequena valorização pela inflação
53
+ franquia_valor.append(franquia_capital)
54
+
55
+ # Ações:
56
+ acoes_capital = acoes_capital * (1 + acoes_ret_anual)
57
+ acoes_valor.append(acoes_capital)
58
+
59
+ # Renda Fixa:
60
+ renda_fixa_capital = renda_fixa_capital * (1 + renda_fixa_anual)
61
+ renda_fixa_valor.append(renda_fixa_capital)
62
+
63
+ df = pd.DataFrame({
64
+ 'Ano': anos_lista,
65
+ 'Studio (R$)': studio_valor,
66
+ 'Franquia (R$)': franquia_valor,
67
+ 'Ações (R$)': acoes_valor,
68
+ 'Renda Fixa (R$)': renda_fixa_valor
69
+ })
70
+
71
  return df
72
 
73
+ def plotar_grafico(df):
74
  plt.figure(figsize=(10,6))
75
+ plt.plot(df['Ano'], df['Studio (R$)'], marker='o', label='Studio')
76
+ plt.plot(df['Ano'], df['Franquia (R$)'], marker='o', label='Franquia')
77
+ plt.plot(df['Ano'], df['Ações (R$)'], marker='o', label='Ações')
78
+ plt.plot(df['Ano'], df['Renda Fixa (R$)'], marker='o', label='Renda Fixa')
79
+ plt.title('Projeção de Investimentos ao Longo dos Anos')
80
  plt.xlabel('Ano')
81
+ plt.ylabel('Valor acumulado (R$)')
82
+ plt.grid(True, alpha=0.3)
83
  plt.legend()
84
+ plt.tight_layout()
85
+
86
  buf = io.BytesIO()
87
+ plt.savefig(buf, format='png', transparent=True)
88
  plt.close()
89
  buf.seek(0)
90
+ img_base64 = base64.b64encode(buf.getvalue()).decode('utf8')
91
  return img_base64
92
 
93
  @app.route('/', methods=['GET', 'POST'])
94
  def index():
95
+ grafico = None
96
+ df = None
97
  if request.method == 'POST':
98
+ try:
99
+ capital = float(request.form['capital'])
100
+ studio_ret = float(request.form['studio_ret'])
101
+ valorizacao = float(request.form['valorizacao'])
102
+ franquia_ret = float(request.form['franquia_ret'])
103
+ acoes_ret = float(request.form['acoes_ret'])
104
+ renda_fixa = float(request.form['renda_fixa'])
105
+ inflacao = float(request.form['inflacao'])
106
+
107
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
108
+ grafico = plotar_grafico(df)
109
+
110
+ # Passa variáveis para renderizar no template
111
+ return render_template('index.html', grafico=grafico, capital=capital, studio_ret=studio_ret,
112
+ valorizacao=valorizacao, franquia_ret=franquia_ret, acoes_ret=acoes_ret,
113
+ renda_fixa=renda_fixa, inflacao=inflacao)
114
+ except Exception as e:
115
+ return f"Erro ao processar dados: {e}", 400
116
+
117
+ return render_template('index.html', grafico=None)
 
 
 
 
118
 
119
  @app.route('/download_excel', methods=['POST'])
120
  def download_excel():
 
125
  acoes_ret = float(request.form['acoes_ret'])
126
  renda_fixa = float(request.form['renda_fixa'])
127
  inflacao = float(request.form['inflacao'])
128
+
129
+ df = gerar_simulacao(capital, studio_ret, valorizacao, franquia_ret, acoes_ret, renda_fixa, inflacao)
130
+
 
 
 
 
 
 
 
 
131
  output = io.BytesIO()
132
  with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
133
  df.to_excel(writer, index=False, sheet_name='Simulação')
 
134
  output.seek(0)
135
+
136
+ return send_file(output,
137
+ download_name="simulacao_investimentos.xlsx",
138
+ as_attachment=True,
139
+ mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
140
+
 
141
 
142
  if __name__ == '__main__':
143
  app.run(host='0.0.0.0', port=7860, debug=True)