Я пытаюсь предсказать, основываясь на движении за последние n дней, дни, в которые конкретный артикул будет отсутствовать на складе в определенном месте. Приведенная ниже функция прекрасно работает, если применить ее к меньшему образцу, используя
df.loc[(df['SKU']>= 10001) &(df['SKU']<30000)].groupby(['SKU','LOCATION_GROUP'].apply(sku_predictions)
Но когда я пытаюсь применить функцию без фильтрации для всего набора данных, все значения заполняются возвращениями из исключений.
def sku_predictions(df):
#lr_model = IsotonicRegression()
lr_model = LinearRegression()
predict = None
last_known_date = None
prediction_list = None
last_day_date = None
try:
location = df['LOCATION_GROUP'].unique()[0]
location_ats_qty = f"{location}_ATS_QTY"
df['PREV_LOCATION_QTY'] = df[location_ats_qty].shift(1)
#if len(df['STORE_ATS_QTY'].unique()) >1:
# print("GREATER THan 1:")
df = df.dropna()
df['DAY_DATE'] = range(1, len(df)+1)
lr_model.fit(df[['DAY_DATE', 'PREV_LOCATION_QTY']], df[location_ats_qty])
#lr_model.fit(df['DAY_DATE'].values, df[location])
try :
if lr_model.coef_[0] >=0 :
return pd.Series({'predict' : 0,'last_day_date' : 0,'prediction_list' : [], 'slope' : lr_model.coef_[0], 'check' :0})
except:
return pd.Series({'predict' : 0,'last_day_date' : 0,'prediction_list' : [], 'slope' : 99, 'check' :0})
predict = df[location_ats_qty].tail(1).values[0]
last_known_date =df['DAY_DATE'].tail(1).values[0]
prediction_list = []
#print(lr_model.coef_[0])
# if lr_model.coef_[0] < 0 : print(lr_model.coef_[0])
last_day_date = last_known_date
while(predict >1):
last_day_date += 1
predict = lr_model.predict([[last_day_date,predict]])
prediction_list.append(predict)
if last_day_date >50: break;
prediction_list = [i[0] for i in prediction_list]
#print(predict, last_day_date, prediction_list)
return pd.Series({'predict' : predict[0],'last_day_date' :last_day_date-last_known_date ,
'prediction_list' : prediction_list, 'slope' : lr_model.coef_[0], 'check' :last_day_date})
except:
return pd.Series({'predict' : 0 ,'last_day_date' : 0 ,'prediction_list' : [], 'slope' : 99, 'check' :0})