基于加权移动平均的数据扩充办法(Python)

问题背景

在做分析建模时,经常会遇到样本稀少的情况,例如上市企业的财报数据,每个季度发布一次,如果一家企业到目前为止上市了三年,那它的实际样本数量也就12条,使用这种如此小数量级的样本量来进行建模会导致模型存在稳定性差、过拟合、泛化能力差等风险。所以有必要对样本进行扩充。

对样本进行扩充的方法比较多,譬如根据样本的实际分布使用相关模型进行数据模拟,或者使用Bootstrapping方法对样本进行有放回采样,又或者借鉴缺失值处理的方法对样本进行扩充,等等。在使用深度学习对图片数据集进行训练的时候,为了增加训练数据,常常会对图片做左右翻转、剪切、缩放、翻转等相关操作以扩充样本。

然而上述这些方法并不是任何场景都适用,还是以上市企业的财报预测为例。假设所预测的目标变量是上市企业的净营收,目标企业的上市时间为3年,那总共也就12个样本,且样本是随时间变化的序列,时间粒度为季度。此时使用上述方法进行样本扩充会存在很多的问题,譬如使用相关模型进行数据模拟,会让本来数量太少而不具代表性的样本加入更多的不确定因素,导致预测的失真;企业的净营收数据是一个时间序列,使用Bootstrapping进行有放回采样也不合理;想借助深度学习的例子进行样本扩充更是无从下手。

解决方法
或许可以换一种思路来进行样本扩充。原先样本的时间粒度为季度,是否可以将时间粒度缩小为天或者其他比季度小的时间粒度来进行样本扩充,同时保持数据不失真呢?答案是肯定的。

可以借鉴时间序列预测中的加权移动平均法的思想来对样本进行扩充。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


import pandas as pd
import datetime
import matplotlib.pyplot as plt

df_data = pd.read_excel('data.xlsx')
print(df_data)
vList = df_data['num'].to_list()
dateList = df_data['date'].to_list()

plt.figure()
plt.title('original data')
plt.plot(dateList, vList)
plt.show()

#  # dateList:季度列表。将季度表示为日期形式,取季度的最后一天表示该季度,如2015年第四季度表示为20151231。列表中的日期从小到大排序
#  # vList:净营收列表。对应季度列表排序。
after_date = []
after_num = []
for i in range(len(dateList)):
    if i < len(dateList) - 1:
        startDate = dateList[i]
        lastDate = dateList[i + 1]
        nDays = (lastDate - startDate).days
        print(nDays)

        for j in range(nDays):
            currentDate = startDate + datetime.timedelta(days=j)
            currentDayStr = currentDate.strftime('%Y%m%d')
            currentValue = ((nDays - j) / nDays) * vList[i] / nDays + (j / nDays) * vList[i + 1] / nDays
            print(currentDayStr + '\t' + str(round(currentValue, 6)))
            after_date.append(currentDayStr)
            after_num.append(round(currentValue, 6))

plt.figure()
plt.title('add data')
plt.plot(after_date, after_num)
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章