《現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)》 課件 楊超林 第1-9章 現(xiàn)代庫存管理概述-安全庫存優(yōu)化_第1頁
《現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)》 課件 楊超林 第1-9章 現(xiàn)代庫存管理概述-安全庫存優(yōu)化_第2頁
《現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)》 課件 楊超林 第1-9章 現(xiàn)代庫存管理概述-安全庫存優(yōu)化_第3頁
《現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)》 課件 楊超林 第1-9章 現(xiàn)代庫存管理概述-安全庫存優(yōu)化_第4頁
《現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)》 課件 楊超林 第1-9章 現(xiàn)代庫存管理概述-安全庫存優(yōu)化_第5頁
已閱讀5頁,還剩274頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)第1章現(xiàn)代庫存管理概述1.1什么是庫存庫存是指為了使生產(chǎn)正常且不間斷的開展或?yàn)榱烁蛹皶r地滿足顧客的需求,在各個生產(chǎn)階段或分銷環(huán)節(jié)之間設(shè)置的物品儲備庫存是供應(yīng)鏈的六大功能模塊之一,在促進(jìn)企業(yè)降本增效、供需匹配中發(fā)揮關(guān)鍵作用對于企業(yè)來說,庫存是一項(xiàng)流動資產(chǎn),會給投資帶來相應(yīng)的回報庫存的四方面功能:供需匹配:持有安全庫存應(yīng)對不確定性規(guī)模效應(yīng):促使企業(yè)批量補(bǔ)貨來降低補(bǔ)貨的成本快速履約:持有更多的庫存,庫存分散前置庫存分離:供應(yīng)鏈網(wǎng)絡(luò)一定程度的解耦1.2庫存管理解決的問題通過適量的庫存,實(shí)現(xiàn)超儲與缺貨之間的最佳或最經(jīng)濟(jì)合理的平衡,是庫存管理的核心目標(biāo)企業(yè)的存貨不足,可能會造成供貨不及時,供應(yīng)鏈斷裂、喪失交易機(jī)會或市場占有率商品庫存會產(chǎn)生一定的持貨成本,同時存在由于商品擠壓或者損壞而產(chǎn)生的庫存風(fēng)險因此,在庫存管理中,既要保持合理的庫存數(shù)量,防止缺貨、實(shí)現(xiàn)一定的規(guī)模效應(yīng),同時又要避免庫存過量,發(fā)生不必要的庫存費(fèi)用1.2庫存管理解決的問題以簡單兩級分銷網(wǎng)絡(luò)為例,中央倉從供應(yīng)商補(bǔ)貨,然后為下游的區(qū)域倉供應(yīng)庫存,每個區(qū)域倉對相應(yīng)區(qū)域的顧客需求進(jìn)行履約1.3現(xiàn)代庫存管理的挑戰(zhàn)在具體業(yè)務(wù)場景下,實(shí)際因素使得庫存管理目標(biāo)的實(shí)現(xiàn)更具挑戰(zhàn)庫存管理場景的多樣化啤酒飲料行業(yè):重量大、體積大、貨值低的重泡貨售賣鮮食的零售商超、餐飲門店:保質(zhì)期較短消費(fèi)電子行業(yè)代工廠:采用訂單生產(chǎn)模式危險化學(xué)品的補(bǔ)貨過程:特殊運(yùn)輸策略,保障安全運(yùn)輸需求來源的多樣化與庫存網(wǎng)絡(luò)的復(fù)雜性零售企業(yè)線上線下全渠道融合,企業(yè)面臨的訂單來源多樣化為了快速滿足全渠道的需求,企業(yè)庫存供應(yīng)網(wǎng)絡(luò)的結(jié)構(gòu)日漸復(fù)雜1.3現(xiàn)代庫存管理的挑戰(zhàn)需求與供應(yīng)不確定性高企業(yè)促銷手段層出不窮在售的商品種類繁多,很大一部分是長尾品疫情的反復(fù)變化消費(fèi)者對缺貨的容忍度降低消費(fèi)者的轉(zhuǎn)移成本降低,粘性變?nèi)?,消費(fèi)者缺乏耐?1.4

現(xiàn)代庫存管理的發(fā)展趨勢在消費(fèi)、產(chǎn)業(yè)升級和技術(shù)變革的作用之下,庫存網(wǎng)絡(luò)逐步發(fā)展為依賴人工智能、機(jī)器學(xué)習(xí)、云計算等新興技術(shù)的數(shù)字化矩陣式庫存網(wǎng)絡(luò),呈現(xiàn)出以下幾點(diǎn)發(fā)展趨勢:庫存網(wǎng)絡(luò)扁平化代理商的去中間化庫存設(shè)置點(diǎn)前移布局前置倉,提升用戶體驗(yàn)物流配送格局逐漸轉(zhuǎn)變?yōu)殡娚唐脚_+前置倉+即時物流(或消費(fèi)者)1.4

現(xiàn)代庫存管理的發(fā)展趨勢數(shù)字化建設(shè)互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等新一代信息技術(shù)和現(xiàn)代化管理理念方法作為基礎(chǔ)以價值創(chuàng)造為導(dǎo)向、以數(shù)據(jù)為驅(qū)動,對供應(yīng)鏈活動進(jìn)行整體規(guī)劃設(shè)計與運(yùn)作1.5現(xiàn)代庫存管理優(yōu)化案例近年來,國內(nèi)涌現(xiàn)出了像杉數(shù)科技(北京)有限公司(簡稱杉數(shù)科技)這樣為數(shù)字化轉(zhuǎn)型的企業(yè)提供智慧供應(yīng)鏈解決方案的公司接下來介紹杉數(shù)科技的兩個庫存管理優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例背景介紹企業(yè)B是目前全球頂級的食品制造商除了線下門店,公司布局了多個線上渠道、供應(yīng)中心和工廠全渠道履約網(wǎng)絡(luò)零售企業(yè)全渠道庫存優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例面臨的問題針對需求特性不一的渠道,如何實(shí)現(xiàn)智能預(yù)測并提高履約能力隨著每年產(chǎn)品數(shù)量的增加,以及各類產(chǎn)品繁復(fù)的市場特征,庫存缺貨和冗余現(xiàn)象頻繁發(fā)生,導(dǎo)致庫存成本持續(xù)增加解決方案根據(jù)渠道特性定制需求預(yù)測算法模型,為企業(yè)量身打造了新一代電商智能計劃系統(tǒng)可視化展示系統(tǒng)儲存的數(shù)據(jù)信息實(shí)現(xiàn)全渠道需求的預(yù)測和計劃制定提供算法輸出參考以及批量編輯功能幫助用戶提高計劃效率采用插件式的設(shè)計架構(gòu),可以基于場景定制更新算法包方案落地后,測試商品的月需求預(yù)測準(zhǔn)確率提升了約6%,助力企業(yè)供應(yīng)鏈智能化轉(zhuǎn)型升級1.5現(xiàn)代庫存管理優(yōu)化案例背景介紹H公司是全球領(lǐng)先的信息與通信基礎(chǔ)設(shè)施和智能終端提供商生產(chǎn)制造網(wǎng)絡(luò)中包含數(shù)十萬個節(jié)點(diǎn),數(shù)百萬條邊,存在大量共享組件及可替代原材料過去的安全庫存策略流程煩瑣,成品交付滿足率較低,也沒有深度挖掘全網(wǎng)絡(luò)安全庫存共享的價值面臨的問題安全庫存是庫存管理中應(yīng)對需求不確定性的有效工具,如何在規(guī)模龐大的復(fù)雜制造網(wǎng)絡(luò)上設(shè)置安全庫存,在提升終端產(chǎn)品的服務(wù)水平的同時最小化系統(tǒng)總安全庫存成本如何對整個制造網(wǎng)絡(luò)上的安全庫存進(jìn)行全局優(yōu)化,有效地刻畫需求不確定性、全局優(yōu)化安全庫存布局、平衡成本與滿足率的情況下優(yōu)化安全庫存量、同時保證求解效率復(fù)雜制造網(wǎng)絡(luò)安全庫存優(yōu)化案例1.5現(xiàn)代庫存管理優(yōu)化案例打造了一套自動化、智能化的網(wǎng)絡(luò)安全庫存優(yōu)化解決方案解決方案現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)第2章需求預(yù)測基礎(chǔ)2.1需求預(yù)測的基本結(jié)構(gòu)一般認(rèn)為需求的實(shí)現(xiàn)值由兩部分構(gòu)成:可預(yù)測的需求模式:這部分由商品特征、經(jīng)濟(jì)規(guī)律等客觀規(guī)律決定不可預(yù)測的隨機(jī)因素:由一些難以刻畫的顧客購買行為和隨機(jī)影響導(dǎo)致

