您当前的位置:首页 >> 智慧农业
智慧农业

利用Python对销售额展开预测

发布时间:2025-08-05

言道锻炼验证分出。这里我们不会一夜之间接收者,因为在间隔时间序四支中都需是顺序的。

test_split=round(len(df)*0.20) df_for_training=df[:-1041] df_for_testing=df[-1041:] print(df_for_training.shape) print(df_for_testing.shape) (4162, 5) (1041, 5)

可以注意到接收者覆盖范围非常大,并且它们没有在各有不同的覆盖范围内图像,因此为了能避免得出错误,让我们再言道用作MinMaxScaler图像接收者。(也可以用作StandardScaler)

scaler = MinMaxScaler(feature_range=(0,1)) df_for_training_scaled = scaler.fit_transform(df_for_training) df_for_testing_scaled=scaler.transform(df_for_testing) df_for_training_scaled

将接收者分出为X和Y,这是最重要的外,正确写出每一个方法。

def createXY(dataset,n_past): dataX = [] dataY = [] for i in range(n_past, len(dataset)): dataX.append(dataset[i - n_past:i, 0:dataset.shape[1]]) dataY.append(dataset[i,0]) return np.array(dataX),np.array(dataY) trainX,trainY=createXY(df_for_training_scaled,30) testX,testY=createXY(df_for_testing_scaled,30)

让我们再来纸片的字符串中都做到了什么:

N_past是我们在得出下一个期望系天内时将在只不过概要信息的方法天内。

这里用作30,反之亦然将用作只不过的30个系天内(仅限于期望四支在内的所有特性)来得出第31个期望系天内。

因此,在trainX中都我们时会有所有的基本特征系天内,而在trainY中都我们只有期望系天内。

让我们分解for循环系统的每一外:

对于锻炼,dataset = df_for_training_scaled, n_past=30

当i= 30:

data_X.addend (df_for_training_scaled[i - n_past:i, 0:df_for_training.shape[1]])

从n_past开始的覆盖范围是30,所以第一次接收者覆盖范围将是-[30 - 30,30,0:5] 相当于 [0:30,0:5]

因此在dataX四支表中都,df_for_training_scaled[0:30,0:5]天内组将第一次出现。

今日, dataY.append(df_for_training_scaled[i,0])

i = 30,所以它将只取第30言道开始的open(因为在得出中都,我们只必需open四支,所以四支覆盖范围数为0,说明open四支)。

第一次在dataY四支表中都打印df_for_training_scaled[30,0]系天内。

所以包涵5四支的在此在此之后30言道打印在dataX中都,只有open四支的第31言道打印在dataY中都。然后我们将dataX和dataY四支表转换为天内组,它们以天内组PDF在LSTM中都顺利进言道锻炼。

我们来再来外形。

print("trainX Shape--- ",trainX.shape) print("trainY Shape--- ",trainY.shape) (4132, 30, 5) (4132,) print("testX Shape--- ",testX.shape) print("testY Shape--- ",testY.shape) (1011, 30, 5) (1011,)

4132 是 trainX 中都可用的天内组总天内,每个天内组共有 30 言道和 5 四支, 在每个天内组的 trainY 中都,我们都有下一个期望系天内来锻炼基本概念。

让我们看一下包涵来自 trainX 的 (30,5) 接收者的天内组之一 和 trainX 天内组的 trainY 系天内:

print("trainX[0]--- ",trainX[0]) print("trainY[0]--- ",trainY[0])

如果概要信息 trainX[1] 系天内,时会发现到它与 trainX[0] 中都的接收者各有不同(第一四支除外),因为我们将想到在此在此之后 30 个来得出第 31 四支,在第一次得出在此之后它时会自动伸展 到第 2 四支并放于一个 30 系天内来得出下一个期望系天内。

让我们用一种最简单的PDF来说明了这一切:

trainX — — →trainY [0 : 30,0:5] → [30,0] [1:31, 0:5] → [31,0] [2:32,0:5] →[32,0]

