Python

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.5
StockABCpandasSupply chain

Snippets relacionados

Volver al Data Lab