1.日期填充:
import datetime
def get_no_date(date_str_li, start_date='', end_date=''):
"""获取没有列表中没有包含的的日期区间的日期
args:
start_date: 查询的起始日期字符串,默认为date_li中最小值
end_date: 查询的终止日期的字符串, 默认为date_li中最大值
date_str_li: 所有需要查询的日期的列表
"""
if not date_str_li:
raise ValueError('list can\'t empty')
# 所有文件名称,日期的列表
try:
date_li = [datetime.datetime.strptime(date_time, '%Y-%m-%d') for date_time in date_str_li]
except:
raise ValueError('your values can\'t be converted')
if end_date:
date_end = datetime.datetime.strptime(end_date, '%Y-%m-%d')
else:
date_end = max(date_li)
if start_date:
date_start = datetime.datetime.strptime(start_date, '%Y-%m-%d')
else:
date_start = min(date_li)
no_list = []
while True:
if date_end not in date_li:
no_list.append(date_end)
if date_end == date_start:
break
date_end -= datetime.timedelta(1)
return [datetime.date.strftime(day, '%Y-%m-%d') for day in no_list]
date_str_li = [i.strip() for i in day_sale_money["order_time"]]
# 填充日期
nan_date = get_no_date(date_str_li=date_str_li,start_date="2009-12-01",end_date='2022-10-18')
print(len(nan_date))
all_sale_money = day_sale_money.append(pd.DataFrame({"order_time":nan_date}),ignore_index=True)
all_sale_money = all_sale_money.sort_values("order_time")
all_sale_money = all_sale_money.reset_index(drop=True)
all_sale_money
2.同比环比的计算
①预测同比销售额的方法是:收集近来几年内的销售额,计算出今年同一时期对比上一年同一天的增长率,然后把增长率求平均值,得出的答案就是约等于今年同一天对于去年同一天的增长率,然后用去年的销售额*增长率就是今年预测的销售。
预测环比销售额的方法:收集今年每个月的销售额,计算出每个月环比上个月的增长率,然后把每个月的增长率求和后求平均值,得出这个月环比上个月预测的增长率,然后用上个月的销售额*增长率就是预计的这个月销售额。
# 考虑到天气的影响,农历与阳历的不同,每年会差个10来天,所以对于计算同比日销量的时间错位半个月。
all_date
all_date['huanbi_sale_money']=all_date['order_money'].shift(1)
all_date["huanbi_day"] = all_date["order_money"]/all_date["huanbi_sale_money"]-1
#同比
all_date["tongbi_sale_money"] = all_date["order_money"].shift(350)
all_date["tongbi_day"] = all_date["order_money"]/all_date["tongbi_sale_money"] - 1
all_date["mean_week_temp"] = all_date["mean_temp"].rolling(7, min_periods=1).agg(lambda x: x.mean())
all_date["tongbi_day"]
2.1选择同比和环比的均值 进行 权重添加
tongbi_day = all_date.groupby(["month","day"],as_index=False)["tongbi_day"].mean()
huanbi_day = all_date.groupby(["month","day"],as_index=False)["huanbi_day"].mean()
# 同比数据根据日期查询上一年的销售额
def tongbi_tianchogn(self, date_path):
# 添加同比
# 获取每天的同比和环比
date_huabi_tongbi = pd.read_csv(date_path)
# 获取最后测试集的数据
length = len(self.test_y)
self.date_length = self.date_month[-length:]
# 从一个csv的日期中查询另外一个csv相同日期的销售额 因为同比数据 是比较去年的 因此 查询的年份减一
date = self.date_length["date"].apply(lambda x: x.replace(str(x.split("-")[0]), str(int(x.split("-")[0]) - 1)))
# 获取上一年历史同期的销量
# 获取全部数据
all_csv = pd.read_csv(r"F:\server\ssh\xinfen_project\lstm_project\data\original\all_temp_day_sale.csv",
encoding="utf-8", index_col=False)
#将日期作为时间索引
all_csv.set_index("date", drop=True, inplace=True)
tongqi_date = all_csv.truncate(before=date.tolist()[0], after=date.tolist()[-1], axis=0)[
["order_money", "month", "day"]]
# 获取同比
topnbi_1 = pd.merge(date_huabi_tongbi, tongqi_date)
# 对于同比数据 有些增长比例太大, 去除增长比例过大的数据
tongbi_money = []
for i, j in zip(topnbi_1["order_money"], topnbi_1["tongbi_day"]):
if int(j) > 3:
a = str(j).split(".")[0]
b = str(j).split(".")[1]
j = float(str(1) + "." + "".join(b))
# print(j)
# print(i * j)
tongbi_money.append(i * j)
return tongbi_money
2.深度学习模型的缺点:
我们在采用LSTM,GRU等深度模型进行时间序列预测任务时,通常会采用滑动窗口策略,即将训练集和测试集划分为若干个滑动时间窗口,在每次训练迭代过程中,利用N个历史时间窗口的数据(x t − N , . . . , x t x_{t-N},...,x_tx t−N ,...,x t)去预测未来H个时间窗口的数据(x t + 1 , , . . . , x t + H x_{t+1},,...,x_{t+H}x t+1,,...,x t+H)。模型的整体损失函数为:未来H个时间窗口的数据真实值与预测值之间的均方根误差。
(1)时间序列预测属于一个经典的回归问题,目标函数是最小化t时刻真实值与预测值之间的误差。在训练回归模型的过程中,回归器会偷懒作弊,通过从输入到回归器的特征中选择最接近的值来确保其任务的安全。
假设我们需要预测t时刻的值。输入的历史时间窗口数据为:t-7到t-1的历史数据。回归算法会倾向于学习在t-1或t-2时刻处的值作为预测值,因为这样不需要做什么就可以达到优化的误差之内了。
因此,从整体来看将训练过程最大程度地减小误差(因为误差是预测的很多点的误差进行汇总),但是实际上该算法没有学习任何东西,它只是复制,因此除了完成优化任务外,它基本上什么也不做。
2.2构造更加丰富的时序特征。
还是上面的例子,在预测t时刻的时候,可以把其对应的前几天中历史观测数据的平均值 加入模型中,如果前几天也有类似的变化趋势,那么模型自然就“学习”到了。
举例说明:比如添加季节性特征,每天的销售额度,历史几天的平均销售额,天气季节对于水泥的影响,取均值,然后作为预测模型的特征。
将样本数据差分到平稳后再对差分后的数据进行预测。
序列的自相关性是造成预测趋势滞后的重要原因之一,而消除自相关性的办法就是进行差分运算,也就是我们可以将当前时刻与前一时刻的差值作为我们的回归目标。