2.1需求預(yù)測的基本結(jié)構(gòu)

2.1需求預(yù)測的基本結(jié)構(gòu)產(chǎn)品的需求模式同時受到內(nèi)在規(guī)律和外生因素的影響內(nèi)在規(guī)律可以進(jìn)一步分解為趨勢性、季節(jié)性這兩種共通的需求變動規(guī)律和產(chǎn)品本身決定的需求特性,由產(chǎn)品本身的性質(zhì)決定外生影響的來源則非常廣泛,往往需要針對具體的產(chǎn)品進(jìn)行具體分析和刻畫2.2需求預(yù)測方法的分類時間序列方法

宏觀趨勢

2.2需求預(yù)測方法的分類時間序列方法在使用時間序列模型時,最重要的是理解模型采用了哪一種分解模型,以及刻畫的是序列中的哪一部分

宏觀因素微觀因素

趨勢性季節(jié)性一元多元簡單指數(shù)平滑√√

Holt-Winters√√

ARIMA

sARIMA

√√

VARMA

√sVARMA

√HTS

√prophet√√√

2.2需求預(yù)測方法的分類機(jī)器學(xué)習(xí)方法特點(diǎn)優(yōu)勢劣勢線性模型簡單的線性回歸形式,可以通過正則化項(xiàng)演化為LASSO或Ridge模型形式簡單只能擬合線性關(guān)系CART樹基于二分樹的結(jié)構(gòu)構(gòu)建,是后續(xù)許多集成方法的基礎(chǔ)結(jié)構(gòu)簡單,擬合能力強(qiáng)大對數(shù)據(jù)敏感,容易過擬合神經(jīng)網(wǎng)絡(luò)由線性變換、非線性激活函數(shù)和網(wǎng)絡(luò)結(jié)構(gòu)組成多層網(wǎng)絡(luò)理論上可以以任意精度逼近任意函數(shù),具有強(qiáng)大的擬合能力網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜,模型參數(shù)較多,容易調(diào)試不當(dāng)或過擬合隨機(jī)森林以并行的決策樹為基礎(chǔ)模型,通過簡單加權(quán)集成最終結(jié)果相比決策樹更加穩(wěn)健,可以并行運(yùn)算,計算速度快相比于GBDT集成方法效果較差XGBoost以決策樹為基礎(chǔ)模型,不斷強(qiáng)化對殘差的學(xué)習(xí)基于GBDT思想改進(jìn),能在實(shí)現(xiàn)較好模型效果同時以較快的速度完成運(yùn)算對于較大的數(shù)據(jù)運(yùn)行較慢;參數(shù)設(shè)置復(fù)雜,容易過擬合lightGBM以決策樹為基礎(chǔ)模型,不斷強(qiáng)化對殘差的學(xué)習(xí)在海量數(shù)據(jù)的場景下,能夠以較小的內(nèi)存和較快的速度完成計算參數(shù)設(shè)置復(fù)雜,容易過擬合Stacking以多種預(yù)測模型為基礎(chǔ)模型,通過機(jī)器學(xué)習(xí)模型集成最終結(jié)果模型形式簡單,效果強(qiáng)大,能夠集成不同模型的優(yōu)勢,包容性強(qiáng)容易過擬合2.2需求預(yù)測方法的分類比較和總結(jié)機(jī)器學(xué)習(xí)方法是數(shù)據(jù)驅(qū)動的,時間序列方法是模型驅(qū)動的機(jī)器學(xué)習(xí)模型的效果受到特征選擇、模型選擇、參數(shù)選擇等諸多因素的影響,實(shí)際運(yùn)用效果還要取決于業(yè)務(wù)場景、數(shù)據(jù)性質(zhì)和模型調(diào)試等諸多方面由于強(qiáng)大的擬合能力,在一個數(shù)據(jù)規(guī)模相對較小或是內(nèi)在規(guī)律簡單的數(shù)據(jù)集上,機(jī)器學(xué)習(xí)很容易過度擬合隨機(jī)擾動因素,從而導(dǎo)致較差的泛化能力;而時間序列則能夠集中于把握宏觀趨勢,較好地剔除隨機(jī)擾動的偶然影響機(jī)器學(xué)習(xí)得到的結(jié)果往往較難得到直觀理解,解釋力較弱,較難結(jié)合已有經(jīng)驗(yàn)進(jìn)行輔助判斷和調(diào)整;時間序列模型具有簡單清晰的模型結(jié)構(gòu),非常便于使用、解讀和調(diào)整2.3數(shù)據(jù)預(yù)處理在進(jìn)行需求預(yù)測之前,通常要對數(shù)據(jù)進(jìn)行預(yù)處理及分析。盡管不同企業(yè)的業(yè)務(wù)場景與產(chǎn)品的需求規(guī)律不同,但數(shù)據(jù)處理的步驟與方法是類似的本節(jié)以食品飲料快消品公司W(wǎng)2018年1月1日~2020年7月30日77個產(chǎn)品在18個分銷中心(distributioncenter,DC)的銷售數(shù)據(jù)為對象一般而言,盡管原始數(shù)據(jù)的具體格式不盡相同,需求預(yù)測任務(wù)的數(shù)據(jù)集至少包含以下信息:

