python data analysis warehouse stock estimation with lstm network

Giriş

Materyal ve Yöntemler

Veri Seti

SELECT [Tarih] ,[StokKodu] ,[Miktar] ,[DepoNo] ,[MaliyetUSD]
FROM [StokTahmin].[dbo].[depo_stok]
  • İadeler, hasarlı ürünler, teknik parca olarak kullanimda olan ürünler, kargo faliyetlerinde yer alan ürünler Miktar değerinden çıkartıldı,
    Yani; net satılabilir stok Miktar değeri baz alındı.
  • Miktar=NULL olan stokların Miktar değerleri 0 – Sıfır olarak dolduruldu,
    Sistemin hesaplama hatası almaması için yapıldı.
  • Her stok için her tarih değerinde bir kayıt olduğu kontrol edildi,
    Geriye dönük tarih bazlı stok kontrolü adına hata almaması için yapıldı.
  • 2024-01-01 / 2024-05-01 tarih aralığındaki gün sayısı değeri kontrol edildi,
    Sistemsel hata nedeni ile eksik gün sayısı olmaması için yapıldı.

Veri Ön İşleme

Model Geliştirme

Eğitim ve Validasyon

Araç, Dil ve Çözümler


Kodlar

  • pandas (pd): Veri analizi ve manipülasyonu için kullanıldı.
  • numpy (np): Sayısal hesaplamalar için kullanıldı.
  • keras.models (Sequential, load_model): Derin öğrenme modelleri oluşturmak için kullanıldı.
    Sequential modeli; katmanları sıralı bir şekilde yerleştirmek için kullanıldı.
    load_model; daha önce eğitilmiş ve kaydedilmiş modelleri yüklemek için
    kullanıldı.
  • keras.layers (LSTM, Dense): Uzun ve kısa süreli hafıza birimleri içeren katmanlar ve zaman serisi verilerindeki uzun vadeli bağımlılıkları öğrenmek için kullanıldı. Dense ise; her biri bir önceki katmanın tüm nöronlarına bağlı olan nöronlardan oluşan tam bağlı bir katman yapısı için kullanıldı.
  • sklearn.preprocessing (MinMaxScaler): Özellik ölçeklendirme için kullanıldı. Verileri belirli bir aralığa (genellikle 0 ile 1 arasında) ölçeklendirerek algoritmaların daha hızlı ve daha etkili çalışmasını sağlamaktadır.
  • pyodbc: ODBC veritabanlarına bağlanmak için kullanıldı.
  • sklearn.model_selection (train_test_split):Veri setlerini rastgele eğitim ve test alt kümelerine ayırmak için kullanıldı.
  • kerastuner.tuners (RandomSearch): Belirli bir parametre alanı içinde rastgele arama yaparak, hiperparametre optimizasyonu sağlaması için kullanıldı.
  • keras.callbacks (EarlyStopping): Belirli bir süre boyunca gözlemlenen metrikte bir iyileşme olmadığında, eğitimi otomatik olarak durdurmak için kullanıldı.
  • matplotlib.pyplot (plt): Veri görselleştirme için kullanıldı.
  • seaborn (sns): Veri görselleştirme için kullanıldı.
  • os: Dosya yolları, dizin işlemleri (oluşturma, silme, değiştirme) vb. işlemler için kullanıldı.
  • sklearn.metrics (mean_squared_error): Hata oranını ölçmek için kullanıldı.
  • connection_string: Genel parametreleri derleyerek, veritabanına bağlanmak için kullanıldı.
    Bu parametreler arasında; kullanılan veritabanı sürücüsü (Driver), sunucu adı (Server), veritabanı adı (Database), kullanıcı adı (uid) ve şifre (pwd) bulunmaktadır.
  • query: Veritabanı üzerinden; sorgulama ile ilgili verileri almak için kullanıldı.
  • except: Veritabanı bağlantı kontrolü kullanıldı.      
    pyodbc.Error: ODBC sürücüsüyle ilgili; genellikle bağlantı veya sorgu çalıştırma hataları için tetiklemesi adına kullanıldı.
    Exception: Yukarıdaki özgün hatalar dışında kalan diğer tüm hataları yakalamak için kullanıldı.
    finally: Bağlantının başarılı bir şekilde kurulup kurulmadığına bakılmaksızın; eğer “connection” nesnesi mevcut ise, bağlantıyı güvenli bir şekilde kapatması için kullanıldı.
  • head(): query ile veritabanı üzerinden çekilmiş sorgu sonucunu önizlemek için kullanıldı.
  • info(): Verisetine yönelik özet nicel bilgileri kontrol etmek için kullanıldı.
  • fetch_data(): Fonksiyonu önceden tanımlı SQL sorgusu ile veritabanından ilgili verileri çekmek için kullanıldı.
  • MinMaxScaler(): Veri ölçeklendirme işlemi için kullanıldı.
    Verileri; belirli bir aralığa (varsayılan olarak 0 ile 1 arasında) ölçeklendirmektedir.
    Ölçeklendirme işlemi; farklı büyüklüklerdeki özelliklerin (features) model tarafından eşit olarak değerlendirilmesini sağlar, bu da algoritmanın performansını artırır.
  • scaler.fit_transform(): İlgili parametrenin sütununu ölçeklendirmek için kullanıldı.
