Skip to content

modelo de datos #126

@galindoleidy-sys

Description

@galindoleidy-sys

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions