---
# System prepended metadata

title: Flower price predict
tags: [Time sereis, XGboost, Project, Competition]

---

###### tags: `Project` `Competition`

Flower price predict
===

Comp. info https://aidea-web.tw/topic/4c321260-fe3b-4b68-ab42-c1e8f86553ef

本議題預測的標的為，台北花市特定期間，十種香水百合的「上價、中價、平均價、交易量」

Date: 2020/11/25~2021/01/27

預測期間：
Public Leaderboard：2020/01/10 ~ 2020/01/24（農曆十二月十六～十二月三十，2020/1/12與2020/1/15休市除外，計13日）
Private Leaderboard：2021/01/28 ~ 2021/2/11（農曆十二月十六～十二月三十，2021/1/31與2021/2/3休市除外，計13日）
最後成績以Private Leaderboard 為主。

十種香水百合：
FS443 香水百合 馬可波羅粉三朵
FS479 水晶香水 多朵
FS592 薇薇安娜 雙朵
FS609 香水百合 康卡多多朵
FS639 OT曼尼薩 多朵
FS779 OT百合 節奏舞者多朵
FS859 百合 瑪丹娜多朵
FS879 OT大連 多朵
FS899 OT帕雷諾 多朵
FS929 OT帕芳多 多朵

本議題使用MAPE (https://scikit-learn.org/dev/modules/generated/sklearn.metrics.mean_absolute_percentage_error.html) 計分，計分的項目共有四個，其對應之權重為：

項目 權重
上價（price_high） 0.1
中價（price_mid） 0.15
平均價（price_avg） 0.25
交易量（volume） 0.5

# 1. check raw data

原始 Excel 長這樣，是 open data 但下載的大小有限制，所以一次下載兩個月的資料。
![](https://i.imgur.com/rlu6k8j.png)

Load 進來長這樣
![](https://i.imgur.com/miMLAxG.png)

最後要 submit 的格式長這樣
![](https://i.imgur.com/kc1IGKY.png)

## 1.1 combine excel and take preliminary table

1. 把 excel 全部合併。
2. 依據 column "1" 把奇怪的值砍掉。
    column 1 != ["花卉 產品日交易行情","交易日期：","市　　場：","產　　品：","日　　期","小　　計","查無符合條件資料"
3. column "12" 在 excel 中也沒有值，所以也砍掉。

![](https://i.imgur.com/hbNAo6G.png)

## 1.2 convert increment and decrement column

1. 轉換資料型態，將 ["增減%均價","增減%量"] 的值轉換成能夠變成 float 的值。
2. 把 ["最高價","上價","中價","下價","平均價","增減%_均價","交易量","增減%_量","殘貨量"] 轉成數值型。 astype(float)
3. 轉換日期變成 datetime 的格式。(民國轉西元)

![](https://i.imgur.com/daIfVWR.png)

## 1.3 get some features
1. 將產品、產品種類、市場 的資料重新提取出來。

![](https://i.imgur.com/k8kl5Wm.png)

# 2. Draw
## 2.1 看一下 categorical data 

![](https://i.imgur.com/aXF2W9j.png)

![](https://i.imgur.com/n9FSRp5.png)

![](https://i.imgur.com/TjSTxqz.png)

1. 產品種類非常多，資料筆數也不均勻。 並不是什麼產品每天都會交易
2. 主要的產品還是以百合花為大宗。
3. 五個市場以台北市場的資料量最多。
4. 不看全部產品光是百合花也有 237 種類型。

## 2.2 看一下目標產品在每個市場是否有差異

產品X時間X平均價格X市場

![](https://i.imgur.com/TUBwFsn.png)


## 2.3 看一下主要產品各種價格的差異

市場 105
產品X時間X價格X不同價格

![](https://i.imgur.com/DrQWSDm.png)


## 2.4 看一下個產品量價的關係

市場 105
產品X時間X(價格X量)

![](https://i.imgur.com/Yj2XPJg.png)

## 2.5 看一下相關係數

市場 105
產品X(["最高價","上價","中價","下價","平均價","交易量","殘貨量"])

![](https://i.imgur.com/TA2OOw2.png)

## 2.6 看產品間的關係

1. 將各產品的 value 依據時間對齊
2. 轉換 table 的格式，把不同的產品納入 column 的表頭
3. 增加特徵:前一天與今天的差異值
4. 把國曆轉換成農曆

![](https://i.imgur.com/CMbd6A1.png)


不同產品的均價相關性
![](https://i.imgur.com/u0yx7A2.png)

不同產品的銷售量相關性
![](https://i.imgur.com/QvOBVbD.png)

# 3. ETL

## 3.1 Impute data

1. 透過"平均價"的相關矩陣取絕對值為依據，用 Multi-task LASSO 讓不同產品相互補值。

    Step 1. 尋找相關係數最高的兩個產品(A、B)。
    Step 2. 用 A 產品的 Data 為 X， B 產品的 Data 為 Y 建模。
    Step 3. 將 A 產品有資料，B 產品沒資料的天數列出，並用 Model 預測 B 產品這幾天的價格。
    Step 4. A、B 互換重複 Step 2,3 ，用 B 產品有的資料預測 A 產品缺失的資料。(B 使用的 Input 資料不包括原本B被A預測的資料)
    Step 5. 將兩個產品的相關矩陣值歸0。
    Step 6. 若 Data 都有值則結束過程，若無則回到 Step 1.
    
    ![](https://i.imgur.com/m76Odrf.png)


2. Multi-task LASSO
    
    
    
    https://scikit-learn.org/stable/modules/linear_model.html#multi-task-lasso

## 3.2 transform period

依據期數增加新的 column (T-i,i 表示往前推幾期)，T-0 為當期 T-1 為上一期依此類推。

![](https://i.imgur.com/ikoCjJN.png)

# 4. Modeling

Model 選擇了 Xgboost

## 4.1 Training
X: 選擇了 (10種不同的花*6個值*前3期)+下一期農曆月+下一期農曆日。
y: 10種不同的百合花類型，每種類型有 4 個不同的目標值。
因為X中還包含了最高值跟殘值，因此也一併建模預測。
所以總共 taining 60 個 model，但反正資料量不大。

![](https://i.imgur.com/vZNeOJj.png)



## 4.2 Predict

![](https://i.imgur.com/CyZZdTM.png)

依據比賽規則， testing 的資料上的加權 MAPE 為 0.430505

![](https://i.imgur.com/LIseKEo.png)
![](https://i.imgur.com/XfR5COG.png)

## 4.3 Result

![](https://i.imgur.com/Q5XptT0.png)


Review
1. 其他市場的資料跟花的資料應該可以一起拿來 train。
2. 太多冗於的特徵。
3. Volume 的補植可以另外做。
4. Training 的取樣應該可以再調整。
5. 節慶的特徵沒有顯現出來，可以用 target date - now day 跟方法來生特徵。
6. 如果特徵的相關性很強可以用， Light GBM 跟 Cat GBM 來試試看。

###### tags: `Time sereis` `XGboost`