look_back = 30
features = []
labels = []
df['Tarih'] = pd.to_datetime(df['Tarih'])
df.sort_values(['StokKodu', 'Tarih'], inplace=True)
for i in range(look_back, len(df)-1):
    features.append(df['Miktar_scaled'].values[i-look_back:i])
    labels.append(df['Miktar_scaled'].values[i])
  • pd.to_datetime(df[‘Tarih’]): Tarih sütunundaki verileri tarih-saat formatına dönüştürmek için kullanıldı.
  • df.sort_values([‘StokKodu’, ‘Tarih’], inplace=True): DataFrame’i; “StokKodu” ve “Tarih” sütunlarına göre sıralamak için kullanıldı.
    Bu sıralama; her bir stok kodunun zaman içindeki değişimini, kronolojik sırayla gözlemlemek için yapılmaktadır.
    inplace=True parametresi; değişikliklerin orijinal DataFrame üzerinde kalıcı olarak uygulanmasını sağlamak için kullanıldı.
  • look_back: Modelin geçmiş veri pencerelerini; kaç zaman adımı olarak göz önünde bulunduracağını belirlemek için kullanıldı. Bu örnekte; her bir özellik vektörü için son 30 zaman adımının verisi kullanılır. Bu; projede kullandımığız sistematikte ise, 30 gün olarak karşılık bulmaktadır.
  • features: Bağımsız değişkenler (predictors) olarak kullanılacak özellik setlerini içermesi için kullanıldı. Her bir özellik seti; belirli bir stok kodunun, sıralı tarihlerdeki ölçeklenmiş miktar değerlerinden oluşan bir zaman penceresini ifade etmektedir.
  • labels: Her bir özellik setine karşılık gelen bağımlı değişkeni (target) içermesi için kullanıldı. Burada; her özellik seti için, hemen sonraki miktar değeri etiket olarak kullanılmaktadır.
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.3, shuffle=False)
def build_model(hp):
    model = Sequential()
    model.add(LSTM(units=hp.Int('units', min_value=32, max_value=256, step=32), input_shape=(look_back, 1)))
    model.add(Dense(1))
    model.compile(optimizer=hp.Choice('optimizer', ['adam', 'rmsprop', 'sgd']), loss='mean_squared_error')
    return model
  • train_test_split(): Veri setini eğitim ve test setlerine ayırmak için kullanıldı.
    test_size=0.3: Veri setinin %30’unun test için ayrıldığını belirtmek için kullanıldı.
    Kalan veriseti, yani; %70’i ise, eğitim seti olarak kullanılmaktadır.
    shuffle=False: Verilerin bölünmeden önce karıştırılmaması için kullanıldı.
    Zaman serisi verilerinde, genellikle verilerin sırasının korunması tercih edilir; çünkü, zamanın önceki ve sonraki durumlar arasında doğal bir bağlantı bulunmaktadır.
  • build_model(hp) – hp: Hyperparameter (hiperparametre): Hiperparametre tuning için kullanıldı.
  • Sequential(): Keras modeli oluşturmak için kullanıldı.
    Sequential model; katmanların sıralı bir liste gibi düzenlendiği bir model türüdür.
  • LSTM: Uzun-Kısa Süreli Hafıza birimlerini içeren model üzerindeki işlemlerin gerçekleştirilmesi için kullanıldı.
  • units=hp.Int(‘units’, min_value=32, max_value=256, step=32): LSTM katmanındaki nöron sayısı belirlemek için kullanılmaktadır. Bu değer; modelin karmaşıklığını ve öğrenme kapasitesini doğrudan etkilemektedir.
    hp.Int fonksiyonu; belirtilen aralıkta (32’den 256’ya kadar 32’lik adımlarla) en iyi unit[1] (ünite) sayısını bulmak için kullanılmaktadır.
  • input_shape=(look_back, 1): Modelin girdi şeklini belirlemek için kullanıldı.
    Burada, look_back parametresi; her bir örneğin, kaç zaman adımını içereceğini ve 1 verinin tek bir özellikten (tek değişkenli zaman serisi) oluştuğunu belirtmektedir.
  • Dense(1): Modelin çıkış katmanı olarak kullanıldı. Çıktı boyutu 1 olarak ayarlanmıştır. Yani; model her bir örneğin çıktısı olarak tek bir değer üretmektedir.
  • optimizer=hp.Choice(‘optimizer’, [‘adam’, ‘rmsprop’, ‘sgd’]): Modelin eğitimi sırasında kullanılacak optimizasyon algoritmasını belirlemek için kullanıldı.
    Bu seçim; hiperparametre optimizasyon sürecinde test edilmektedir.

