特征数据处理日期,和同比销量计算,构造丰富特征

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时刻的时候,可以把其对应的前几天中历史观测数据的平均值 加入模型中,如果前几天也有类似的变化趋势,那么模型自然就“学习”到了。
举例说明:比如添加季节性特征,每天的销售额度,历史几天的平均销售额,天气季节对于水泥的影响,取均值,然后作为预测模型的特征。

将样本数据差分到平稳后再对差分后的数据进行预测。
序列的自相关性是造成预测趋势滞后的重要原因之一,而消除自相关性的办法就是进行差分运算,也就是我们可以将当前时刻与前一时刻的差值作为我们的回归目标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值