商品名,有時存在品類信息,構(gòu)成兩級及以上的產(chǎn)品類別層級結(jié)構(gòu)銷售地點(diǎn),有時存在國家/區(qū)域—城市—終端銷售點(diǎn)的地理層級結(jié)構(gòu)時間,一般以日為顆粒度實(shí)際銷量首先,從數(shù)據(jù)文件夾讀入銷售數(shù)據(jù)表格,并查看表格前十行,以獲得對數(shù)據(jù)結(jié)構(gòu)的基本了解注意數(shù)據(jù)路徑的設(shè)置,相比于將文件地址作為一個完整字段,單獨(dú)指定文件夾路徑和表格名稱更具靈活性,更適用于具有較多數(shù)據(jù)表格需要管理以及可能存在數(shù)據(jù)遷移的場景2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作importpandasaspd

data_dir=

'../../data/forecast_data/'

sales_data=pd.read_csv(data_dir+

'sales_data.csv')

print(sales_data.head(10))2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作可以看到,本節(jié)所使用的數(shù)據(jù)集恰好對應(yīng)了需求預(yù)測任務(wù)的四個基本元素,并通過dc_id和sku_id組合成unit_id,從而標(biāo)識更細(xì)致的顆粒度

datedc_idsku_idunit_idsale

02018-05-01DC001SKU024DC001_SKU0240

12018-05-01DC001SKU070DC001_SKU0700

22018-05-01DC001SKU078DC001_SKU0789

32018-05-01DC001SKU044DC001_SKU044589

42018-05-01DC001SKU051DC001_SKU05143

52018-05-01DC001SKU063DC001_SKU0632751

62018-05-01DC001SKU099DC001_SKU09996

72018-05-01DC001SKU100DC001_SKU100200

82018-05-01DC001SKU101DC001_SKU10142

92018-05-01DC001SKU102DC001_SKU102102.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

數(shù)據(jù)類型轉(zhuǎn)換時間數(shù)據(jù)在csv等文件中常以字符串形式儲存,對這種格式的數(shù)據(jù)無法使用一些針對時間戳格式的便捷操作。因此,在讀入帶有時間的數(shù)據(jù)時,往往需要確認(rèn)時間數(shù)據(jù)類型并進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換sales_data['date']=pd.to_datetime(sales_data['date'])2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

數(shù)據(jù)整理當(dāng)拿到的原始數(shù)據(jù)的排列并不按照商品、DC和時間順序進(jìn)行排列時,我們并不知道數(shù)據(jù)從何時開始、到何時結(jié)束,也不知道究竟有多少種商品和DC。所以接下來我們進(jìn)行對表格的排序、時間范圍的識別、商品種類和DC個數(shù)的統(tǒng)計工作表格的排序#排序

sales_data=sales_data.sort_values(

by=['dc_id','sku_id','date']).reset_index(drop=True)

print(sales_data.head())

datedc_idsku_idunit_idsale

02018-02-02DC001SKU001DC001_SKU0017

12018-02-03DC001SKU001DC001_SKU0010

22018-02-04DC001SKU001DC001_SKU0010

32018-02-05DC001SKU001DC001_SKU0012

42018-02-06DC001SKU001DC001_SKU0010時間范圍的識別商品種類及DC個數(shù)的統(tǒng)計2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

#商品種類和DC個數(shù)統(tǒng)計

all_sku_list=sales_data['sku_id'].unique().tolist()

print(f'商品個數(shù)為:{len(all_sku_list)}')

all_dc_list=sales_data['dc_id'].unique().tolist()

print(f'DC個數(shù)為:{len(all_dc_list)}')#時間范圍的識別

print(f'數(shù)據(jù)起始時間為:{sales_data["date"].min()}')

print(f'數(shù)據(jù)結(jié)束時間為:{sales_data["date"].max()}')數(shù)據(jù)起始時間為:2018-01-0100:00:00

數(shù)據(jù)結(jié)束時間為:2020-07-3000:00:00

商品個數(shù)為:77

DC個數(shù)為:182.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

部分?jǐn)?shù)據(jù)篩選上述數(shù)據(jù)表格包含了所擁有的全部信息,但當(dāng)我們僅需要其中部分信息時,可以將這部分?jǐn)?shù)據(jù)存放到一個新的數(shù)據(jù)表中,便于之后取用unit_id=

'DC001_SKU044'

unit_df=sales_data[sales_data['unit_id']==unit_id]

print(unit_df.head())

datedc_idsku_idunit_idsale

212282018-01-01DC001SKU044DC001_SKU04479

212292018-01-02DC001SKU044DC001_SKU044492

212302018-01-03DC001SKU044DC001_SKU0441261

212312018-01-04DC001SKU044DC001_SKU0441067

212322018-01-05DC001SKU044DC001_SKU0445352.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

描述性統(tǒng)計pandas自帶的數(shù)據(jù)分析函數(shù)describe()可以自動統(tǒng)計數(shù)值型數(shù)據(jù)的均值方差等信息,也可以自動統(tǒng)計非數(shù)值型數(shù)據(jù)的個數(shù)、唯一值數(shù)量、最高頻率等信息print(unit_df['sale'].describe())count940.000000

mean1199.408511

std913.354405

min0.000000

25%628.000000

50%1106.000000

75%1661.750000

max7777.000000

Name:sale,dtype:float642.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

數(shù)據(jù)聚合對于非時間類型的類別信息,我們一般可以通過groupby方法,將原始數(shù)據(jù)按照某一類進(jìn)行聚合下面的代碼展示了將原始的銷售數(shù)據(jù)按照商品進(jìn)行聚合,統(tǒng)計每一類產(chǎn)品的日度銷售情況,并按照日期和商品類別進(jìn)行排序print(sales_data.groupby(['sku_id','date'])['sale']\

.agg(['sum','mean','median','std'])\

.sort_values(by=['date','sku_id']).reset_index()[:5])2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作

數(shù)據(jù)聚合由于日度銷量往往波動性較高,有時需要將原始的日銷量數(shù)據(jù)聚合為一段時間內(nèi)的總銷量數(shù)據(jù),例如周銷量、月銷量等可以通過resample方法實(shí)現(xiàn),下列代碼展示了我們?nèi)绾螌⒃紨?shù)據(jù)聚合得到每個unit的周銷量數(shù)據(jù)weekly_sales_df=sales_data.groupby('unit_id')[['date','sale']]\

.resample('W',on='date').sum().reset_index()

