from sklearn.metrics import mean_absolute_error,mean_squared_error import numpy as np import pandas as pd def create_week_date_featues(df,date_column): df['Month'] = pd.to_datetime(df[date_column]).dt.month df['Day'] = pd.to_datetime(df[date_column]).dt.day df['Dayofweek'] = pd.to_datetime(df[date_column]).dt.dayofweek df['DayOfyear'] = pd.to_datetime(df[date_column]).dt.dayofyear df['Week'] = pd.to_datetime(df[date_column]).dt.week df['Quarter'] = pd.to_datetime(df[date_column]).dt.quarter df['Is_month_start'] = np.where(pd.to_datetime(df[date_column]).dt.is_month_start,0,1) df['Is_month_end'] = np.where(pd.to_datetime(df[date_column]).dt.is_month_end,0,1) df['Is_quarter_start'] = np.where(pd.to_datetime(df[date_column]).dt.is_quarter_start,0,1) df['Is_quarter_end'] = np.where(pd.to_datetime(df[date_column]).dt.is_quarter_end,0,1) df['Is_year_start'] = np.where(pd.to_datetime(df[date_column]).dt.is_year_start,0,1) df['Is_year_end'] = np.where(pd.to_datetime(df[date_column]).dt.is_year_end,0,1) df['Semester'] = np.where(df[date_column].isin([1,2]),1,2) df['Is_weekend'] = np.where(df[date_column].isin([5,6]),1,0) df['Is_weekday'] = np.where(df[date_column].isin([0,1,2,3,4]),1,0) df['Days_in_month'] = pd.to_datetime(df[date_column]).dt.days_in_month return df def val_prediction(validation,model:object,train_dataset:pd.DataFrame(),store_id:str='1',item_id:str='1'): predictions = model.predict(validation.filter(lambda x: (x.store ==store_id) & (x.item ==item_id)), return_y=True, return_x=True, trainer_kwargs=dict(accelerator="cpu")) filter_train=train_dataset.loc[(train_dataset['store']==store_id) & (train_dataset['item']==item_id)].reset_index(drop=True) # print(filter_train) training_results=filter_train.iloc[-30:,:] y=[float(i) for i in predictions.output[0]] y_true=[float(i) for i in predictions.y[0][0]] x=[int(i) for i in predictions[1]['decoder_time_idx'][0]] training_results['prediction']=y training_results['y_true']=y_true training_results['x']=x rmse=np.around(np.sqrt(mean_squared_error(training_results['Lead_1'],y)),2) mae=np.around(mean_absolute_error(training_results['Lead_1'],y),2) print(f" VAL DATA = Item ID : {item_id} :: MAE : {mae} :: RMSE : {rmse}") return training_results def test_prediction(model:object,train_dataset,test_dataset,earliest_time,max_encoder_length=120,store_id:str='1',item_id:str='1'): #encoder data is the last lookback window: we get the last 1 week (168 datapoints) for all 5 consumers = 840 total datapoints encoder_data = train_dataset[lambda x: x.days_from_start > x.days_from_start.max() - max_encoder_length] last_data = train_dataset[lambda x: x.days_from_start == x.days_from_start.max()] # decoder_data = pd.concat( # [last_data.assign(date=lambda x: x.date + pd.offsets.DateOffset(i)) for i in range(1, 30 + 1)], # ignore_index=True, # ) # decoder_data["hours_from_start"] = (decoder_data["date"] - earliest_time).dt.seconds / 60 / 60 + (decoder_data["date"] - earliest_time).dt.days * 24 # decoder_data['hours_from_start'] = decoder_data['hours_from_start'].astype('int') # decoder_data["hours_from_start"] += encoder_data["hours_from_start"].max() + 1 - decoder_data["hours_from_start"].min() # # add time index consistent with "data" # decoder_data["days_from_start"] = (decoder_data["date"] - earliest_time).apply(lambda x:x.days) # decoder_data=create_week_date_featues(decoder_data,'date') decoder_data=test_dataset.copy() new_prediction_data = pd.concat([encoder_data, decoder_data], ignore_index=True) filter_test=new_prediction_data.loc[(new_prediction_data['store']==store_id) & (new_prediction_data['item']==item_id)] predictions = model.predict(filter_test, return_y=True, return_x=True, trainer_kwargs=dict(accelerator="cpu")) # print(filter_test) testing_results=test_dataset.loc[(test_dataset['store']=='1') & (test_dataset['item']==item_id)] y=[float(i) for i in predictions.output[0]] y_true=[float(i) for i in predictions.y[0][0]] x=[int(i) for i in predictions[1]['decoder_time_idx'][0]] testing_results['prediction']=y testing_results['y_true']=y_true testing_results['x']=x return testing_results #------------------------------------------------------------- def val_pred(model:object,train_dataset,validation,consumer_id:str='MT_001'): predictions = model.predict(validation.filter(lambda x: (x.consumer_id ==consumer_id)), return_y=True, return_x=True, trainer_kwargs=dict(accelerator="cpu")) filter_train=train_dataset.loc[(train_dataset['consumer_id']==consumer_id)].reset_index(drop=True) # print(filter_train) # filter validation data val_results=filter_train.iloc[-24:,:] # prediction y=[float(i) for i in predictions.output[0]] # actual y_true=[float(i) for i in predictions.y[0][0]] # time idx x=[int(i) for i in predictions[1]['decoder_time_idx'][0]] # update into the validation results val_results['prediction']=y val_results['y_true']=y_true val_results['x']=x # RMSE & MAE for validation data rmse=np.around(np.sqrt(mean_squared_error(val_results['Lead_1'],y)),2) mae=np.around(mean_absolute_error(val_results['Lead_1'],y),2) print(f" VAL DATA = Consumer ID : {consumer_id} :: MAE : {mae} :: RMSE : {rmse}") return val_results def test_pred(model:object,train_dataset,test_dataset,consumer_id:str='MT_001',max_encoder_length:int=168): encoder_data = train_dataset[lambda x: x.hours_from_start > x.hours_from_start.max() - max_encoder_length] last_data = train_dataset[lambda x: x.hours_from_start == x.hours_from_start.max()] decoder_data=test_dataset.copy() new_prediction_data = pd.concat([encoder_data, decoder_data], ignore_index=True) filter_train=new_prediction_data.loc[ (new_prediction_data['consumer_id']==consumer_id)] predictions = model.predict(filter_train, return_y=True, return_x=True, trainer_kwargs=dict(accelerator="cpu")) # print(filter_train) testing_results=test_dataset.loc[(test_dataset['consumer_id']==consumer_id)] y=[float(i) for i in predictions.output[0]] y_true=[float(i) for i in predictions.y[0][0]] x=[int(i) for i in predictions[1]['decoder_time_idx'][0]] testing_results['prediction']=y testing_results['y_true']=y_true testing_results['x']=x rmse=np.around(np.sqrt(mean_squared_error(testing_results['Lead_1'],y)),2) mae=np.around(mean_absolute_error(testing_results['Lead_1'],y),2) print(f"TEST DATA = Consumer ID : {consumer_id} :: MAE : {mae} :: RMSE : {rmse}") return testing_results