通過pandas melt和pandas pivot快速進行時間序列的插補
- 2020 年 12 月 16 日
- AI
電商銷量預測中,數據的處理一直是一個噁心的問題,因為我們拿到的常常是層次不齊的銷量數據,舉個例子:
北京:銷量數據 2017-01-01~2020-11-11
某個二線城市:銷量數據 2018-01-01~2020-10-11
某個n線城市:銷量數據 2019-12-01~2020-05-01
這是很常見的數據場景,而建模的時候,一般來說我們會對所有城市的數據進行時間的對齊,如果引入了sku層面,甚至要對每個城市的所有的sku進行時間的對齊,僅僅以一個城市為例:
北京:
鞋子:銷量數據 2018-01-02~2020-11~11
衣服:銷量數據 2019-08-02~2020-03-05
襪子:銷量數據 2020-01-01~2020-10-01
這個時候就涉及到了周期的插補,常見的插補就是沒有銷量記錄的樣本其銷量用0來進行插補或者直接就先用nan代替。噁心的地方在於這個時間周期統一的過程。下面以m5的數據集作為例子:
M5的數據非常標準,每一個州,每一個商店,每一個品類下的每一個商品都統一成了長度為1919的序列數據,下面我們刪掉一些記錄從而符合真實的業務下的原始數據:

這個是m5的原始數據先做了一些轉換得到的,這個形式更複合業務上的形式,例如常見的電商銷量預測里,按照city shop sku date sales,即城市 商店id sku的id 日期 銷量這樣來排列,m5的原始數據經過主辦方的一次加工了,所有的sku的長度都是 1919,下面為了貼近一點實際的臟數據的情況,我們刪掉前面幾條:

這裡我們刪除了id為第一個的sku的前五條記錄,這樣就出現了業務中常常遇到的 每一個sku的序列數據長度不同的情況。
然後我們使用pivot進行展開:

可以看到,pivot展開之後,將序列數據從縱向存儲轉化為了橫向展開,橫向展開的長度以最長的一條序列數據為準,例如這裡的序列數據最長是1919,因此展開之後的維度增加了1919維,可以注意到,被我們刪除的第一個樣本,被刪除的部分自動進行了缺失值nan的填充使得所有樣本的長度全部相同。
然後我們再通過melt,把行轉列

這樣就進行了自動的等長處理了,非常的方便;
如果pandas性能是瓶頸,可以考慮多核計算的modin或者是分散式dask,pyspark dataframe也有相應介面。
補充:pandas的不同版本的pivot的功能有一些差異,並且有的版本是pivot_table的介面,需要注意,目前使用的版本是pandas1.12,在windows下使用pivot莫得問題,但是在linux下卻要使用pivot_table,否則會出現報錯的問題