File size: 1,980 Bytes
42c78bd
d566c25
0290183
7c127d4
42c78bd
7c127d4
0290183
 
d566c25
7c127d4
 
 
d566c25
7c127d4
d566c25
 
 
 
 
 
7c127d4
d566c25
e406ffb
7c127d4
 
2a17517
7c127d4
e406ffb
 
7c127d4
 
e406ffb
d566c25
 
7c127d4
 
 
 
 
 
0290183
 
7c127d4
 
 
 
 
0290183
 
7c127d4
 
 
 
 
0290183
 
d566c25
0290183
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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:
        # ===== 1. Persiapan Data =====
        scaler = MinMaxScaler()
        scaled_demand = scaler.fit_transform(data[['demand']]).flatten().tolist()
        
        # ===== 2. Prediksi dengan Chronos-T5 =====
        chronos = pipeline(
            "text-generation",
            model="amazon/chronos-t5-small",
            device=device
        )
        
        # Format prompt khusus time series
        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]
        """
        
        # Generate rekomendasi
        response = chronos(
            prompt,
            max_new_tokens=100,
            temperature=0.7
        )[0]['generated_text']
        
        # Ekstrak teks rekomendasi
        rekomendasi = response.split("[/FORMAT]")[-1].strip()
        
        # ===== 3. Simulasi ROI ===== (Contoh Sederhana)
        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,  # Contoh prediksi
            "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)}