def ensure_directories_exist(directory, project_name):
    full_path = os.path.join('C:\\Temp', directory, project_name)
    os.makedirs(full_path, exist_ok=True)  # exist_ok=True, dizin zaten varsa hata vermemesini saglar.
ensure_directories_exist('model_tuning', 'stock_prediction')
tuner = RandomSearch(
    build_model,
    objective='val_loss',
    max_trials=10,
    executions_per_trial=3,
    directory='C:\\Temp\\model_tuning',
    project_name='stock_prediction'
)
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
tuner.search(X_train, y_train, epochs=50, validation_data=(X_test, y_test), callbacks=[early_stopping])
best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"En iyi hiperparametreler: \n"
      f"Units: {best_hps.get('units')}\n"
      f"Optimizer: {best_hps.get('optimizer')}"))
  • ensure_directories_exist(): Modelin ayar dosyalarının saklanacağı dizinleri kontrol edip, gerekirse bu dizinleri oluşturmak için kullanıldı.
    Fonksiyon, os modülünün makedirs metodunu kullanarak; verilen dizin yolunu (`C:\Temp\model_tuning\stock_prediction`) kontrol eder ve eğer dizin yoksa oluşturur. Bu yapı; model ayarlarının organize bir şekilde saklanmasını ve eğitim süreci sırasında erişilebilir olmasını sağlamaktadır.
  • RandomSearch[1](): build_model fonksiyonunu kullanarak, farklı model yapılandırmalarını test etmek için kullanıldı.
  • EarlyStopping(): Modelin eğitim sürecinde, belirli bir kriter üzerinde iyileşme olmadığı takdirde eğitimi durdurmak için kullanıldı.
    monitor=’val_loss’: İzlenen metrik, doğrulama kaybını takip için kullanıldı.
    patience=10: Eğer; 10 epoch boyunca “val_loss” metriğinde iyileşme olmazsa, eğitimi durdurmak için kullanıldı.
    restore_best_weights=True: Eğitim durdurulduğunda; modelin en iyi ağırlıkları geri yüklenmesi için kullanıldı. Bu erken durdurma noktasında; elde edilen en iyi performansın korunmasını sağlamaktadır.
  • tuner.search(): Hiperparametre optimizasyon sürecini başlatmak için kullanıldı.
    X_train, y_train: Modelin eğitim verilerini ifade etmek için kullanıldı.
    epochs=50: Maksimum iterasyon (epoch) sayısını belirlemek için kullanıldı.
    validation_data: Modelin performansının değerlendirileceği test verilerini belirtmek için kullanıldı.
    callbacks=[early_stopping]: Eğitim sürecine dahil edilen erken durdurma mekanizması için kullanıldı. Bu callback; yukarıda tanımlanan erken durdurma koşullarını kontrol edtmekte ve gerektiğinde eğitimi durdurulmasını sağlamaktadır.

