|
import torch |
|
import numpy as np |
|
from transformers import pipeline |
|
from sklearn.preprocessing import MinMaxScaler |
|
|
|
def predict_umkm(data, prediction_length=7, safety_stock=10): |
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
|
try: |
|
|
|
scaler = MinMaxScaler() |
|
scaled_demand = scaler.fit_transform(data[['demand']]).flatten().tolist() |
|
|
|
|
|
chronos = pipeline( |
|
"text-generation", |
|
model="amazon/chronos-t5-small", |
|
device=device |
|
) |
|
|
|
|
|
prompt = f""" |
|
[INSTRUCTION] |
|
Berikan rekomendasi manajemen inventori untuk {prediction_length} hari ke depan: |
|
- Data historis demand: {scaled_demand[-100:]} # Ambil 100 data terakhir |
|
- Stok saat ini: {data['supply'].iloc[-1]} |
|
- Safety stock: {safety_stock} |
|
|
|
[FORMAT] |
|
1 kalimat dalam Bahasa Indonesia dengan angka konkret |
|
Estimasi ROI dalam persentase |
|
[/FORMAT] |
|
""" |
|
|
|
|
|
response = chronos( |
|
prompt, |
|
max_new_tokens=100, |
|
temperature=0.7 |
|
)[0]['generated_text'] |
|
|
|
|
|
rekomendasi = response.split("[/FORMAT]")[-1].strip() |
|
|
|
|
|
avg_demand = np.mean(data['demand'][-30:]) |
|
roi = round((avg_demand * 0.2) / (data['supply'].iloc[-1] + safety_stock) * 100, 1) |
|
|
|
return { |
|
"rekomendasi": rekomendasi, |
|
"prediksi": [avg_demand] * prediction_length, |
|
"roi": roi, |
|
"stok_optimal": int(avg_demand * 1.2) + safety_stock, |
|
"anomali": len(data) - len(clean_data(data)) |
|
} |
|
|
|
except Exception as e: |
|
return {"error": str(e)} |