我正在创建一个数据集,用于训练一个模型,该模型可以在给定的日期时间预测与固体废物管理相关的垃圾箱重量,为此我编写了以下代码。
def sevendays(x):
base =datetime.datetime.today()
date_list = [(base + dt.timedelta(days=x)).date() for x in range(0, x)]
dc = {'tcm_trip_date_time':date_list, 'Hour':list(range(0,25)), 'Ward_ID':list(range(1,199)), 'Bin_ID':list(range(1,11))}
df_pred = pd.DataFrame(list(itertools.product(*dc.values())), columns=dc.keys())
df_pred['Bin_Type'] = df_pred['Bin_ID'].apply(lambda x : "Small" if (x<=5) else "Medium" if (x>=6 and x<=8) else "Large")
df_pred['Parts_Of_Day'] = df_pred['Hour'].apply(lambda x : "Morning" if (x>=3 and x<=12) else "Afternoon"
if (x>=13 and x<=16) else "Evening" if (x>=16 and x<=19) else "Night")
df_pred['Volume'] = 0
return (df_pred.head(200))
从上面的函数中,我们得到以下数据框
在此数据中,有198个唯一的Ward_ID,每个Ward_ID具有10个唯一的Bin_ID,并且已将垃圾箱分隔为不同的类型“小”,“中”和“大”,还根据小时/时间分配了part_of_day即晚上,早上,下午和晚上。
我现在的目标是为每小时分配垃圾箱的重量/体积,以使用数据集训练模型。 假定的逻辑是,小型,中型和大型垃圾箱的最大容量分别为250公斤,600公斤和1200公斤。
基于此容量和一天中的一部分,重量应以给定的速率增加,例如,晚上每小时增加5%,早上增加每小时50%,下午增加10%,晚上每小时增加35%。
代码应引用volume的最后一个值,并进行如下计算:
前一行的体积+(前一行的体积*百分比)=当前行的体积
并将其输入到当前行。当BIN达到最大容量并从0开始重新循环时,此循环应会中断。
使用这些假设来获得数量增加的趋势,以便在提供日期时预测数量。
我已经使用以下代码进行了尝试,但是并没有提供期望的输出。.我需要堆栈社区的帮助来解决此问题(在下面找到代码和示例结果)
def sevendays(x):
base =datetime.datetime.today()
date_list = [(base + dt.timedelta(days=x)).date() for x in range(0, x)]
dc = {'tcm_trip_date_time':date_list, 'Hour':list(range(0,25)), 'Ward_ID':list(range(1,199)), 'Bin_ID':list(range(1,11))}
df_pred = pd.DataFrame(list(itertools.product(*dc.values())), columns=dc.keys())
df_pred['Bin_Type'] = df_pred['Bin_ID'].apply(lambda x : "Small" if (x<=5) else "Medium" if (x>=6 and x<=8) else "Large")
df_pred['Parts_Of_Day'] = df_pred['Hour'].apply(lambda x : "Morning" if (x>=3 and x<=12) else "Afternoon"
if (x>=13 and x<=16) else "Evening" if (x>=16 and x<=19) else "Night")
df_pred['Volume'] = 1
df_pred['Volume'] = df_pred.apply(lambda row: weight_cal(df_pred,row['Bin_Type'], row['Parts_Of_Day'],row['Volume']),axis=1)
return (df_pred.head(200))
def weight_cal(df_pred,Bin_Type,part_of_day,Volume):
df = df_pred
if (Bin_Type=='Small' and part_of_day=='Morning'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(50/100))
elif (Bin_Type=='Small' and part_of_day=='Afternoon'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(35/100))
elif (Bin_Type=='Small' and part_of_day=='Evening'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(10/100))
elif (Bin_Type=='Small' and part_of_day=='Night'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(5/100))
elif (Bin_Type=='Medium' and part_of_day=='Morning'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(50/100))
elif (Bin_Type=='Medium' and part_of_day=='Afternoon'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(35/100))
elif (Bin_Type=='Medium' and part_of_day=='Evening'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(10/100))
elif (Bin_Type=='Medium' and part_of_day=='Night'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(5/100))
elif (Bin_Type=='Large' and part_of_day=='Morning'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(50/100))
elif (Bin_Type=='Large' and part_of_day=='Afternoon'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(35/100))
elif (Bin_Type=='Large' and part_of_day=='Evening'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(10/100))
elif (Bin_Type=='Large' and part_of_day=='Night'):
return df.loc[df.index[-1], "Volume"]+(df.loc[df.index[-1], "Volume"]*(5/100))
import datetime
import datetime as dt
import pandas as pd
import itertools
#create data for 7 days
sevendays(7)