mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/cief-dashboard.git
synced 2026-08-19 12:34:20 +00:00
772 lines
52 KiB
Plaintext
772 lines
52 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 167,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import plotly\n",
|
||
"#from plotly import vision\n",
|
||
"import plotly.express as px\n",
|
||
"import numpy as np\n",
|
||
"# get location\n",
|
||
"import pgeocode\n",
|
||
"import seaborn as sns\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"from mlxtend.frequent_patterns import apriori\n",
|
||
"from mlxtend.regressor import LinearRegression\n",
|
||
"\n",
|
||
"#pd.set_option('display.max_colwidth', 120)\n",
|
||
"pd.reset_option('display.max_colwidth')\n",
|
||
"pd.reset_option('display.max_columns')\n",
|
||
"#pd.set_option('display.max_columns', None)\n",
|
||
"#pd.set_option('display.max_rows', 10)\n",
|
||
"#pd.set_option('display.max_rows', None)\n",
|
||
"pd.reset_option('display.max_rows')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 225,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>Date</th>\n",
|
||
" <th>Destination port</th>\n",
|
||
" <th>Marking</th>\n",
|
||
" <th>Description</th>\n",
|
||
" <th>CTN</th>\n",
|
||
" <th>Postcode</th>\n",
|
||
" <th>Delivery status</th>\n",
|
||
" <th>Remark</th>\n",
|
||
" <th>CBM</th>\n",
|
||
" <th>Cleaned Marking</th>\n",
|
||
" <th>Daily CBM</th>\n",
|
||
" <th>Daily CTN</th>\n",
|
||
" <th>Place name</th>\n",
|
||
" <th>State name</th>\n",
|
||
" <th>Latitude</th>\n",
|
||
" <th>Longitude</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2019-01-02</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/879LFE/015012</td>\n",
|
||
" <td>机器</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>43000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.49</td>\n",
|
||
" <td>CIEF/879LFE</td>\n",
|
||
" <td>4.96</td>\n",
|
||
" <td>60</td>\n",
|
||
" <td>Kajang</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.0094</td>\n",
|
||
" <td>101.7755</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2019-01-02</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/874LCT/014947</td>\n",
|
||
" <td>衣服</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>43000</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.05</td>\n",
|
||
" <td>CIEF/874LCT</td>\n",
|
||
" <td>4.96</td>\n",
|
||
" <td>60</td>\n",
|
||
" <td>Kajang</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.0094</td>\n",
|
||
" <td>101.7755</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>2019-01-02</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/854PNS/015029</td>\n",
|
||
" <td>药品</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>47100</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.06</td>\n",
|
||
" <td>CIEF/854PNS</td>\n",
|
||
" <td>4.96</td>\n",
|
||
" <td>60</td>\n",
|
||
" <td>Sungai Buloh, Puchong</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.2445</td>\n",
|
||
" <td>101.5899</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>2019-01-02</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/812EBM/014799</td>\n",
|
||
" <td>玩具</td>\n",
|
||
" <td>25</td>\n",
|
||
" <td>81100</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>1.56</td>\n",
|
||
" <td>CIEF/812EBM</td>\n",
|
||
" <td>4.96</td>\n",
|
||
" <td>60</td>\n",
|
||
" <td>Johor Bahru</td>\n",
|
||
" <td>Johor</td>\n",
|
||
" <td>1.5495</td>\n",
|
||
" <td>103.7080</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>2019-01-02</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/769SMC/014977</td>\n",
|
||
" <td>鞋子</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>51200</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>1.01</td>\n",
|
||
" <td>CIEF/769SMC</td>\n",
|
||
" <td>4.96</td>\n",
|
||
" <td>60</td>\n",
|
||
" <td>Kuala Lumpur</td>\n",
|
||
" <td>Kuala Lumpur</td>\n",
|
||
" <td>3.1876</td>\n",
|
||
" <td>101.6720</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6585</th>\n",
|
||
" <td>2020-10-10</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/1935LOC/57691290</td>\n",
|
||
" <td>日用品</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>31200</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.13</td>\n",
|
||
" <td>CIEF/1935LOC</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>189</td>\n",
|
||
" <td>Chemor</td>\n",
|
||
" <td>Perak</td>\n",
|
||
" <td>4.7281</td>\n",
|
||
" <td>101.1200</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6586</th>\n",
|
||
" <td>2020-10-10</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/1120SLL/98048736</td>\n",
|
||
" <td>灯饰</td>\n",
|
||
" <td>100</td>\n",
|
||
" <td>68100</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>2.22</td>\n",
|
||
" <td>CIEF/1120SLL</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>189</td>\n",
|
||
" <td>Batu Caves, Batu Caves</td>\n",
|
||
" <td>Kuala Lumpur</td>\n",
|
||
" <td>3.2251</td>\n",
|
||
" <td>101.6803</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6587</th>\n",
|
||
" <td>2020-10-10</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/1089KPP/4267058</td>\n",
|
||
" <td>配件</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>46100</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.08</td>\n",
|
||
" <td>CIEF/1089KPP</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>189</td>\n",
|
||
" <td>Petaling Jaya</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.1026</td>\n",
|
||
" <td>101.6288</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6588</th>\n",
|
||
" <td>2020-10-10</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/1044CJH/5901905</td>\n",
|
||
" <td>纸巾</td>\n",
|
||
" <td>51</td>\n",
|
||
" <td>43300</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>1.34</td>\n",
|
||
" <td>CIEF/1044CJH</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>189</td>\n",
|
||
" <td>Seri Kembangan</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.0383</td>\n",
|
||
" <td>101.7094</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6589</th>\n",
|
||
" <td>2020-10-10</td>\n",
|
||
" <td>GZ-SM</td>\n",
|
||
" <td>SM/CIEF/1044CJH/59019015</td>\n",
|
||
" <td>纸巾</td>\n",
|
||
" <td>33</td>\n",
|
||
" <td>43300</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>No remark</td>\n",
|
||
" <td>0.86</td>\n",
|
||
" <td>CIEF/1044CJH</td>\n",
|
||
" <td>4.67</td>\n",
|
||
" <td>189</td>\n",
|
||
" <td>Seri Kembangan</td>\n",
|
||
" <td>Selangor</td>\n",
|
||
" <td>3.0383</td>\n",
|
||
" <td>101.7094</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>6590 rows × 16 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" Date Destination port Marking Description CTN \\\n",
|
||
"0 2019-01-02 GZ-SM SM/CIEF/879LFE/015012 机器 3 \n",
|
||
"1 2019-01-02 GZ-SM SM/CIEF/874LCT/014947 衣服 1 \n",
|
||
"2 2019-01-02 GZ-SM SM/CIEF/854PNS/015029 药品 1 \n",
|
||
"3 2019-01-02 GZ-SM SM/CIEF/812EBM/014799 玩具 25 \n",
|
||
"4 2019-01-02 GZ-SM SM/CIEF/769SMC/014977 鞋子 5 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"6585 2020-10-10 GZ-SM SM/CIEF/1935LOC/57691290 日用品 2 \n",
|
||
"6586 2020-10-10 GZ-SM SM/CIEF/1120SLL/98048736 灯饰 100 \n",
|
||
"6587 2020-10-10 GZ-SM SM/CIEF/1089KPP/4267058 配件 2 \n",
|
||
"6588 2020-10-10 GZ-SM SM/CIEF/1044CJH/5901905 纸巾 51 \n",
|
||
"6589 2020-10-10 GZ-SM SM/CIEF/1044CJH/59019015 纸巾 33 \n",
|
||
"\n",
|
||
" Postcode Delivery status Remark CBM Cleaned Marking Daily CBM \\\n",
|
||
"0 43000 NaN No remark 0.49 CIEF/879LFE 4.96 \n",
|
||
"1 43000 NaN No remark 0.05 CIEF/874LCT 4.96 \n",
|
||
"2 47100 NaN No remark 0.06 CIEF/854PNS 4.96 \n",
|
||
"3 81100 NaN No remark 1.56 CIEF/812EBM 4.96 \n",
|
||
"4 51200 NaN No remark 1.01 CIEF/769SMC 4.96 \n",
|
||
"... ... ... ... ... ... ... \n",
|
||
"6585 31200 NaN No remark 0.13 CIEF/1935LOC 4.67 \n",
|
||
"6586 68100 NaN No remark 2.22 CIEF/1120SLL 4.67 \n",
|
||
"6587 46100 NaN No remark 0.08 CIEF/1089KPP 4.67 \n",
|
||
"6588 43300 NaN No remark 1.34 CIEF/1044CJH 4.67 \n",
|
||
"6589 43300 NaN No remark 0.86 CIEF/1044CJH 4.67 \n",
|
||
"\n",
|
||
" Daily CTN Place name State name Latitude Longitude \n",
|
||
"0 60 Kajang Selangor 3.0094 101.7755 \n",
|
||
"1 60 Kajang Selangor 3.0094 101.7755 \n",
|
||
"2 60 Sungai Buloh, Puchong Selangor 3.2445 101.5899 \n",
|
||
"3 60 Johor Bahru Johor 1.5495 103.7080 \n",
|
||
"4 60 Kuala Lumpur Kuala Lumpur 3.1876 101.6720 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"6585 189 Chemor Perak 4.7281 101.1200 \n",
|
||
"6586 189 Batu Caves, Batu Caves Kuala Lumpur 3.2251 101.6803 \n",
|
||
"6587 189 Petaling Jaya Selangor 3.1026 101.6288 \n",
|
||
"6588 189 Seri Kembangan Selangor 3.0383 101.7094 \n",
|
||
"6589 189 Seri Kembangan Selangor 3.0383 101.7094 \n",
|
||
"\n",
|
||
"[6590 rows x 16 columns]"
|
||
]
|
||
},
|
||
"execution_count": 225,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df1=pd.read_csv('warehouse2.csv')\n",
|
||
"df1\n",
|
||
"#df1.dropna(thresh=15,inplace=True)\n",
|
||
"#df1.dropna(thresh=11,inplace=True)\n",
|
||
"#df1['Bubble size']=df1.loc[:,'CBM by place']*1000\n",
|
||
"#df['Bubble size'] = df['CBM by place'].apply(lambda x: (np.sqrt(x/100) + 1) if x > 500 else (np.log(x) / 2 + 1)).replace(np.NINF, 0)\n",
|
||
"#df['size 2'] = df['CBM by place'].apply(lambda x: (np.sqrt(x/100) + 1) if x > 500 else (np.log(x) / 2 + 1)).replace(np.NINF, 0)\n",
|
||
"#df1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Linear Regression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"ename": "NameError",
|
||
"evalue": "name 'daily_cubic' is not defined",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||
"\u001b[0;32m<ipython-input-79-f395aa13e88b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtrain_test_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdaily_cubic\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mtrain_test_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain_test_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoordinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mtrain_x\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_test_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m40\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mtrain_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain_test_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m40\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;31mNameError\u001b[0m: name 'daily_cubic' is not defined"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"train_test_data=daily_cubic.copy()\n",
|
||
"train_test_data.iloc[:,0]=train_test_data.iloc[:,0].map(datetime.datetime.toordinal)\n",
|
||
"\n",
|
||
"train_x=np.expand_dims(np.array(train_test_data.iloc[-40:-10,0]),axis=1)\n",
|
||
"train_y=np.array(train_test_data.iloc[-40:-10,1])\n",
|
||
"test_x=np.array(train_test_data.iloc[-10:,0])\n",
|
||
"test_y=np.array(train_test_data.iloc[-10:,1])\n",
|
||
"\n",
|
||
"end=-1\n",
|
||
"\n",
|
||
"predict_x=np.expand_dims(np.array(train_test_data.iloc[-10:end,0]),axis=1)\n",
|
||
"#predict_x=np.expand_dims(np.array(train_test_data.iloc[-10:,-9]),axis=1)\n",
|
||
"predict_x\n",
|
||
"\n",
|
||
"model = LinearRegression()\n",
|
||
"model.fit(train_x, train_y)\n",
|
||
"#predict_y=[]\n",
|
||
"predict_y=model.predict(predict_x)\n",
|
||
"#predict_y\n",
|
||
"\n",
|
||
"test_x=np.array(train_test_data.iloc[start:end,0])\n",
|
||
"test_y=np.array(train_test_data.iloc[start:end,1])\n",
|
||
"\n",
|
||
"plot_df=pd.DataFrame({'date':test_x,'test_y':test_y, 'predict_y':predict_y})\n",
|
||
"plot_df=pd.melt(plot_df, 'date')\n",
|
||
"plot_df\n",
|
||
"\n",
|
||
"#sns.lineplot('date','value',hue='variable',data=plot_df)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 128,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<AxesSubplot:xlabel='Date ordinal', ylabel='Daily CBM'>"
|
||
]
|
||
},
|
||
"execution_count": 128,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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RxzB9773PcAqArn88stZvnw573znO9mxo5jrrl69mrVr1wLw29/+lqOPPpojjzyS0047reVWzG6mYufuVcDPROSjwEvA+VMwhpZQkHoCRaln3dY9DZ/PHfjB/gahGb+iFPnN5+G1p1p7ztcdDmdd5emp2WyW3/zmN5x55pkAPPLIIzz99NMsWbKE6667jrlz5/Loo4+SSqU48cQTefvb384TTzzB888/z1NPPcX27dtZvnw5l1xyybjzDg4O8rGPfYz777+fJUuWsGvXLvr6+lpqxexmUgK/MeZe4F779k7gtMl433aTKgn8ltSTwRiDiNR9voRrcRegJxpU2wZF6QDGxsZYuXIlYGX8H/3oR3nooYd405vexJIlSwC48847WbduXUG/37t3L+vXr+f+++9nzZo1+P1+Fi5cyKmnnjrh/H/84x855ZRTCufq6+tr63zUq6cJnKqesJPxx4Okc3kS6Vwha6+H4VSWUMBXuJD0xFrj+KkoMwaPmXmrcTT+Uty2y8YYrrnmGs4444xxz7njjjtqJoKNJouNopYNTZDKlGT8TiVOgzq/u+2idT61ZlaU6cIZZ5zBv/3bv5HJWN/SX3jhBRKJBKeccgo333wzuVyObdu2cc8990x47fHHH899993Hpk2bANi1axfQWitmNxr4m2Bixm8F/p0NBv6RZLYg8wBqzawo04hLL72U5cuXc/TRR7NixQr+8i//kmw2yznnnMOyZcs4/PDD+cQnPsFb3vKWCa/t7+/nuuuu49xzz+XII48sdOpqpRWzG5V6mqBYx18s54TGM36n7aJDTyzIcDJLNpcn4NdrtKJMFU4jdDerV69m9erVhfs+n48rr7ySK6+8csJzr7322rLndSyXAc466yzOOuuscY+30orZjUaTJijW8RereqBxa2Z320UoSkd7dYFXUZQWooG/CUrr+AsZf4O6vNN20aFHjdoURWkDGviboLSOf04kQMAnTWT8EzV+UKM2RTFGGxJVo97fjwb+JnCbtIHVl7OZputW20V/4X6vGrUpCpFIhJ07d2rwr4Axhp07dxKJRDy/Rhd3m6Cg8QeK18++WOO2DQm7365DT1SN2hRl8eLFbN26lU516e0EIpEIixcv9vx8DfxNULpzF6A3Hmyo/WIubxhN58ZLPXHN+BUlGAwWdrQqrUGlniZIldgyg23U1kCGnkiP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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"df=pd.read_csv('warehouse2.csv',parse_dates=['Date'])\n",
|
||
"\n",
|
||
"# filter 1 month\n",
|
||
"start_date=df.loc[:,\"Date\"].max()-pd.Timedelta(30, unit='D')\n",
|
||
"df=df.loc[df.loc[:,'Date'] >= start_date]\n",
|
||
"\n",
|
||
"train_xy=df.loc[:,['Date','Daily CBM']]\n",
|
||
"train_xy=train_xy.drop_duplicates()\n",
|
||
"train_xy[\"Date ordinal\"]=train_xy.loc[:,\"Date\"].apply(pd.Timestamp.toordinal)\n",
|
||
"train_xy[\"Type\"]='Current'\n",
|
||
"\n",
|
||
"train_x=np.expand_dims(np.array(train_xy.loc[:,'Date ordinal']),axis=-1)\n",
|
||
"train_y=np.array(train_xy.loc[:,'Daily CBM'])\n",
|
||
"model = LinearRegression()\n",
|
||
"model.fit(train_x, train_y)\n",
|
||
"\n",
|
||
"predict_xy=pd.DataFrame()\n",
|
||
"for i in range(30):\n",
|
||
" predict_date=train_xy.loc[:,\"Date\"].max()+pd.Timedelta(1+i, unit='D')\n",
|
||
" append_df=pd.DataFrame(data={'Date':[predict_date], 'Type':['Predict']})\n",
|
||
" append_df[\"Date ordinal\"]=append_df.loc[:,\"Date\"].apply(pd.Timestamp.toordinal)\n",
|
||
" predict_x=np.expand_dims(np.expand_dims(np.array(append_df.loc[0,'Date ordinal']),axis=0),axis=0)\n",
|
||
" predict_y=model.predict(predict_x)\n",
|
||
" append_df[\"Daily CBM\"]=predict_y\n",
|
||
" predict_xy=predict_xy.append(append_df)\n",
|
||
"predict_xy\n",
|
||
"\n",
|
||
"plot_df=pd.concat([train_xy,predict_xy])\n",
|
||
"plot_df.sort_values(by=['Date'],inplace=True)\n",
|
||
"\n",
|
||
"#plot_df\n",
|
||
"#fig = px.line(plot_df, x=\"Date\", y=\"Daily CBM\", title='CBM prediction')\n",
|
||
"sns.lineplot(x='Date ordinal',y='Daily CBM',hue='Type',data=plot_df)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Billing"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 169,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#df=pd.read_csv('data/billing0.csv')\n",
|
||
"#df=pd.read_csv('billing0.csv')\n",
|
||
"#df.iloc[:,2].value_counts()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 224,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>No.</th>\n",
|
||
" <th>Date</th>\n",
|
||
" <th>Name</th>\n",
|
||
" <th>Status</th>\n",
|
||
" <th>Traffic Source</th>\n",
|
||
" <th>Remarks</th>\n",
|
||
" <th>No. of employees</th>\n",
|
||
" <th>Selling Platform</th>\n",
|
||
" <th>Unnamed: 8</th>\n",
|
||
" <th>Unnamed: 9</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>1</td>\n",
|
||
" <td>2020-01-05 00:00:00</td>\n",
|
||
" <td>Harry ting siew kiat</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2</td>\n",
|
||
" <td>2020-01-05 00:00:00</td>\n",
|
||
" <td>KWANG SOO HAU</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Shopee</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2020-01-05 00:00:00</td>\n",
|
||
" <td>Lee hor wai</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Other</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Traffic</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>4</td>\n",
|
||
" <td>2020-01-05 00:00:00</td>\n",
|
||
" <td>ANG CHERN HAO</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Introduce by friends</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Facebook</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Facebook</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>5</td>\n",
|
||
" <td>2020-01-05 00:00:00</td>\n",
|
||
" <td>TAN SEE TING</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Facebook&Google</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Other</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Google</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>177</th>\n",
|
||
" <td>178</td>\n",
|
||
" <td>31/5/2020</td>\n",
|
||
" <td>lee kar mun</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Facebook</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>178</th>\n",
|
||
" <td>179</td>\n",
|
||
" <td>31/5/2020</td>\n",
|
||
" <td>Tor@toh shir siong</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Facebook</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>179</th>\n",
|
||
" <td>180</td>\n",
|
||
" <td>31/5/2020</td>\n",
|
||
" <td>Chua Yeow Meng</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Shopee</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>180</th>\n",
|
||
" <td>181</td>\n",
|
||
" <td>31/5/2020</td>\n",
|
||
" <td>Ng kian yiap</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>Own Website</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>181</th>\n",
|
||
" <td>182</td>\n",
|
||
" <td>31/5/2020</td>\n",
|
||
" <td>TOCK ERN</td>\n",
|
||
" <td>Personal</td>\n",
|
||
" <td>Google</td>\n",
|
||
" <td>*Without Upload Company SSM or IC</td>\n",
|
||
" <td>Less than 5 employees</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>182 rows × 10 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" No. Date Name Status \\\n",
|
||
"0 1 2020-01-05 00:00:00 Harry ting siew kiat Personal \n",
|
||
"1 2 2020-01-05 00:00:00 KWANG SOO HAU Personal \n",
|
||
"2 3 2020-01-05 00:00:00 Lee hor wai Personal \n",
|
||
"3 4 2020-01-05 00:00:00 ANG CHERN HAO Personal \n",
|
||
"4 5 2020-01-05 00:00:00 TAN SEE TING Personal \n",
|
||
".. ... ... ... ... \n",
|
||
"177 178 31/5/2020 lee kar mun Personal \n",
|
||
"178 179 31/5/2020 Tor@toh shir siong Personal \n",
|
||
"179 180 31/5/2020 Chua Yeow Meng Personal \n",
|
||
"180 181 31/5/2020 Ng kian yiap Personal \n",
|
||
"181 182 31/5/2020 TOCK ERN Personal \n",
|
||
"\n",
|
||
" Traffic Source Remarks \\\n",
|
||
"0 Google *Without Upload Company SSM or IC \n",
|
||
"1 Google NaN \n",
|
||
"2 Google *Without Upload Company SSM or IC \n",
|
||
"3 Introduce by friends NaN \n",
|
||
"4 Facebook&Google NaN \n",
|
||
".. ... ... \n",
|
||
"177 Google NaN \n",
|
||
"178 Google *Without Upload Company SSM or IC \n",
|
||
"179 Google *Without Upload Company SSM or IC \n",
|
||
"180 Google *Without Upload Company SSM or IC \n",
|
||
"181 Google *Without Upload Company SSM or IC \n",
|
||
"\n",
|
||
" No. of employees Selling Platform Unnamed: 8 Unnamed: 9 \n",
|
||
"0 Less than 5 employees NaN NaN NaN \n",
|
||
"1 Less than 5 employees Shopee NaN NaN \n",
|
||
"2 Less than 5 employees Other NaN Traffic \n",
|
||
"3 Less than 5 employees Facebook NaN Facebook \n",
|
||
"4 Less than 5 employees Other NaN Google \n",
|
||
".. ... ... ... ... \n",
|
||
"177 Less than 5 employees Facebook NaN NaN \n",
|
||
"178 Less than 5 employees Facebook NaN NaN \n",
|
||
"179 Less than 5 employees Shopee NaN NaN \n",
|
||
"180 Less than 5 employees Own Website NaN NaN \n",
|
||
"181 Less than 5 employees NaN NaN NaN \n",
|
||
"\n",
|
||
"[182 rows x 10 columns]"
|
||
]
|
||
},
|
||
"execution_count": 224,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"#df=pd.read_excel('may.xlsx',sheet_name=0,parse_dates=[0])\n",
|
||
"#df.to_csv('marketing0.csv',index=False)\n",
|
||
"\n",
|
||
"df=pd.read_csv('marketing0.csv')\n",
|
||
"df=df.iloc[:,1:8]\n",
|
||
"df.columns=['Date','Name','Status','Traffic source','Remark','Number of employee', 'Selling platform']\n",
|
||
"\n",
|
||
"#df.loc[:,'Date']=pd.to_datetime(df.loc[:,'Date'],errors='coerce')\n",
|
||
"\n",
|
||
"#df1=pd.read_excel('may.xlsx',sheet_name=2,parse_dates=[0])\n",
|
||
"#df1=df1.iloc[:,[0,1]]\n",
|
||
"#df1.columns=['Date','CBM']\n",
|
||
"#df=pd.merge(df,df1,how='left',on='Date')\n",
|
||
"df\n",
|
||
"#df1.columns\n",
|
||
"#df2=pd.read_excel('may.xlsx',sheet_name=1,parse_dates=[0])\n",
|
||
"#df1.columns\n",
|
||
"#df1"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.6"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|