To upload files, please first save the app
import math
import matplotlib.pyplot as plt
import numpy as np
import streamlit as st
import pandas as pd
class Inversion:
def __init__(self):
pass
def interpolar_temperatura(self, hora1, temp1, hora2, temp2, hora_obj):
return temp1 + (temp2 - temp1) * ((hora_obj - hora1) / (hora2 - hora1))
def interpolar_crecimiento_continuo(self, p1, p2, t1, t2, t_obj):
r1 = math.log(p1)
r2 = math.log(p2)
r_interp = r1 + (r2 - r1) * ((t_obj - t1) / (t2 - t1))
return math.exp(r_interp)
def precio_futuro(self, precio_actual, inflacion_anual, tiempo_anios):
return precio_actual * (1 + inflacion_anual) ** tiempo_anios
def valor_inversion(self, precio_esperado, precio_acordado, cantidad):
return (precio_esperado - precio_acordado) * cantidad
def graficar_interpolacion_temperatura(self, hora1, temp1, hora2, temp2):
x = np.linspace(hora1, hora2, 100)
y = temp1 + (temp2 - temp1) * ((x - hora1) / (hora2 - hora1))
fig, ax = plt.subplots()
ax.plot(x, y, label='Interpolación lineal', color='blue')
ax.scatter([hora1, hora2], [temp1, temp2], color='red', label='Puntos conocidos')
ax.set_xlabel("Hora del día")
ax.set_ylabel("Temperatura (°C)")
ax.set_title("Interpolación lineal de temperatura")
ax.legend()
return fig
def graficar_precio_futuro(self, precio_actual, inflacion_anual, años=10):
x = np.linspace(0, años, 100)
y = precio_actual * (1 + inflacion_anual) ** x
fig, ax = plt.subplots()
ax.plot(x, y, color='green')
ax.set_xlabel("Años")
ax.set_ylabel("Precio estimado")
ax.set_title("Crecimiento de precio con inflación")
return fig
def graficar_precios_csv(self, df):
fig, ax = plt.subplots()
ax.plot(pd.to_datetime(df["fecha"]), df["precio"], marker='o', linestyle='-')
ax.set_xlabel("Fecha")
ax.set_ylabel("Precio")
ax.set_title("Histórico de precios")
ax.grid(True)
return fig
# ===========================
# Interfaz Streamlit
# ===========================
inv = Inversion()
st.title("Simulador de Inversión + Carga de CSV")
# --- Subir CSV con datos de precios ---
st.header("1. Cargar archivo CSV de precios")
archivo = st.file_uploader("Sube un archivo CSV con columnas 'fecha' y 'precio'", type=["csv"])
if archivo is not None:
try:
df = pd.read_csv(archivo)
df["fecha"] = pd.to_datetime(df["fecha"]) # Asegura el formato de fecha
st.dataframe(df)
st.subheader("Gráfica de precios cargados")
fig_csv = inv.graficar_precios_csv(df)
st.pyplot(fig_csv)
except Exception as e:
st.error(f"Error al procesar el archivo: {e}")
# --- Interpolación de temperatura ---
st.header("2. Interpolación de temperatura (lineal)")
hora1 = st.number_input("Hora 1", 0.0, 24.0, 10.0)
temp1 = st.number_input("Temperatura en hora 1", -20.0, 50.0, 22.0)
hora2 = st.number_input("Hora 2", 0.0, 24.0, 14.0)
temp2 = st.number_input("Temperatura en hora 2", -20.0, 50.0, 28.0)
hora_obj = st.number_input("Hora deseada para interpolar", 0.0, 24.0, 12.0)
temp_interp = inv.interpolar_temperatura(hora1, temp1, hora2, temp2, hora_obj)
st.success(f"Temperatura estimada: {temp_interp:.2f}°C")
st.subheader("Gráfica de interpolación de temperatura")
fig1 = inv.graficar_interpolacion_temperatura(hora1, temp1, hora2, temp2)
st.pyplot(fig1)
# --- Crecimiento continuo ---
st.header("3. Crecimiento continuo (población)")
p1 = st.number_input("Población día 1", 1.0, 1e9, 1000.0)
p2 = st.number_input("Población día 2", 1.0, 1e9, 2000.0)
t1 = st.number_input("Día 1", 0.0, 365.0, 0.0)
t2 = st.number_input("Día 2", 0.0, 365.0, 10.0)
t_obj = st.number_input("Día objetivo", 0.0, 365.0, 5.0)
p_interp = inv.interpolar_crecimiento_continuo(p1, p2, t1, t2, t_obj)
st.success(f"Población estimada para el día {t_obj}: {p_interp:.2f}")
# --- Precio futuro ---
st.header("4. Precio futuro con inflación")
precio_actual = st.number_input("Precio actual", 0.0, 1e6, 100.0)
inflacion = st.number_input("Inflación anual (%)", 0.0, 100.0, 5.0) / 100
tiempo = st.number_input("Años hasta el futuro", 0.0, 100.0, 3.0)
precio_fut = inv.precio_futuro(precio_actual, inflacion, tiempo)
st.success(f"Precio estimado en {tiempo} años: ${precio_fut:.2f}")
st.subheader("Gráfica de crecimiento de precio")
fig2 = inv.graficar_precio_futuro(precio_actual, inflacion)
st.pyplot(fig2)
# --- Valor inversión ---
st.header("5. Valor de la inversión")
precio_esperado = st.number_input("Precio esperado futuro", 0.0, 1e6, precio_fut)
precio_acordado = st.number_input("Precio acordado", 0.0, 1e6, 110.0)
cantidad = st.number_input("Cantidad invertida", 0.0, 1e6, 10.0)
valor = inv.valor_inversion(precio_esperado, precio_acordado, cantidad)
st.success(f"Valor neto de la inversión: ${valor:.2f}")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?