trial_ids = []
units = []
optimizers = []
val_losses = []
for trial in tuner.oracle.trials.values():
    trial_ids.append(trial.trial_id)
    units.append(trial.hyperparameters.values['units'])
    optimizers.append(trial.hyperparameters.values['optimizer'])
    val_losses.append(trial.score)
results_df = pd.DataFrame({
    'trial_id': trial_ids,
    'units': units,
    'optimizer': optimizers,
    'val_loss': val_losses
})
print(results_df)
plt.figure(figsize=(10, 6))
sns.scatterplot(data=results_df, x='units', y='val_loss', hue='optimizer', style='optimizer', s=100)
plt.title('Hiperparametrelerin Doğrulama Kaybina Göre Performansi')
plt.xlabel('Units')
plt.ylabel('Validation Loss')
plt.legend(title='Optimizer')
plt.grid(True)
plt.show()
  • tuner.get_best_hyperparameters(num_trials=1): RandomSearch objesinden hiperparametre aramaları sırasında elde edilen en iyi hiperparametreleri almak için kullanıldı. “num_trials=1” parametresi; en iyi hiperparametre setini almak için kullanılmaktadır. Bu fonksiyon bir liste döndürdüğü için [0] ile listenin ilk elemanı alınır; bu da, en iyi hiperparametreleri içeren HyperParameters objesidir.
  • pd.DataFrame(): Optimizasyon süreci sırasında kaydedilen hiperparametre değerleri ve elde edilen doğrulama kaybı değerleri ile bir DataFrame oluşturmak için kullanıldı.
    Bu DataFrame; her bir deneme için “trial_id” kullanılan LSTM üniteleri “units”, optimizasyon algoritması “optimizer” ve elde edilen doğrulama kaybı “val_loss” değerlerini içermektedir.
  • plt.figure(figsize=(10, 6)): Matplotlib ile bir grafik çizimi oluşturmak için kullanıldı.
    figsize parametresi ise; grafiğin boyutunu “inch[1]” (inç) cinsinden belirlemektedir.
    sns.scatterplot(): Saçılım grafiği “scatter plot” çizmek için kullanıldı.
    Bu grafik, her bir denemenin LSTM ünite sayısına “units” ve elde edilen doğrulama kaybına “val_loss” göre nasıl performans gösterdiğini göstermektedir.
    hue=’optimizer’ ve style=’optimizer’: Farklı optimizasyon algoritmalarına göre noktaların rengini ve stilini ayarlamak için kullanıldı. Bu farklı optimizer seçeneklerinin performansını karşılaştırmayı kolaylaştırmaktadır.
    s=100: Noktaların boyutunu belirlemek için kullanıldı.
    plt.title(), plt.xlabel() ve plt.ylabel(): Grafiğe; başlık ve x ve y eksenlerine etiketler eklemek için kullanıldı.
    plt.legend(): Anahtar bilgileri grafiğe eklemek için kullanıldı.
    plt.grid(True): Arka plana ızgara çizgileri eklemek için kullanıldı.
    plt.show(): Grafiği göstermek için kullanıldı.