print(weekly_sales_df.head())2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作缺失值處理由于對于真實(shí)數(shù)據(jù),往往需要考察其完整性,并對缺失值做出一定的處理一般地,我們需要針對每個商品單元考察記錄完整性,即每個商品標(biāo)識下的數(shù)據(jù)是否完整覆蓋了數(shù)據(jù)集時間對于缺失數(shù)據(jù),不同的成因?qū)?yīng)了不同的解決方式這可能是正常的商業(yè)現(xiàn)象,即某天的銷售量為零,對此我們可以用0填充缺失數(shù)據(jù);這可能是數(shù)據(jù)遺失導(dǎo)致的,缺失部分存在銷售,但銷量并未被記錄,此時可以用插值的方式進(jìn)行填充也可能是因?yàn)楫a(chǎn)品上市和銷售時間不一致,某些新品、促銷品、季節(jié)品本身在市時間就較短,此時可以選擇將這些產(chǎn)品與常規(guī)品區(qū)別開,單獨(dú)構(gòu)建模型,或者通過定性分析的方式單獨(dú)進(jìn)行分析和處理2.3數(shù)據(jù)預(yù)處理數(shù)據(jù)導(dǎo)入及基礎(chǔ)操作數(shù)據(jù)輸出在完成上述的基本數(shù)據(jù)整理工作后,我們可以將得到的新數(shù)據(jù)表格輸出,在后續(xù)進(jìn)行深入分析和模型構(gòu)建時,可以直接讀取整理好的結(jié)果,從而避免重復(fù)的數(shù)據(jù)預(yù)處理工作weekly_sales_df.to_csv(data_dir+

'weekly_sales_data.csv',index=False)2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化導(dǎo)入Python中常用的可視化工具包,matplotlib和seaborn,并統(tǒng)一繪圖格式代碼示例#導(dǎo)入繪圖包

importmatplotlib.pyplotasplt

importseabornassns

#設(shè)置畫圖風(fēng)格

sns.set_theme(style='darkgrid')

#設(shè)置畫布大小

plt.rcParams['figure.figsize']=(12.0,6.0)

#設(shè)置清晰度

plt.rcParams['figure.dpi']=

500#導(dǎo)入繪圖包

importmatplotlib.pyplotasplt

importseabornassns

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化(接上頁)#設(shè)置畫圖風(fēng)格

sns.set_theme(style='darkgrid')

importmatplotlib

matplotlib.rc('font',family='SongtiSC')

parameters={'figure.figsize':[12.0,6.0],

'figure.dpi':500,

'axes.labelsize':14,

'xtick.labelsize':14,

'ytick.labelsize':14,

'legend.fontsize':14,

'font.weight':'bold'

}

plt.rcParams.update(parameters)2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化下列代碼定義了針對某一個產(chǎn)品銷量的季節(jié)性繪制函數(shù),通過將不同年份的數(shù)據(jù)疊加,可以更直觀地看到不同年份間是否存在相似的季節(jié)性變動

#季節(jié)性繪制函數(shù)

defplot_year_seasonality(data,date_col,qty_col):

"""

data:pd.DataFrame格式數(shù)據(jù)

date_col:data中標(biāo)識日期的列名,需轉(zhuǎn)換為日期格式

qty_col:data中標(biāo)識銷量的列名

"""

#以1-12月設(shè)置橫坐標(biāo)

month_all_list=list(range(1,12

+

1))

plt.xticks(range(len(month_all_list)),month_all_list,rotation=60)

#設(shè)置曲線顏色和曲線標(biāo)識

color=['#787878','#1c79d9','black']

marker=['o','^','s']

#初始化標(biāo)簽列表

legend_list=[]

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化color=['#787878','#1c79d9','black']

marker=['o','^','s']

#初始化標(biāo)簽列表

legend_list=[]

#將傳入數(shù)據(jù)按照月份聚合

data=data.resample('M',on=date_col).agg({qty_col:'sum'})

#提取數(shù)據(jù)涉及年份,并逐年遍歷

plot_year=list(set(data.index.year))

color_idx=

0

foryearinplot_year:

#提取當(dāng)年所有數(shù)據(jù),以月份為橫坐標(biāo),月總銷量為縱坐標(biāo)繪制折線圖

data_year=data[data.index.year==year]

data_inds=data_year.index.month

data_val=data_year[qty_col]

plt.plot(data_inds-

1,data_val,c=color[color_idx],

marker=marker[color_idx])

#為曲線添加標(biāo)簽

legend_list.append(year)

#動態(tài)改變下一次繪圖曲線顏色

color_idx+=

1

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化

#展示繪制圖像

plt.xlabel('月份')

plt.ylabel('銷量')

plt.legend(legend_list,loc='upperright')

plt.show()

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化分別考察’SKU044’和’SKU008’在’DC001’的銷量季節(jié)性??梢园l(fā)現(xiàn),’SKU044’的銷量季節(jié)性并不明顯,相比之下’SKU008’則呈現(xiàn)出一定的季節(jié)規(guī)律:在3-7月呈現(xiàn)出銷量上升的共同趨勢,在9月~次年2月呈現(xiàn)出銷量下降的共同趨勢2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化下列代碼定義了針對某一個產(chǎn)品銷量的趨勢性繪制函數(shù),利用產(chǎn)品的月銷量數(shù)據(jù)繪制折線圖,來直觀地考察其上升下降趨勢#趨勢性繪制函數(shù)

defplot_trend(data,date_col,qty_col):

data=data.resample('M',on=date_col).sum()

plt.plot(data['sale'],color='#1c79d9',marker='o')

plt.xlabel('時間')

plt.ylabel('銷量')

plt.show()

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化選擇’DC001_SKU044’和’DC017_SKU002’兩個unit分別繪制其趨勢圖像。可以看到,前者呈現(xiàn)出一定的上升趨勢,同時疊加了一定的季節(jié)性波動;而后者則出現(xiàn)了較為明顯的下降趨勢。在針對這兩個unit進(jìn)行需求預(yù)測時,為了獲得更好的預(yù)測效果,需要將產(chǎn)品的趨勢性納入模型考慮2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化當(dāng)一個商品在多個地區(qū)進(jìn)行銷售時,其在各區(qū)域之間的需求可能存在一定的相關(guān)性,這是由商品屬性決定的共同趨勢。同時,不同產(chǎn)品之間也可能存在相互關(guān)聯(lián)不管是在模型構(gòu)建還是特征構(gòu)建中,我們都可以將相關(guān)因素納入其中,以提升預(yù)測模型的準(zhǔn)確性這一操作在經(jīng)過格式轉(zhuǎn)換的數(shù)據(jù)上可以通過調(diào)用內(nèi)置函數(shù)corr()實(shí)現(xiàn),同時,也可以通過繪制熱力圖,更直觀地觀察相關(guān)性sku_df=sales_data[sales_data[‘sku_id’]==

‘SKU076’]

corr=sku_df[[‘date’,‘dc_id’,‘sale‘]]\