像这样,每个接收者都将完好在 trainX 和 trainY 中都。

今日让我们锻炼基本概念,我用作 girdsearchCV 顺利进言道一些激参天内调整以认出基础基本概念。

def build_model(optimizer): grid_model = Sequential() grid_model.add(LSTM(50,return_sequences=True,input_shape=(30,5))) grid_model.add(LSTM(50)) grid_model.add(Dropout(0.2)) grid_model.add(Dense(1)) grid_model.compile(loss = 'mse',optimizer = optimizer) return grid_modelgrid_model = KerasRegressor(build_fn=build_model,verbose=1,validation_data=(testX,testY)) parameters = {'batch_size' : [16,20], 'epochs' : [8,10], 'optimizer' : ['adam','Adadelta'] } grid_search = GridSearchCV(estimator = grid_model, param_grid = parameters, cv = 2)

如果你想为你的基本概念做到越来越多的激参天内调整,也可以附加越来越多的层。但是如果接收者集非常大建议增加 LSTM 基本概念中都的时期和基本单位。

在第一个 LSTM 层中都想到读取外形为 (30,5)。它来自 trainX 外形。

(trainX.shape[1],trainX.shape[2]) → (30,5)

今日让我们将基本概念拟合到 trainX 和 trainY 接收者中都。

grid_search = grid_search.fit(trainX,trainY)

由于顺利进言道了激参天内查询,所以这将必需一些间隔时间来调试。

你可以想到损失时会像这样减少:

今日让我们检验基本概念的最佳参天内。

grid_search.best_params_ {‘batch_size’: 20, ‘epochs’: 10, ‘optimizer’: ‘adam’}

将最佳基本概念完好在 my_model 变天内中都。

my_model=grid_search.best_estimator_.model

今日可以用验证接收者集验证基本概念。

prediction=my_model.predict(testX) print("prediction", prediction) print("Prediction Shape-",prediction.shape)

testY 和 prediction 的较宽是一样的。今日可以将 testY 与得出顺利进言道尤其。

但是我们一开始就对接收者顺利进言道了图像,所以首再言道我们需做到一些后下图像方法。

scaler.inverse_transform(prediction)

报错了,这是因为在图像接收者时,我们每言道有 5 四支,今日我们只有 1 四支是期望四支。

所以我们需彻底改变外形来用作 inverse_transform:

prediction_copies_array = np.repeat(prediction,5, axis=-1)

5 四支系天内是雷同的,它只是将单个得出四支复制了 4 次。所以今日我们有 5 四支各有不同的系天内 。

prediction_copies_array.shape (1011,5)

这样就可以用作 inverse_transform 函天内。

pred=scaler.inverse_transform(np.reshape(prediction_copies_array,(len(prediction),5)))[:,0]

但是后下变换后的第一四支是我们必需的,所以我们在之在此在此之后用作了 → [:,0]。

今日将这个 pred 系天内与 testY 顺利进言道尤其,但是 testY 也是按比例图像的,也必需用作与上述各有不同的字符串顺利进言道后下变换。

original_copies_array = np.repeat(testY,5, axis=-1) original=scaler.inverse_transform(np.reshape(original_copies_array,(len(testY),5)))[:,0]

今日让我们看一下得出系天内和原始系天内:

print("Pred Values--- " ,pred) print("Original Values--- " ,original)

之在此在此之后画一个图来对比我们的 pred 和原始接收者。

plt.plot(original, color = 'red', label = 'Real Stock Price') plt.plot(pred, color = 'blue', label = 'Predicted Stock Price') plt.title('Stock Price Prediction') plt.xlabel('Time') plt.ylabel('Google Stock Price') plt.legend() plt.show()

看样子还不错,到目在此在此之后为止,我们锻炼了基本概念并用验证系天内检验了该基本概念。今日让我们得出一些预见系天内。