best_row = results_df.loc[results_df['val_loss'].idxmin()]
best_units = best_row['units'] 
best_optimizer = best_row['optimizer']
print(f"En iyi modelin parametreleri: \n{best_row}")
  • results_df.loc[results_df[‘val_loss’].idxmin()]: results_df adlı DataFrame içerisinden; val_loss sütununun en düşük değerini bulmak için kullanıldı.
    Son olarak ilgili değeri best_row değişkenine atamaktadır.
  • best_row[‘units’]: best_row değişkeninde saklanan satırdan; units sütunun değeri alıp, best_units adlı değişkene atamak için kullanıldı.
  • best_optimizer = best_row[‘optimizer’]: best_row değişkeninde saklanan satırdan optimizer sütunu değeri alıp, best_optimizer adlı değişkene atamak için kullanıldı.
  • print(f”En iyi modelin parametreleri: \n{best_row}”): best_row değişkeni değerini ekrana yazdırmak için kullanıldı.
history = best_model.fit(X_train, y_train, epochs=50, validation_data=(X_test, y_test), callbacks=[early_stopping])
plt.figure(figsize=(10, 5))
plt.plot(history.history['loss'], label='Egitim Kaybi')
plt.plot(history.history['val_loss'], label='Dogrulama Kaybi')
plt.title('Model Kaybi')
plt.ylabel('Kayip')
plt.xlabel('Epoch')
plt.legend(loc='upper right')
plt.show()
  • history = best_model.fit(X_train, y_train, epochs=50, validation_data=(X_test, y_test), callbacks=[early_stopping]): En iyi modeli “best_model” kullanarak; eğitim veri seti “X_train”, “y_train” üzerinde modeli eğitmek ve “epochs=50” parametresi ile modelin eğitim verileri üzerinden 50 kez geçerek, doğrulama ve durum tarihçesine ulaşmak için kullanıldı.
  • plt.figure(figsize=(10, 5)): Grafik çiziminin boyutlarını belirlemek için kullanıldı.
    plt.plot(history.history[‘loss’], label=’Egitim Kaybi’): Eğitim sürecindeki kayıp değerlerini “loss” çizmek için kullanıldı.
    plt.plot(history.history[‘val_loss’], label=’Dogrulama Kaybi’): Eğitim sürecindeki doğrulama kaybını “val_loss” çizmek için kullanıldı.
    plt.title(‘Model Kaybi’)
    plt.ylabel(‘Kayip’)
    plt.xlabel(‘Epoch’)
    : Sırasıyla; grafik başlığını ve y-ekseni (kayıp) ile x-ekseni (eğitim dönemi) için etiketleri tanımlama adına kullanıldı.
    plt.legend(loc=’upper right’): Çizilen her çizginin; neyi temsil ettiğini belirten bir lejant eklemek ve bu lejantı grafiğin üst sağ köşesine yerleştirmek için kullanıldı.
    plt.show(): Oluşturulan grafik çizimini göstermek için kullanıldı.
best_model = tuner.get_best_models(num_models=1)[0] 
predictions = best_model.predict(X_test) 
mse = mean_squared_error(y_test, predictions)
print(f"Test seti uzerindeki MSE: {mse}")
  • best_model = tuner.get_best_models(num_models=1)[0]: Daha önce kullanılan RandomSearch tuner nesnesi tarafından yapılan model aramaları arasından; en iyi performans gösteren modeli almak için kullanıldı.
    get_best_models(num_models=1) metodu; değerlendirme kriterlerine (bu durumda val_loss) göre sıralanmış en iyi modelleri bir liste olarak döndürmesi için kullanıldı. Burada num_models=1 parametresi; yalnızca en iyi modelin döndürülmesini sağlamaktadır. Döndürülen liste içerisinden; ilk model [0] ile seçilir ve best_model değişkenine atanır.
  • predictions = best_model.predict(X_test): best_model olarak seçilen modeli kullanarak, test veri seti X_test üzerinde tahmin yapılmasını sağlamak için kullanıldı. predict fonksiyonu; X_test veri setindeki her örnek için bir çıktı üretir. Bu çıktılar; predictions adlı değişkene atanır.
  • mse = mean_squared_error(y_test, predictions): Modelin tahminlerinin ne kadar doğru olduğunu ölçmek için kullanılan bir metrik olan Ortalama Kare Hata (MSE) değerini hesaplamak için kullanıldı. “mean_squared_error” fonksiyonu; gerçek değerler “y_test” ve modelin tahmin ettiği değerler “predictions” arasındaki farkların karelerinin ortalamasını almaktadır. Bu değer; “mse” değişkenine atanır.
  • print(f”Test seti uzerindeki MSE: {mse}”): Bu satır, hesaplanan MSE değerini ekrana yazdırmak için kullanıldı. MSE; modelin test veri setindeki performansını nicel bir şekilde ifade eder; düşük MSE değerleri, modelin gerçek değerlere daha yakın tahminler yaptığını gösterir.