.pivot(index='date',columns='dc_id',values='sale').corr()

sns.heatmap(corr,annot=True,cmap="Blues")<AxesSubplot:xlabel='dc_id',ylabel='dc_id'>

2.3數(shù)據(jù)預(yù)處理時序數(shù)據(jù)可視化熱力圖解讀可以通過圖中標(biāo)注出的相關(guān)系數(shù)考察變量相關(guān)性,相關(guān)系數(shù)的取值范圍在-1到1之間,越接近于1表明正相關(guān)程度越高,越接近于-1表明負(fù)相關(guān)程度越高,越接近于0表明相關(guān)性越弱也可以結(jié)合圖例,從色塊顏色直觀地考察變量之間的相關(guān)性2.3數(shù)據(jù)預(yù)處理異常點(diǎn)檢驗(yàn)

2.3數(shù)據(jù)預(yù)處理異常點(diǎn)檢驗(yàn)下面兩個函數(shù)定義了上述兩種異常值檢測方法,輸入DataFrame格式的數(shù)據(jù)并指定要考察異常值的數(shù)據(jù)列名,函數(shù)便會返回離群值的標(biāo)識defsigma_outlier(data,qty_col):

upper=data[qty_col].mean()+

3

*data[qty_col].std()

lower=data[qty_col].mean()-

3

*data[qty_col].std()

returndata[

(data[qty_col]>upper)|(data[qty_col]<lower)].index.tolist()defquantile_outlier(data,qty_col):

q1=data[qty_col].quantile(q=0.25)

q3=data[qty_col].quantile(q=0.75)

upper=q3+

1.5

*(q3-q1)

lower=q1-

1.5

*(q3-q1)

returndata[(data[qty_col]>upper)|(data[qty_col]<lower)].index

2.4評價預(yù)測模型的方法在預(yù)測任務(wù)中,兩組不同的預(yù)測結(jié)果何者更好,往往并不直觀。在某些數(shù)據(jù)集上一種方法可能比另一種方法的預(yù)測結(jié)果更接近真實(shí)值,而在其他數(shù)據(jù)集上則可能反之因此,我們需要一套規(guī)范化的指標(biāo)對預(yù)測結(jié)果進(jìn)行評估,以便選擇最合適的預(yù)測方法2.4評價預(yù)測模型的方法樣本內(nèi)外誤差數(shù)據(jù)泄露(dataleakage):其實(shí)質(zhì)是進(jìn)行模型評估的數(shù)據(jù)同時被用于模型訓(xùn)練,為了更好地預(yù)測未來值,而不是最優(yōu)擬合歷史數(shù)據(jù),所以需要避免數(shù)據(jù)泄露模型在已知數(shù)據(jù)集上表現(xiàn)優(yōu)于在未知數(shù)據(jù)集上表現(xiàn)的現(xiàn)象,被稱為過擬合,這樣的模型被稱為泛化能力差。這種現(xiàn)象是預(yù)測中常常會遇到的,需要盡力避免進(jìn)行模型訓(xùn)練和模型評估所用的數(shù)據(jù)集應(yīng)該沒有交集,以避免因數(shù)據(jù)泄露導(dǎo)致的對模型的不公允評估與選擇2.4評價預(yù)測模型的方法樣本內(nèi)外誤差在實(shí)踐中,將數(shù)據(jù)集按照一定的比例切分為訓(xùn)練集(即用于模型訓(xùn)練的數(shù)據(jù))和測試集(即用于模型評估的數(shù)據(jù))在和時間順序無關(guān)的數(shù)據(jù)集中,一般隨機(jī)選擇數(shù)據(jù)劃分為這兩個集合,以保證兩個集合具有類似的數(shù)據(jù)結(jié)構(gòu)在時序場景下,需要遵循數(shù)據(jù)集的時間屬性,將靠前的數(shù)據(jù)劃分為訓(xùn)練集,靠后的數(shù)據(jù)劃分為測試集。在進(jìn)行切分的時候,也不再按照比例的方式?jīng)Q定兩個數(shù)據(jù)集合的大小,而是根據(jù)一個指定的時間,對數(shù)據(jù)進(jìn)行前后切分模型在訓(xùn)練集上給出的預(yù)測結(jié)果與真實(shí)數(shù)據(jù)的偏差程度稱為樣本內(nèi)誤差,在測試集上的偏差則稱為樣本外誤差一般而言,以最小化樣本內(nèi)誤差為目標(biāo)進(jìn)行各預(yù)測模型的訓(xùn)練,以最小化樣本外誤差為標(biāo)準(zhǔn)進(jìn)行模型間的選擇2.4評價預(yù)測模型的方法預(yù)測評估指標(biāo)

2.4評價預(yù)測模型的方法預(yù)測評估指標(biāo)

importnumpyasnp

defcal_mse(y_true,y_pred):

returnnp.mean([(y_pred[i]-y_true[i])**

2

foriinrange(len(y_pred))])

defcal_rmse(y_true,y_pred):

returnnp.sqrt(cal_mse(y_true,y_pred))

defcal_mae(y_true,y_pred):

returnnp.mean([abs(y_pred[i]-y_true[i])foriinrange(len(y_pred))])

2.4評價預(yù)測模型的方法預(yù)測評估指標(biāo)defcal_mape(y_true,y_pred):

returnnp.mean([abs(y_pred[i]-y_true[i])/max(1.0,y_true[i])foriin

range(len(y_pred))])

defcal_wmape(y_true,y_pred):

sum_error=sum([abs(y_pred[i]-y_true[i])foriinrange(len(y_pred))])

sum_true=max(1.0,sum(y_true))

returnsum_error/sum_true

在需求預(yù)測業(yè)務(wù)中,我們常將wMAPE視為模型的錯誤率,而將1-wMAPE作為模型準(zhǔn)確性的一個代表defpred_evaluate(y_true,y_pred):

returnround(max(0,1

-cal_wmape(y_true,y_pred)),3)2.4評價預(yù)測模型的方法誤差分析常見的誤差來源數(shù)據(jù)性質(zhì)數(shù)據(jù)不完整,所收集的數(shù)據(jù)中遺漏了某些對結(jié)果具有影響力的重要因素數(shù)據(jù)的聚合程度較低時,數(shù)據(jù)中的隨機(jī)性影響較大用于數(shù)據(jù)評估的測試集性質(zhì)也會影響評估效果需求性質(zhì)產(chǎn)品需求本身具有特殊性質(zhì)或可預(yù)測性較低產(chǎn)品正處于需求拐點(diǎn)期模型方法模型的錯誤選擇或是模型的不當(dāng)調(diào)試現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)第3章時間序列方法數(shù)據(jù)集本節(jié)采用’DC001_SKU044’的周度銷售數(shù)據(jù)作為示例導(dǎo)入上一章定義的預(yù)測相關(guān)的基本函數(shù)讀入并篩選數(shù)據(jù)繪制該unit的周銷量趨勢數(shù)據(jù)集選擇2020年4月1日為分割時間點(diǎn),在此之前的數(shù)據(jù)為訓(xùn)練集,共117條數(shù)據(jù),在此之后的數(shù)據(jù)為測試集,共18條數(shù)據(jù),測試集比例為13.3%#數(shù)據(jù)切分