从主 df 接收者分散都获取我们在开始时加载的之在此在此之后 30 个系天内[为什么是 30?因为这是我们想要的只不过系天内的天内量,来得出第 31 个系天内]

df_30_days_past=df.iloc[-30:,:] df_30_days_past.tail()

可以想到有仅限于期望四支(“Open”)在内的所有四支。今日让我们得出预见的 30 个系天内。

在多元间隔时间序四支得出中都,必需通过用作各有不同的基本特征来得出单四支,所以在顺利进言道得出时我们必需用作基本特征系天内(期望四支除外)来顺利进言道刚到来的得出。

这里我们必需“High”、“Low”、“Close”、“Adj Close”四支的刚到来的 30 个系天内来对“Open”四支顺利进言道得出。

df_30_days_future=pd.read_csv("test.csv",parse_dates=["Date"],index_col=[0]) df_30_days_future

剔除“Open”四支后,用作基本概念顺利进言道得出之在此在此之后还必需做到请注意的操作方法:

图像接收者,因为写入了‘Open’四支,在图像它之在此在此之后,附加一个所有系天内都为“0”的Open四支。

图像后,将预见接收者中都的“Open”四支系天内移除为“nan”

今日附加 30 天旧系天内和 30 天新系天内(其中都之在此在此之后 30 个“打开”系天内是 nan)

df_30_days_future["Open"]=0 df_30_days_future=df_30_days_future[["Open","High","Low","Close","Adj Close"]] old_scaled_array=scaler.transform(df_30_days_past) new_scaled_array=scaler.transform(df_30_days_future) new_scaled_df=pd.DataFrame(new_scaled_array) new_scaled_df.iloc[:,0]=np.nan full_df=pd.concat([pd.DataFrame(old_scaled_array),new_scaled_df]).reset_index().drop(["index"],axis=1)

full_df 外形是 (60,5),之在此在此之后第一四支有 30 个 nan 系天内。

要顺利进言道得出需最终用作 for 循环系统,我们在分出 trainX 和 trainY 中都的接收者时所做到的。但是这次我们只有 X,没有 Y 系天内。

full_df_scaled_array=full_df.values all_data=[] time_step=30 for i in range(time_step,len(full_df_scaled_array)): data_x=[] data_x.append( full_df_scaled_array[i-time_step :i , 0:full_df_scaled_array.shape[1]]) data_x=np.array(data_x) prediction=my_model.predict(data_x) all_data.append(prediction) full_df.iloc[i,0]=prediction

对于第一个得出,有之在此在此之后的 30 个系天内,当 for 循环系统第一次调试时它时会检验在此在此之后 30 个系天内并得出第 31 个“Open”接收者。

当第二个 for 循环系统将无论如何调试时,它将会有注脚并无论如何获放于 30 个系天内 [1:31] 。这里时会报错错误因为Open四支之在此在此之后一言道是 “nan”,所以必需每次都用得出移除“nan”。

之在此在此之后还必需对得出顺利进言道后下变换:

new_array=np.array(all_data) new_array=new_array.reshape(-1,1) prediction_copies_array = np.repeat(new_array,5, axis=-1) y_pred_future_30_days = scaler.inverse_transform(np.reshape(prediction_copies_array,(len(new_array),5)))[:,0] print(y_pred_future_30_days)

这样一个值得注意的流程就已经跑通了。

如果你想看值得注意的字符串,可以在这里概要信息:

作者:Sksujanislam

来源:DeepHub IMBA [道歉信]本文版权归原作者所有,内容为作者个人观点,转载借以在于传递越来越多接收者,如涉及创作内容、版权等问题,可联系本站写入,谢谢。。

郑州哪的癫痫医院好
济南白癜风医院哪家比较专业
上海看男科去哪里好

上一篇: 北音公开课干货电视片!(1)

下一篇: 努比亚Z40 Pro今日新鸿基,中兴邀吴京代言后子品牌旗舰率先上阵

友情链接