results = {}
best_model = tuner.get_best_models(num_models=1)[0]
for stock_code in df['StokKodu'].unique():
    data = df[df['StokKodu'] == stock_code]
    if len(data) >= look_back:
        last_sequence = data['Miktar_scaled'].values[-look_back:].reshape(1, look_back, 1)
        print("Boyut kontrolu - Last sequence shape:", last_sequence.shape)
        try:
            future_stock = best_model.predict(last_sequence)
            future_stock = scaler.inverse_transform(future_stock)
        except Exception as e:
            print(f"{stock_code} stok kodu icin tahminleme hatasi: {e}")
            continue
        last_date = data['Tarih'].iloc[-1]
        last_stock = data['Miktar'].iloc[-1]
        if last_stock == 0:
            results[stock_code] = "Stok zaten tukenmis."
        else:
            rate_of_depletion = future_stock[0, 0] / last_stock
            if np.isinf(rate_of_depletion):
                results[stock_code] = "Tahmin edilemiyor."
            else:
                days_to_deplete = int(np.ceil(rate_of_depletion))
                depletion_date = last_date + pd.Timedelta(days=days_to_deplete)
                results[stock_code] = depletion_date.strftime('%Y-%m-%d')
    else:
        results[stock_code] = "Yeterli veri yok."
  • results = {}

best_model = tuner.get_best_models(num_models=1)[0]: results adında boş bir sözlük oluşturması için kullanıldı. Bu sözlük; her stok kodunun tahmin edilen tükenme tarihini saklamaktadır. Ardından; daha önce eğitilen modeller arasından en iyi performans gösteren model best_model değişkenine atanır.

  • for stock_code in df[‘StokKodu’].unique(): Bu döngü, veri setindeki df tüm benzersiz stok kodları üzerinde iterasyon yapmak için kullanıldı. Her bir stok kodu için; aşağıdaki işlemler gerçekleştirilir.
  • data = df[df[‘StokKodu’] == stock_code]

if len(data) >= look_back: İlgili stok koduna ait veriler data DataFrame’inde toplanır. Eğer bu DataFrame’deki veri sayısı, modelin girdi olarak beklediği `look_back` değerinden az değilse işleme devam edilir.

  • last_sequence = data[‘Miktar_scaled’].values[-look_back:].reshape(1, look_back, 1): Modelin tahmin yapabilmesi için gerekli olan son look_back sayıda veri alınır ve bu veriler uygun şekilde yeniden boyutlandırılarak reshape modelin girdi formatına uygun hale getirilir.
  • try:

       future_stock = best_model.predict(last_sequence)

       future_stock = scaler.inverse_transform(future_stock)