unit_data=unit_data.set_index('date')['sale']

test_start_date=pd.Timestamp(2020,4,1)

unit_train_data=unit_data[unit_data.index<test_start_date]

unit_test_data=unit_data[unit_data.index>=test_start_date]3.1指數(shù)平滑方法移動平均法基本思想:利用過去一段時間數(shù)據(jù)的均值,作為對未來的預(yù)測需要決定的參數(shù):選擇過去多長時間的數(shù)據(jù),即預(yù)測窗口期代碼示例forwindow_lengthin[2,8]:

unit_fit=unit_data.rolling(window=window_length).mean()

plot_fitness(unit_data,unit_fit)3.1指數(shù)平滑方法移動平均法窗口期越短,對數(shù)據(jù)的變動跟蹤地越緊密細(xì)致;窗口期越長,則越能反應(yīng)數(shù)據(jù)的平均變動趨勢3.1指數(shù)平滑方法簡單指數(shù)平滑法

3.1指數(shù)平滑方法簡單指數(shù)平滑法

3.1指數(shù)平滑方法簡單指數(shù)平滑法

defsimple_exp_smoothing(data,initialization=None,alpha=0.4):

"""

data:歷史需求序列,索引為時間,值為歷史需求值

initialization:初始化值,默認(rèn)為原始數(shù)據(jù)的首個觀察值,也可設(shè)定為一段時間均值

alpha:模型參數(shù),默認(rèn)設(shè)置為0.4

"""

ifinitializationis

None:

fitting=[data.values[0]]

else:

fitting=[initialization]

foriinrange(len(data)):

fitting.append(alpha*data.values[i]+(1

-alpha)*fitting[-1])

returnpd.Series(fitting[:-1],index=data.index)3.1指數(shù)平滑方法簡單指數(shù)平滑法

2.2需求預(yù)測方法的分類簡單指數(shù)平滑法3.1指數(shù)平滑方法簡單指數(shù)平滑法

fromstatsmodels.tsa.apiimportSimpleExpSmoothing

defalpha_fitting(data):

model=SimpleExpSmoothing(data).fit()

returnmodel.model.params["smoothing_level"]3.1指數(shù)平滑方法簡單指數(shù)平滑法利用該函數(shù),得到最小化訓(xùn)練集上均方誤差的最優(yōu)參數(shù)約為0.9。將最優(yōu)參數(shù)下的模型帶入測試集進(jìn)行預(yù)測,整體預(yù)測準(zhǔn)確率為71.1%best_alpha=alpha_fitting(unit_train_data)

pred=simple_exp_smoothing(unit_test_data,unit_train_data[-1],best_alpha)

print(f'最優(yōu)模型參數(shù)為$\\alpha$={alpha}')

plot_fitness(unit_test_data,pred,

title='預(yù)測準(zhǔn)確率為'

+str(pred_evaluate(unit_test_data,pred)))

最優(yōu)模型參數(shù)為$\alpha$=0.93.1指數(shù)平滑方法簡單指數(shù)平滑法

3.1指數(shù)平滑方法Holt-Winters方法針對簡單指數(shù)平滑法的不足,Holt和Winters分別對模型做出了改進(jìn),形成了Holt-Winters方法主要思路是將數(shù)據(jù)分解為趨勢項(xiàng)、季節(jié)項(xiàng)和水平項(xiàng)(可以對應(yīng)于微觀因素),對于每一個構(gòu)成項(xiàng)采用簡單指數(shù)平滑法進(jìn)行預(yù)測,再逆向組合得到最終預(yù)測值根據(jù)分解方式的不同,這一方法有加法形式和乘法形式,選擇哪一種形式主要取決于季節(jié)性因素的影響方式。在實(shí)際中,我們可以同時嘗試兩種模型,并選擇評估結(jié)果更好的模型用于預(yù)測3.1指數(shù)平滑方法Holt-Winters方法

3.1指數(shù)平滑方法Holt-Winters方法通過Python對簡單指數(shù)平滑法進(jìn)行額外的參數(shù)設(shè)置,便可以實(shí)現(xiàn)Holt-Winters模型的構(gòu)造和使用fromstatsmodels.tsa.holtwintersimportExponentialSmoothing

defholt_winters(data,pred_length,trend='additive',damped_trend=True,

seasonal='additive',seasonal_periods=52):

model=ExponentialSmoothing(data,trend=trend,seasonal=seasonal,

damped_trend=damped_trend,

seasonal_periods=seasonal_periods).fit()

pred=model.forecast(steps=pred_length)

returnpred3.1指數(shù)平滑方法Holt-Winters方法加性模型預(yù)測效果#加性模型

pred=holt_winters(data=unit_train_data,pred_length=len(unit_test_data),

trend=’additive’,seasonal=’additive’)

plot_fitness(unit_test_data,pred,

title=’預(yù)測準(zhǔn)確率為’

+str(pred_evaluate(unit_test_data,pred)))3.1指數(shù)平滑方法Holt-Winters方法乘性模型預(yù)測效果#乘性模型

pred=holt_winters(data=unit_train_data,pred_length=len(unit_test_data),

trend='additive',seasonal='multiplicative')

plot_fitness(unit_test_data,pred,

title='預(yù)測準(zhǔn)確率為'

+str(pred_evaluate(unit_test_data,pred)))3.1指數(shù)平滑方法Holt-Winters方法在這組數(shù)據(jù)上,更復(fù)雜的Holt-Winters方法并沒有提供比簡單指數(shù)平滑法更好的預(yù)測這主要是因?yàn)?,該方法是為趨勢性和季?jié)性較強(qiáng)的數(shù)據(jù)集設(shè)計的,而本組數(shù)據(jù)覆蓋時間較短,沒有明顯的宏觀趨勢,也無法呈現(xiàn)出季節(jié)趨勢,整體而言波動較為劇烈,微觀趨勢更為明顯因此,并非越復(fù)雜的模型就一定有更好的效果,不同的模型有不同的假設(shè)和適用場景,只有根據(jù)數(shù)據(jù)選擇了合適的方法,才能最好地利用數(shù)據(jù)和模型,得到合理的預(yù)測3.2

ARIMA模型

3.2

