-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Description
import pandas as pd
import numpy as np
import datetime
def analizar_negocio(ruta_archivo):
print("--- INICIANDO ANÁLISIS DEL NEGOCIO DE CERVEZA ---\n")
# 1. Cargar el archivo
# Intentamos leer el archivo asumiendo que es el CSV que subiste
try:
df = pd.read_csv(ruta_archivo)
except Exception as e:
print(f"Error leyendo el archivo: {e}")
return
# 2. Limpieza de Datos Básica
# Convertir FECHA a formato fecha
df['FECHA'] = pd.to_datetime(df['FECHA'], errors='coerce')
# Asegurar que MONTO y CANTIDAD sean numéricos
df['MONTO'] = pd.to_numeric(df['MONTO'], errors='coerce').fillna(0)
df['CANTIDAD'] = pd.to_numeric(df['CANTIDAD'], errors='coerce').fillna(0)
# Crear columnas útiles para análisis de tiempo
df['Mes'] = df['FECHA'].dt.to_period('M')
df['Dia_Semana'] = df['FECHA'].dt.day_name(locale='es_ES.utf8') # Requiere configuración local, si falla usará inglés por defecto
if df['Dia_Semana'].isnull().all(): # Fallback a inglés si no hay locale español
df['Dia_Semana'] = df['FECHA'].dt.day_name()
# Separar Ingresos y Egresos
ingresos = df[df['TIPO'].str.upper().str.contains('INGRESO')]
egresos = df[df['TIPO'].str.upper().str.contains('EGRESO')]
# ==========================================
# RESPUESTAS A TUS PREGUNTAS
# ==========================================
print("--- 1. EVOLUCIÓN MENSUAL ---")
evolucion_ingresos = ingresos.groupby('Mes')['MONTO'].sum()
evolucion_egresos = egresos.groupby('Mes')['MONTO'].sum()
df_evolucion = pd.DataFrame({'Ingresos': evolucion_ingresos, 'Egresos': evolucion_egresos}).fillna(0)
df_evolucion['Beneficio'] = df_evolucion['Ingresos'] - df_evolucion['Egresos']
print(df_evolucion)
print("\n")
print("--- 2. DESGLOSE OPERATIVO ---")
print("Top 5 Fuentes de Ingresos (Subcategoría):")
print(ingresos.groupby('SUBCATEGORIA')['MONTO'].sum().sort_values(ascending=False).head(5))
print("\nTop 5 Fuentes de Egresos (Categoría/Subcategoría):")
print(egresos.groupby(['CATEGORIA', 'SUBCATEGORIA'])['MONTO'].sum().sort_values(ascending=False).head(5))
print("\n")
print("--- 3. RENTABILIDAD Y ROI ---")
total_ingresos = ingresos['MONTO'].sum()
total_egresos = egresos['MONTO'].sum()
beneficio_total = total_ingresos - total_egresos
roi = (beneficio_total / total_egresos) * 100 if total_egresos > 0 else 0
print(f"Ingresos Totales: ${total_ingresos:,.2f}")
print(f"Egresos Totales: ${total_egresos:,.2f}")
print(f"Ganancia Neta: ${beneficio_total:,.2f}")
print(f"ROI Global (Retorno de Inversión): {roi:.2f}%")
print("(Un ROI positivo significa que el negocio es rentable globalmente)")
print("\n")
print("--- 4. PRODUCTOS Y VENTAS ---")
# Producto Estrella (Por dinero generado)
producto_estrella_dinero = ingresos.groupby('SUBCATEGORIA')['MONTO'].sum().idxmax()
monto_estrella = ingresos.groupby('SUBCATEGORIA')['MONTO'].sum().max()
# Producto más vendido (Por cantidad)
producto_mas_vendido = ingresos.groupby('SUBCATEGORIA')['CANTIDAD'].sum().idxmax()
print(f"Producto Estrella (Más dinero): {producto_estrella_dinero} (${monto_estrella:,.0f})")
print(f"Producto Más Vendido (Volumen): {producto_mas_vendido}")
print("\n")
print("--- 5. EQUIPO DE VENTAS ---")
ventas_por_vendedor = ingresos.groupby('ENCARGADO')['MONTO'].sum().sort_values(ascending=False)
print("Ranking de Vendedores:")
print(ventas_por_vendedor)
mejor_vendedor = ventas_por_vendedor.idxmax()
peor_vendedor = ventas_por_vendedor.idxmin()
print(f"\nMejor Vendedor: {mejor_vendedor}")
print(f"Vendedor con menor volumen: {peor_vendedor}")
print("\n")
print("--- 6. PUNTO DE EQUILIBRIO Y GASTOS ---")
# Gastos Fijos vs Variables (Estimación basada en nombres comunes)
# Asumimos que "COSTOS VARIABLES" es variable, y "GASTOS OPERATIVOS" o "NOMINA" son fijos
# Esto es una aproximación basada en tus categorías
gastos_nomina = egresos[egresos['CATEGORIA'].str.contains('NOMINA', case=False, na=False)]['MONTO'].sum()
proporcion_nomina = (gastos_nomina / total_egresos) * 100 if total_egresos > 0 else 0
print(f"Gasto en Nómina/Mano de Obra: ${gastos_nomina:,.2f} ({proporcion_nomina:.2f}% del gasto total)")
# Punto de Equilibrio (Promedio mensual)
promedio_gastos_mensuales = evolucion_egresos.mean()
print(f"Necesitas vender al menos ${promedio_gastos_mensuales:,.0f} al mes promedio para no perder dinero (Punto de equilibrio simple).")
print("\n--- 7. DÍAS DE OPERACIÓN ---")
# Día con más ingresos
dia_mejor = ingresos.groupby('Dia_Semana')['MONTO'].sum().idxmax()
print(f"Mejor día de la semana para abrir: {dia_mejor}")
print("\n--- FIN DEL REPORTE ---")
if name == "main":
# Asegúrate de que el nombre del archivo coincida exactamente con el que tienes en tu carpeta
archivo = 'plan financiero cerveza.xlsx - plan financiero .csv'
analizar_negocio(archivo)
Metadata
Metadata
Assignees
Labels
No labels