except Exception as e:

       print(f”{stock_code} stok kodu icin tahminleme hatasi: {e}”)

       continue: Düzenlenmiş veri üzerinde model ile tahmin yapılır. Eğer bir hata meydana gelirse; ilgili hata mesajı yazdırılır ve döngünün sonraki iterasyonuna geçilir. Başarılı bir tahmin sonrası, “scaler.inverse_transform” ile normalizasyondan önceki değerlere dönüştürülür.

  • last_date = data[‘Tarih’].iloc[-1]

   last_stock = data[‘Miktar’].iloc[-1]

   if last_stock == 0:

       results[stock_code] = “Stok zaten tükenmiş.”: Her stok kodu için son tarih ve stok miktarı alınır. Eğer stok miktarı sıfırsa, bu stok kodu için “Stok zaten tükenmiş” bilgisi results sözlüğüne eklenir.

  •    else:

       rate_of_depletion = future_stock[0, 0] / last_stock

       if np.isinf(rate_of_depletion):

           results[stock_code] = “Tahmin edilemiyor.”

       else:

           days_to_deplete = int(np.ceil(rate_of_depletion))

           depletion_date = last_date + pd.Timedelta(days=days_to_deplete)

           results[stock_code] = depletion_date.strftime(‘%Y-%m-%d’): Eğer stok miktarı sıfır değilse, tükenme oranı hesaplanır. Eğer bu oran sonsuz ise (genellikle matematiksel bir hata sonucu), “Tahmin edilemiyor” bilgisi eklenir. Değilse, tükenme gün sayısı hesaplanır, bu gün sayısı son tarihe eklenir ve bu tarih `results` sözlüğüne eklenir.

  • else:

        results[stock_code] = “Yeterli veri yok.”: Eğer `look_back` sayısından daha az veri varsa, bu stok kodu için “Yeterli veri yok” bilgisi eklenir. Bu şekilde, kod bloğu tüm stok kodları için tahminler yapar ve sonuçları `results` sözlüğünde toplar.

for stock_code, depletion_date in results.items():
    print(f"Stok Kodu {stock_code} icin stoklarin bitecegi tahmini tarih: {depletion_date}")
  • for stock_code, depletion_date in results.items(): “results” sözlüğünün; “.items()” metodunu kullanarak, sözlükte saklanan her bir anahtar-değer çifti üzerinde döngü başlatmak için kullanıldı. Burada; “stock_code” her bir stok kodunu temsil ederken, “depletion_date” ise bu stok koduna karşılık gelen tahmini tükenme tarihini temsil eder. “.items()” metodu; sözlükteki anahtar (key) ve değer (value) çiftlerini döndürür, böylece her döngü iterasyonunda bu bilgilere erişilebilmektedir.
  • print(f”Stok Kodu {stock_code} icin stoklarin bitecegi tahmini tarih: {depletion_date}”):Tahmin sonuçlarını görüntüleme adına “print” ve formatlı string “f-string” fonksiyonları kullanıldı. Bu string içinde; “stock_code” ve “depletion_date” değişkenleri doğrudan yerleştirilerek, okunabilir bir cümle formunda çıktı üretilir. Çıktı; her stok kodu için “Stok Kodu [stok kodu] için stokların biteceği tahmini tarih: [tahmini tarih]” şeklinde olmaktadır.

Öneri ve Tartışmalar

Öneri ve tartışmalar olarak alt kısımdaki gibi genel başlıklarda değerlendirmeler çıkartılmıştır.

Model Geliştirme ve Test Süreçleri

    Veri Çeşitliliği ve Model Robustluğu

       Modelin genelleştirme kabiliyetinin artırılması için çeşitli depo ve stok türlerini içeren daha büyük ve çeşitli veri setleri ile testler yapılması önerilebilir. Bu; modelin farklı senaryolar ve koşullar altında da doğru tahminler yapabilmesi kilit çözüm sağlayabilir.

    Veri Kaynağının Ek Öznitelikler İçermesi

    Hiperparametre Optimizasyonu

    Öğrenme ve Tahminleme Modeli Yapısının Değiştirilmesi

    Operasyonel Entegrasyon ve Kullanım Kolaylığı

    Yeni Teknolojiler ve Yaklaşımların Araştırılması


    https://github.com/miracozturk17/warehouse-stock-estimation-with-lstm-network

    , ,

    İlgili Yazılar