ARIMA模型模型假設(shè)和數(shù)據(jù)檢驗(yàn)?zāi)骋浑S機(jī)過程是(弱)平穩(wěn)序列的標(biāo)準(zhǔn)定義為:隨機(jī)過程的均值和方差是與時間無關(guān)的有限常數(shù),且兩個時間點(diǎn)的協(xié)方差只與時間間隔有關(guān)ARMA模型要求用于建模的數(shù)據(jù)是(弱)平穩(wěn)的,直觀來看表現(xiàn)為序列圍繞某一確定水平上下波動,不呈現(xiàn)明顯的上升或下降趨勢當(dāng)原始序列非平穩(wěn)時,可以通過差分進(jìn)行處理,直觀來看,對于一個帶有升降趨勢或季節(jié)周期的時間序列,兩期之間的變動可能是平穩(wěn)的,即變動序列的均值和方差不隨時間改變,從而可以首先對需求變動進(jìn)行預(yù)測,再反推得到需求預(yù)測,這種包含差分過程的ARMA模型被稱為ARIMA模型考慮到模型的實(shí)際意義,差分的次數(shù)一般不會超過兩次,即差分階數(shù)一般小于23.2

ARIMA模型模型假設(shè)和數(shù)據(jù)檢驗(yàn)

3.2

ARIMA模型模型假設(shè)和數(shù)據(jù)檢驗(yàn)因此,在面對一個時間序列時,可以按照如下流程判斷ARIMA模型的適用性:3.2

ARIMA模型參數(shù)選擇

3.2

ARIMA模型參數(shù)選擇實(shí)踐中,可以安裝調(diào)用Pmdarima庫實(shí)現(xiàn)ARIMA模型的自動定階并完成預(yù)測,該庫同時支持對差分階數(shù)的自動擬合importpmdarimaaspm

defnonseasonal_arima_training(train,test,p,q,d=None):

"""

train:訓(xùn)練數(shù)據(jù)

test:測試數(shù)據(jù)

p:自回歸項(xiàng)最大階數(shù)

q:移動平均項(xiàng)最大階數(shù)

"""

#自動選擇指定階數(shù)內(nèi)最優(yōu)模型

model=pm.auto_arima(train,

start_p=0,#p最小值

start_q=0,#q最小值

d=d,

test='adf',#如果未輸入差分值,ADF檢驗(yàn)確認(rèn)差分階數(shù)d

max_p=p,#p最大值

max_q=q,#q最大值

stepwise=True

#stepwise為False則不進(jìn)行完全組合遍歷

)3.2

ARIMA模型參數(shù)選擇應(yīng)用該方法時,需要提前給定最大滯后階數(shù),在給定的范圍內(nèi)選擇AIC最小的模型一般而言,模型滯后階數(shù)不應(yīng)過大,這一方面是由ARIMA模型的性質(zhì)決定的(例如高階AR模型可以由低階MA模型等價表示),另一方面也是考慮到算力限制(過高階數(shù)有時會造成運(yùn)行時間過長或是求解失?。┰趯?shí)際運(yùn)用中,可以考慮實(shí)際意義限制最大滯后階數(shù)pred=[]

fornew_obintest.values.tolist():

pred.append(model.predict(n_periods=1)[0])

model.update(new_ob)

returnpred,model

(接上頁)3.2

ARIMA模型參數(shù)選擇由于本節(jié)數(shù)據(jù)是周度數(shù)據(jù),選擇4階(對應(yīng)一個月左右)作為最大滯后階數(shù)得到的ARIMA模型在測試集上的準(zhǔn)確率約為72.5%,相較Holt-Winters方法有所提升,這主要因?yàn)锳RIMA模型更適合捕捉數(shù)據(jù)的微觀特征在訓(xùn)練集上表現(xiàn)最好的是ARIMA(1,1,1)模型,即使用滯后一階的真實(shí)數(shù)據(jù)和預(yù)測誤差,對原始數(shù)據(jù)進(jìn)行一階差分后的平穩(wěn)序列進(jìn)行預(yù)測#Non-SeasonalARIMA

pred,model=nonseasonal_arima_training(unit_train_data,unit_test_data,

p=4,q=4,d=1)

pred=pd.Series(pred,index=unit_test_data.index)

print(model.summary())

plot_fitness(unit_test_data,pred,

title='ARIMA,Accuracy='

+str(pred_evaluate(unit_test_data,pred)))

3.2

ARIMA模型參數(shù)選擇ARIMA模型的預(yù)測效果plot_fitness(unit_test_data,pred,

title='預(yù)測準(zhǔn)確率為'

+str(pred_evaluate(unit_test_data,pred)))

3.2

ARIMA模型考慮季節(jié)性因素的sARIMA模型sARIMA模型是對ARIMA模型無法考慮季節(jié)性的不足進(jìn)行的改進(jìn)。

Pmdarima庫可以通過修改參數(shù)設(shè)置實(shí)現(xiàn)sARIMA模型sARIMA模型的預(yù)測效果plot_fitness(unit_test_data,pred,

title='預(yù)測準(zhǔn)確率為'

+str(pred_evaluate(unit_test_data,pred)))

3.3

Prophet模型Prophet模型

3.3

Prophet模型Prophet模型

3.3

Prophet模型Prophet模型

3.3

Prophet模型Prophet模型通過AIC信息準(zhǔn)則實(shí)現(xiàn)自動定階的VARMA模型python代碼如下fromfbprophetimportProphet

unit_train_prophet=unit_train_data.reset_index()\

.rename(columns={'date':'ds','sale':'y'})

unit_test_prophet=unit_test_data.reset_index()\

.rename(columns={'date':'ds','sale':'y'})importos

os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

model=Prophet(daily_seasonality=True,weekly_seasonality=True)\

.fit(unit_train_prophet)future=model.make_future_dataframe(periods=len(unit_test_prophet),

freq='W',include_history=False)

pred=model.predict(future)

pred_prophet=pd.Series(pred['yhat'].values,index=pred['ds'])

plot_fitness(unit_test_data,pred_prophet,

title='預(yù)測準(zhǔn)確率為'

+str(pred_evaluate(unit_test_data,pred_prophet)))3.3

Prophet模型Prophet模型Prophet模型的預(yù)測效果3.4

考慮相互作用的VARMA模型

3.4

考慮相互作用的VARMA模型VARMA模型需要輸入一個包含了相同層級全部信息的矩陣形式的歷史數(shù)據(jù),準(zhǔn)備和模型效果評估過程代碼如下fromstatsmodels.tsa.statespace.varmaximportVARMAX

defvarmax(train,test):

model=VARMAX(train).fit()

pred=pd.DataFrame()

foriinrange(len(test)):

iflen(pred)==

0:

pred=model.forecast()

else:

pred=pd.concat([pred,model.forecast()])

model=model.append(pd.DataFrame(test.iloc[i]).T)

returnpred,modelpred,model=varmax(sku_train_data,sku_test_data)

unit_accuracy_dict={unit:pred_evaluate(sku_test_data[unit],pred[unit])

forunitinunit_list}

