Analisis de stock: clasificacion ABC y roturas
Calcula el valor inmovilizado por referencia, clasifica el stock en A/B/C segun la parte acumulada (80/95/100) y lista las referencias que entraran en rotura en menos de 7 dias al ritmo de venta actual.
Requisitos
Python 3.9+, pandas
Python
import pandas as pd
stock = pd.read_csv("stock.csv") # sku, qte, prix_unitaire, ventes_30j
stock["valeur"] = stock["qte"] * stock["prix_unitaire"]
stock["jours_restants"] = stock["qte"] / (stock["ventes_30j"] / 30).clip(lower=0.01)
stock = stock.sort_values("valeur", ascending=False)
part_cumulee = stock["valeur"].cumsum() / stock["valeur"].sum()
stock["classe"] = pd.cut(part_cumulee, [0, 0.80, 0.95, 1.0], labels=["A", "B", "C"])
print(f"Valeur du stock : {stock['valeur'].sum():,.0f} EUR — "
f"{len(stock)} références".replace(",", " "))
print(stock.groupby("classe", observed=True)["valeur"]
.agg(refs="count", valeur="sum").to_string())
print()
ruptures = stock[stock["jours_restants"] < 7]
print(f"ALERTE : {len(ruptures)} référence(s) en rupture sous 7 jours")
print(ruptures[["sku", "qte", "ventes_30j", "jours_restants"]]
.round(1).head(3).to_string(index=False))Resultado
Valeur du stock : 1 284 730 EUR — 3207 références
refs valeur
classe
A 412 1027784.0
B 896 192709.5
C 1899 64236.5
ALERTE : 11 référence(s) en rupture sous 7 jours
sku qte ventes_30j jours_restants
SSD-2TB 18 124 4.4
CAM-USB 25 131 5.7
HUB-USBC 12 55 6.5StockABCpandasSupply chain