print("VARMA模型的平均預(yù)測準(zhǔn)確率為:"

+str(np.mean(list(unit_accuracy_dict.values()))))3.5

考慮層級結(jié)構(gòu)的時間序列預(yù)測通過多個產(chǎn)品的需求序列往往呈現(xiàn)出一定的層級結(jié)構(gòu),即不同產(chǎn)品之間可以按照一定的指標(biāo)進(jìn)行聚合,由于這樣的結(jié)構(gòu)存在,我們將同時面對單個產(chǎn)品的需求序列和聚合層級的需求序列因此,我們希望得到的預(yù)測需要滿足一定的實(shí)際約束,即對單產(chǎn)品的預(yù)測經(jīng)過聚合后應(yīng)該與對應(yīng)聚合層級的預(yù)測相似,而一般的分步法(即分別預(yù)測再聚合)很難保證這一點(diǎn)本節(jié)介紹的預(yù)測模型HTS正是為了解決這一問題而提出的,通過調(diào)用scikit-hts庫可以完成HTS模型的構(gòu)建和使用3.5

考慮層級結(jié)構(gòu)的時間序列預(yù)測HTS模型python代碼實(shí)現(xiàn)如下fromhtsimportHTSRegressor

defhts(data,pred_period,model_choice='auto_arima',revision_choice='OLS'):

"""

data:索引是時間序列,列名為DC,值周總銷量

model_choice:'auto_arima'、'holt_winters'、'sarimax'、'prophet'

revision_choice:

'OLS','WLSS','WLSV'

'OLS'-optimalcombinationusingordinaryleastsquares(Default),

'WLSS'-optimalcombinationusingstructurallyweightedleastsquares,

'WLSV'-optimalcombinationusingvarianceweightedleastsquares,

"""

node=dict()

node['total']=data.columns.to_list()

3.5

考慮層級結(jié)構(gòu)的時間序列預(yù)測(接上頁)bottom=data

total=data.sum(axis=1).to_frame().rename(columns={0:'total'})

hierarchy_df=bottom.join(total).fillna(0)

model=HTSRegressor(model=model_choice,revision_method=revision_choice,

n_jobs=50).fit(hierarchy_df,node)

pred=model.predict(steps_ahead=len(pred_period))[-len(pred_period):]

pred.index=pred_period

returnpredpred=hts(sku_train_data,sku_test_data.index.to_list(),

model_choice='sarimax',revision_choice='OLS')

unit_accuracy_dict={unit:pred_evaluate(sku_test_data[unit],

pred[unit])forunitin

unit_list}

print(unit_accuracy_dict)

print("平均準(zhǔn)確率為:"

+str(np.mean(list(unit_accuracy_dict.values()))))現(xiàn)代庫存管理:模型、算法與Python實(shí)現(xiàn)第4章機(jī)器學(xué)習(xí)方法數(shù)據(jù)集本節(jié)采用’DC001_SKU044’的周度銷售數(shù)據(jù)作為示例運(yùn)行代碼,展示模型效果導(dǎo)入本章使用的庫和數(shù)據(jù),并提取想要考察的子數(shù)據(jù)fromchapter2_forecast_basicimport*

importpandasaspd

importnumpyasnp

importwarnings

warnings.filterwarnings("ignore")data_dir=

'../../data/forecast_data/'

weekly_sales_df=pd.read_csv(data_dir+

'weekly_sales_data.csv')

weekly_sales_df['date']=pd.to_datetime(weekly_sales_df['date'])

weekly_sales_df['dc_id']=weekly_sales_df['unit_id'].str[:5]

weekly_sales_df['sku_id']=weekly_sales_df['unit_id'].str[6:]

sku_id=

'SKU044'

sku_df=weekly_sales_df[weekly_sales_df['sku_id']==sku_id]\

.reset_index(drop=True)

print(sku_df.head())4.1特征工程時間特征機(jī)器學(xué)習(xí)是一種基于特征學(xué)習(xí)的技術(shù),它無法像時間序列一樣直接對長期的趨勢性、季節(jié)性進(jìn)行建模,因此需要在數(shù)據(jù)集上人為地構(gòu)造和加入時間特征數(shù)值型和非數(shù)值型的數(shù)據(jù)并不由數(shù)據(jù)的表現(xiàn)形式?jīng)Q定,而應(yīng)該由數(shù)據(jù)之間是否具有順序關(guān)系決定對于非數(shù)值型的數(shù)據(jù),常用的處理方法是生成啞變量或獨(dú)熱編碼月份是與類別相關(guān)的非數(shù)值型的數(shù)據(jù),2月的數(shù)據(jù)和1月的數(shù)據(jù)之間并沒有嚴(yán)格的順序關(guān)系,通過這一變量可以提取同一月份數(shù)據(jù)之間的相同特征,即季節(jié)性用月份特征生成啞變量,并將其與原始特征數(shù)據(jù)拼接。這里僅保留了前11個啞變量(即標(biāo)記數(shù)據(jù)屬于1~11月中的哪個月),這是因?yàn)?2個啞變量是多重共線的,即由前11個特征的結(jié)果即可以推出最后一個特征的取值4.1特征工程時間特征#時間特征:年份啞變量

defadd_year_dummy_feature(df):

df_=df.copy()

df_['year']=df_['date'].dt.year

drop_year=

'FEA_year_'

+str(df_['year'].unique().tolist()[-1])

df_=df_.join(pd.get_dummies(df_['year'],prefix='FEA_year')\

.drop(drop_year,axis=

1)).drop('year',axis=

1)

returndf_#時間特征:月份啞變量

defadd_month_dummy_feature(df):

df_=df.copy()

df_['month']=df_['date'].dt.month

drop_month=

'FEA_month_'

+str(df_['month'].unique().tolist()[-1])

df_=df_.join(pd.get_dummies(df_['month'],prefix='FEA_month')\

.drop(drop_month,axis=

1)).drop('month',axis=

1)

returndf_

具體代碼4.1特征工程時間特征

具體代碼結(jié)果sku_feature_df=sku_df.copy()

sku_feature_df=add_year_dummy_feature(sku_feature_df)

sku_feature_df=add_month_dummy_feature(sku_feature_df)

print(sku_feature_df.head())unit_iddatesaledc_idsku_idFEA_year_2018FEA_year_2019\

0DC001_SKU0442018-01-073782DC001SKU04410

1DC001_SKU0442018-01-143917DC001SKU04410

2DC001_SKU0442018-01-214008DC001SKU04410

3DC001_SKU0442018-01-284289DC001SKU04410

4DC001_SKU0442018-02-045347DC001SKU044104.1特征工程

FEA_month_1FEA_month_2FEA_month_3FEA_month_4FEA_month_5\

010000

110000

210000

310000

401000

FEA_month_6FEA_month_7FEA_month_8FEA_month_9FEA_month_10\

000000

100000

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論