Friday, 25 December 2020

Py_Neuron Network (Simple ANN)

 # -*- coding: utf-8 -*-

"""

Created on Tue Nov  3 10:01:10 2020


@author: phulh5

"""


import sys        

import pandas as pd

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.neural_network import MLPClassifier

from dmba import classificationSummary

from alive_progress import alive_bar

from tqdm import tqdm

import pickle

from sklearn.decomposition import PCA

from sklearn import preprocessing

from sklearn.preprocessing import MinMaxScaler, StandardScaler

import pandasql as ps

from imblearn.over_sampling import SMOTE


#set view full rows

pd.set_option('display.max_rows', 100)

pd.set_option('display.max_columns', 100)


#import dataset     

df1 = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/DL_komua_random.csv")

df2 = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/DL_muagoi.csv")


df = pd.concat([df1,df2])


df = pd.DataFrame(df)


#head data

df.head(n=10)

df.tail(n=6)


df = df.drop(columns = 'randnum')

df = df.drop(columns = 'home_tinh')


#summary

df.describe()


#check all columns 

df.columns


########Data dimension reduction - Principal Components Analysis##############

#groupby count


pcs = PCA()


pcs.fit(df.iloc[:,1:119].dropna(axis = 0))


pcsSummary_df = pd.DataFrame(

    {'Standard deviation': np.sqrt(pcs.explained_variance_),

     'Proportion of variance': pcs.explained_variance_ratio_,

     'Cumulative proportion': np.cumsum(pcs.explained_variance_ratio_)}

    )

    

pcsSummary_df = pcsSummary_df.transpose()


pcsSummary_df.columns = ['PC' + str(i) for i 

                         in range(1, len(pcsSummary_df.columns) + 1)]


pcsSummary_df.round(4)


##Normalizing (Standardizing) and Rescaling Data######################

from sklearn.preprocessing import MinMaxScaler, StandardScaler


missing_cnt = df.isnull().sum()


df = df.fillna(0)


norm_df = (df.drop(columns = 'isdn') - df.drop(columns ='isdn').min())/ (df.drop(columns ='isdn').max() - df.drop(columns ='isdn').min())


norm_df.head(6)


#or use scikit-learn:

scaler = MinMaxScaler()

norm_df_v1 = pd.DataFrame(scaler.fit_transform(df),

                          index= df.index,

                          columns = df.columns)


compare = pd.concat([norm_df['tuoi_khach_hang_200901'], 

                       norm_df_v1['tuoi_khach_hang_200901']

                       ],

                    axis = 1,

                    keys = ['norm_df', 'norm_df_v1']

                    )


##########################################################case_when_if#####################################

norm_df.head()


conditions = [

    (df['BHTT'] == 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] == 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] == 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] == 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] == 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] == 1),

    (df['BHTT'] != 1) & (df['CHTT'] != 1) & (df['CHUOI'] != 1) & (df['CHUQ'] != 1) & (df['TELESALE'] != 1) & (df['DB'] != 1)

    ] # create a list of our conditions


values = ['1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0'] # create a list of the values we want to assign for each condition



df['Purchased'] = np.select(conditions, values) # create a new column and use np.select to assign values to it using our lists as arguments


#method2


def func_case_when (norm_df):

    if norm_df['BHTT'] == 1 :

        return 1

    elif norm_df['CHTT'] == 1 :

        return 2

    elif norm_df['CHUOI'] == 1 :

        return 3

    elif norm_df['CHUQ'] == 1 :

        return 4

    elif norm_df['TELESALE'] == 1 :

        return 5

    elif norm_df['DB'] == 1 :

        return 6

    else :

        return 0


def fun_purchased (norm_df):

    if norm_df['bhtt'] == 1:

        return 1

    elif norm_df['telesale'] == 1:

        return 2

    else:

        return 0

    

norm_df['purchased_channel'] = norm_df.apply(fun_purchased, axis = 1)


norm_df.head(6)


norm_df.purchased_channel.value_counts()


#to drop a column

df_accident = df_accident.drop(columns = ['Unnamed'])

df_accident = df_accident.drop(df_accident.columns[0], axis = 1)



#equivalent str

a = df.dtypes


#unique

df['thiet_bi_200901'].unique()

df['muagoi'].unique()


#convert to category

norm_df.purchased_channel = norm_df.purchased_channel.astype('category')


norm_df.dtypes


norm_df.describe()

#


norm_df.head(n=2)


#convert the categorical data to dummy variables

df_processed = pd.get_dummies(df, columns= ['thiet_bi_200901'])

df = df_processed.drop(columns= ['Purchase'])

df = df_processed.drop(columns= ['CH'])


df_processed = df_processed.drop(columns= ['CHUOI'])

df_processed = df_processed.drop(columns= ['CTV'])

df_processed = df_processed.drop(columns= ['DB'])

df_processed = df_processed.drop(columns= ['TELESALE'])


processed.dtypes

df['Purchased'] = df.Purchased.astype('category')


norm_df['muagoi'] = df.muagoi.astype('category')


#missing data

norm_df.head( n = 10)

df.hatang_1G_200901

norm_df_count_missing = norm_df.isnull().sum()


#

norm_df = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/Data_model/DL_train_full.csv")


norm_df.head(5)

#'=' for str/dataframe, not in for a list

outcome = ['purchased_channel']


predictors = [c for 

             c in norm_df.columns 

             if 

             c not in ['kenh_mua', 'bhtt', 'telesale', 'muagoi','isdn','purchased_channel']]





#partition data

x = norm_df[predictors]

y = norm_df[outcome]


train_x, valid_x, train_y, valid_y = train_test_split(x, 

                                                      y, 

                                                      test_size = 0.4, 

                                                      random_state = 1)


train_y.value_counts()



######OVERSAMPLING#


norm_df.groupby('kenh_mua').isdn.nunique()

norm_df.groupby('muagoi').isdn.nunique()


train_x = train_x.astype('int')

train_y = train_y.astype('int')


d = train_x.dtypes


train_y.value_counts()


oversample = SMOTE(sampling_strategy = {1 : 500000, 2: 350000})


train_x_resample, train_y_resample = oversample.fit_resample(train_x, 

                                                             train_y)


train_y_resample.value_counts()


d = train_x_resample.dtypes


###### train neural network with 2 hidden nodes ######

##activation 'tanh' is the hyperbolic tangent, it is usually better to scale predictors to a [−1, 1] scale

##Deep learning uses mostly the ReLU (rectified linear unit) activation function or variants of it. This function is

#identical to the linear function, but set to zero for s < 0


clf = MLPClassifier(hidden_layer_sizes= (100,30),

                    activation= 'logistic',

                    solver='lbfgs',

                    random_state = 1)


clf.fit(train_x_resample, train_y_resample)


prediction = clf.predict(train_x)


# training performance (use idxmax to revert the one-hotencoding)

classificationSummary(train_y, clf.predict(train_x))

# validation performance

classificationSummary(valid_y, clf.predict(valid_x))


prediction = clf.predict_proba(valid_x)


prediction = pd.DataFrame(prediction)


prediction.value_counts()


valid_y.value_counts()


def predict_funs (prediction):

    if prediction.loc[0] >= 0.98 :

        return 0

    else:

        return 1


prediction['purchased_pre'] = prediction.apply(predict_funs, axis = 1) 


prediction.purchased_pre.value_counts()

    

print(pd.concat([

    valid_x,

    pd.DataFrame(clf.predict_proba(valid_x))

], axis=1))


prediction = (pd.concat([

    train_x,

    pd.DataFrame(clf.predict_proba(train_x))

], axis=1))


prediction = clf.predict_proba(train_x)


np.unique(prediction, return_counts= True)


np.unique(df_accident['TELESALE'], return_counts= True)


prediction = pd.DataFrame(prediction)


prediction.head(n=6)


names = [c for c in df.columns]


# Save to file

pickle.dump(clf, open('G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/Data_model/python_model.sav', 'wb'))


# Load from file

clf = pickle.load(open('G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/Data_model/python_model.sav', 'rb'))


########################################

############Valid dataset ##############

########################################


valid_df = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/DL_test.csv")


df_columns = [c for c in valid_df.columns]


df_columns = pd.DataFrame(df_columns)


df_columns.to_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/Data_model/column_name.csv", index = False, header = True)


valid_df = valid_df.rename(columns = {

"isdn_201001":"isdn_200901",

"tuoi_khach_hang_200901":"tuoi_khach_hang_200801",

"thuc_4g_200901":"thuc_4g_200801",

"is_3k3d_200901":"is_3k3d_200801",

"is_199_197_200901":"is_199_197_200801",

"so_ngay_su_dung_200901":"so_ngay_su_dung_200801",

"tong_cuoc_goc_data_4_huong_20090":"tong_cuoc_goc_data_4_huong_20080",

"so_lan_nap_the_200901":"so_lan_nap_the_200801",

"tong_tien_nap_the_200901":"tong_tien_nap_the_200801",

"so_du_tkg_200901":"so_du_tkg_200801",

"thuc_4g_200801":"thuc_4g_200701",

"is_3k3d_200801":"is_3k3d_200701",

"is_199_197_200801":"is_199_197_200701",

"so_ngay_su_dung_200801":"so_ngay_su_dung_200701",

"tong_cuoc_goc_data_4_huong_20080":"tong_cuoc_goc_data_4_huong_20070",

"so_lan_nap_the_200801":"so_lan_nap_the_200701",

"tong_tien_nap_the_200801":"tong_tien_nap_the_200701",

"so_du_tkg_200801":"so_du_tkg_200701",

"thuc_4g_201001":"thuc_4g_200901",

"is_3k3d_201001":"is_3k3d_200901",

"is_199_197_201001":"is_199_197_200901",

"so_ngay_su_dung_201001":"so_ngay_su_dung_200901",

"tong_cuoc_goc_data_4_huong_20100":"tong_cuoc_goc_data_4_huong_20090",

"so_lan_nap_the_201001":"so_lan_nap_the_200901",

"tong_tien_nap_the_201001":"tong_tien_nap_the_200901",

"so_du_tkg_201001":"so_du_tkg_200901",

"muagoi_200701":"muagoi_200701",

"muagoi_200601":"muagoi_200601",

"muagoi_200801":"muagoi_200701",

"tilethoainoi_200901":"tilethoainoi_200801",

"tilethoainoi_200801":"tilethoainoi_200701",

"tilethoainoi_201001":"tilethoainoi_200901",

"thoai_mp200901":"thoai_mp200801",

"thoai_mp200801":"thoai_mp200701",

"thoai_mp201001":"thoai_mp200901",

"thietbi_3g_200901":"thietbi_3g_200801",

"thietbi_2g_200901":"thietbi_2g_200801",

"thietbi_4g_200901":"thietbi_4g_200801",

"thietbi_unknown_200901":"thietbi_unknown_200801",

"thietbi_3g_200801":"thietbi_3g_200701",

"thietbi_2g_200801":"thietbi_2g_200701",

"thietbi_4g_200801":"thietbi_4g_200701",

"thietbi_unknown_200801":"thietbi_unknown_200701",

"thietbi_3g_201001":"thietbi_3g_200901",

"thietbi_2g_201001":"thietbi_2g_200901",

"thietbi_4g_201001":"thietbi_4g_200901",

"thietbi_unknown_201001":"thietbi_unknown_200901",

"hatang_2g_200901":"hatang_2g_200801",

"hatang_3g_200901":"hatang_3g_200801",

"hatang_4g_200901":"hatang_4g_200801",

"hatang_2g_200801":"hatang_2g_200701",

"hatang_3g_200801":"hatang_3g_200701",

"hatang_4g_200801":"hatang_4g_200701",

"hatang_2g_201001":"hatang_2g_200901",

"hatang_3g_201001":"hatang_3g_200901",

"hatang_4g_201001":"hatang_4g_200901",

"loaimay_fp_200901":"loaimay_fp_200801",

"loaimay_sp_200901":"loaimay_sp_200801",

"loaimay_e_200901":"loaimay_e_200801",

"loaimay_u_200901":"loaimay_u_200801",

"loaimay_fp_200801":"loaimay_fp_200701",

"loaimay_sp_200801":"loaimay_sp_200701",

"loaimay_e_200801":"loaimay_e_200701",

"loaimay_u_200801":"loaimay_u_200701",

"loaimay_fp_201001":"loaimay_fp_200901",

"loaimay_sp_201001":"loaimay_sp_200901",

"loaimay_e_201001":"loaimay_e_200901",

"loaimay_u_201001":"loaimay_u_200901",

"home_tinh":"home_tinh",

"Bac_Bo":"Bac_Bo",

"bac_tb":"bac_tb",

"db":"db",

"dbscl":"dbscl",

"dbsh":"dbsh",

"dnbo":"dnbo",

"nam_tb":"nam_tb",

"tay_bac":"tay_bac",

"tay_nguyen":"tay_nguyen",

"thichthoai_200901":"thichthoai_200801",

"thichthoai_200801":"thichthoai_200701",

"thichthoai_201001":"thichthoai_200901",

"thichdata_200901":"thichdata_200801",

"thichdata_200801":"thichdata_200701",

"thichdata_201001":"thichdata_200901",

"tdthap_200901":"tdthap_200801",

"tdtb_200901":"tdtb_200801",

"tdcao_200901":"tdcao_200801",

"tdthap_200801":"tdthap_200701",

"tdtb_200801":"tdtb_200701",

"tdcao_200801":"tdcao_200701",

"tdthap_201001":"tdthap_200901",

"tdtb_201001":"tdtb_200901",

"tdcao_201001":"tdcao_200901",

"llthoaithap_200901":"llthoaithap_200801",

"llthoaitb_200901":"llthoaitb_200801",

"llthoaicao_200901":"llthoaicao_200801",

"llthoaithap_200801":"llthoaithap_200701",

"llthoaitb_200801":"llthoaitb_200701",

"llthoaicao_200801":"llthoaicao_200701",

"llthoaithap_201001":"llthoaithap_200901",

"llthoaitb_201001":"llthoaitb_200901",

"llthoaicao_201001":"llthoaicao_200901",

"tdthoaithap_200901":"tdthoaithap_200801",

"tdthoaitb_200901":"tdthoaitb_200801",

"tdthoaicao_200901":"tdthoaicao_200801",

"tdthoaithap_200801":"tdthoaithap_200701",

"tdthoaitb_200801":"tdthoaitb_200701",

"tdthoaicao_200801":"tdthoaicao_200701",

"tdthoaithap_201001":"tdthoaithap_200901",

"tdthoaitb_201001":"tdthoaitb_200901",

"tdthoaicao_201001":"tdthoaicao_200901",

"tb50mb_200901":"tb50mb_200801",

"tb50mb_200801":"tb50mb_200701",

"tb50mb_201001":"tb50mb_200901"

    })


valid_df.head(3)


a = valid_df.isnull().sum()


valid_df = valid_df.fillna(0)


valid_df.to_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/DL_test_v1.csv", index = False, header = True)


valid_df = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/DL_test_v1.csv")


valid_df = valid_df.drop(columns = 'home_tinh')


valid_df['tdthoaithap_200901'].unique()


#nomalized


a = valid_df.dtypes


valid_df = valid_df.astype('int')


valid_df.head()


normalized_df = valid_df_v2.drop(columns = 'isdn_200901')


normalized_df=(valid_df.drop(columns = 'isdn_200901') - valid_df.drop(columns = 'isdn_200901').min())/(valid_df.drop(columns = 'isdn_200901').max() - valid_df.drop(columns = 'isdn_200901').min())


a = normalized_df.isnull().sum()


normalized_df = normalized_df.fillna(0)


normalized_df.head(3)


print(valid_df['isdn_200901'])


prediction = (pd.concat([

    valid_df['isdn_200901'],

    pd.DataFrame(clf.predict_proba(normalized_df))

], axis=1))


prediction = prediction.rename(columns = {

    "isdn_200901" : "isdn",

    "0" : "Not_purchase",

    "1" : "bhtt",

    "2" : "telesale"

    })


prediction.head( n=10 )

prediction.tail( n=10 )


prediction.to_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/nn_pre_p2.csv", index = False, header = True)


nn_pre_p1 = prediction[['isdn', 0, 1, 2, 3, 4, 5, 6]]


nn_pre_p1.head( n=6 )


prediction_p1 = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/nn_pre_p1.csv")


nn_pre_p1 = pd.read_csv("G:/Phu/Ad_hoc/Phantich_Kenh/Kenh_T12/nn_pre_p1.csv")

nn_pre_p2 = prediction


nn_pre_p2 = nn_pre_p2.rename (columns = {'isdn_200901' : 'isdn'})


nn_pre_p1 = pd.DataFrame(nn_pre_p1)

nn_pre_p2 = pd.DataFrame(nn_pre_p2)


nn_pre = nn_pre_p1.append(nn_pre_p2)




Thursday, 15 October 2020

<iframe width="560" height="315" src="https://www.youtube.com/embed/9ebJlcZMx3c" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Sunday, 20 September 2020

Macroeconomics

#####NOW CASTING###################

GDP: https://www.imf.org/external/pubs/ft/wp/2016/wp1656.pdf

CPI: https://www.ecb.europa.eu/pub/pdf/scpwps/ecbwp1324.pdf

R: https://journal.r-project.org/archive/2019/RJ-2019-020/RJ-2019-020.pdf


#####Traditional Statistical Model ########

https://www.r-econometrics.com/timeseries/bvar/

http://journaljemt.com/index.php/JEMT/article/view/11709

http://dl.ueb.edu.vn/bitstream/1247/4911/1/8.%20BVAR-Article.pdf

https://www.kthohr.com/bmr/BMR.pdf


---

title: "Vector Autoregression Model"

author: "Phu"

date: "9/10/2020"

output: html_document

---


```{r setup, include=FALSE}

knitr::opts_chunk$set(echo = TRUE)



#Call essential libraries

library(lubridate)

library(data.table)

library(dplyr)

library(ggplot2)

library(patchwork)

library(car)

library(stringr)

library(vars)


```


## Vector Autoregression (VAR)

rm(list = ls())

Vector Autoregression (VAR) is a forecasting algorithm that can be used when two or more time series influence each other. That is, the relationship between the time series involved is bi-directional.


Các bước xây dựng model:\

1.Analyze the time series characteristics\

2.Test for causation amongst the time series\

3.Test for stationarity\

4.Transform the series to make it stationary, if needed\

5.Find optimal order (p)\

6.Prepare training and test datasets\

7.Train the model\

8.Roll back the transformations, if any\

9.Evaluate the model using test set\

10.Forecast to future\


```{r cars}

#Đọc dữ liệu 

eco_data <- fread("G:/GDP_FORECAST/Vietnam/data_model.csv")


#Kiểm tra dữ liệu

eco_data %>% head()


#Tạo biến thời gian


dates <- seq(as.Date("2000-01-01"), as.Date("2020-06-01"), "3 months")


eco_data <- cbind(eco_data, dates)


#Vẽ biểu đồ



ggplot(eco_data, aes(x=dates, y = Interest)) + 

  geom_line() +

  labs(x = "Ngay", y = "Tong tieu dung", 

       title = "Tong tieu dung hang ngay")


par(mfrow=c(1,1))


p1 <- ggplot(eco_data, aes(x=dates, y = Interest_rate)) + 

  geom_line() +

  labs(x = "Time", y = " % Interest_rate", 

       title = "Central Bank Rate")


p2 <- ggplot(eco_data, aes(x=dates, y = World_oil_price)) + 

  geom_line() +

  labs(x = "Time", y = "Log World_oil_price (Crude WTI)", 

       title = "World Oil Price")


p3 <- ggplot(Spending_df, aes(x=dates, y = SMS)) + 

  geom_line() +

  labs(x = "Ngay", y = "Tong tieu dung SMS", 

       title = "Tong tieu dung SMS hang ngay")


p4 <- ggplot(Spending_df, aes(x=dates, y = THOAI)) + 

  geom_line() +

  labs(x = "Ngay", y = "Tong tieu dung THOAI", 

       title = "Tong tieu dung THOAI hang ngay")


p1 + p2



#Kiểm định tính dừng

###Augmented Dicker Fuller###


ur.df(eco_data$Exchange_rate, type = "none") %>%

  summary()


#Lag1


ur.df(diff(eco_data$, differences = 1), type = "none") %>%

  summary()


###Tất cả dừng tại sai phân bậc 1


eco_gdp_dif <- diff(eco_data$GDP, differences = 1)

eco_CPI_dif<- diff(eco_data$CPI, differences = 1)

eco_M2_dif <- diff(eco_data$M2, differences = 1)

eco_Exchange_rate_dif <- diff(eco_data$Exchange_rate, differences = 1)

eco_Interest_rate_dif <- diff(eco_data$Interest_rate, differences = 1)

eco_World_oil_price_dif <- diff(eco_data$World_oil_price, differences = 1)



dif_Spending <- data.frame(Spending_df$DATA, Spending_df$VAS, Spending_df$SMS, Spending_df$THOAI)


dif_Spending %>% head()


dif_Spending$date <- Spending_df$dates[1:609]


#Visualize

dif_Spending %>% ggplot(aes(date, dif_VAS)) +geom_line()


#Estimate VAR

##Make a time series

eco_df <- cbind(eco_gdp_dif, eco_CPI_dif, eco_Exchange_rate_dif, eco_M2_dif, eco_Interest_rate_dif, eco_World_oil_price_dif)


eco_df %>% glimpse()


VARselect(eco_df, lag.max = 10, type = "none")


p1ct <- VAR(eco_df, p = 1, type = "const", season = 4)


p1ct %>% summary()



plot(p1ct, names = "eco_gdp_dif", lag.acf = 8, lag.pacf = 8)


causality(p1ct, cause = "eco_gdp_dif")$Granger


varp.f <- predict(p1ct, n.ahead = 5, ci = 0.95)


varp.f %>% head()


varp.f$fcst

plot(varp.f, names = "eco_gdp_dif")

Thursday, 11 June 2020

Lean + Agile SCM

I. Quản lý chuỗi cung ứng tinh gọn (Lean Supply Chain Management)
Quản lý chuỗi cung ứng tinh gọn nhấn mạnh cho việc giảm chi phí và hạn chế lãng phí trong quá trình vận hành. Phương pháp này tập trung vào sự hoạt động hiệu quả, hợp lý và trơn tru trong cả chuỗi cung ứng. Thông thường, nhà cung cấp có một đầu mối liên lạc bao trùm toàn bộ các công ty và thống nhất một hợp đồng để quản lý mối quan hệ giữa các bên, sau đó, một mức giá chung sẽ được đưa ra cho tất cả các công ty.

Đối với phương quản trị chuỗi cung ứng tinh gọn, bất cứ thứ gì trong quy trình không tăng giá trị cho khách hàng đều bị loại bỏ. Quá trình vận hành chuỗi cung ứng tinh gọn là liên tục tìm cách loại bỏ các khâu lãng phí và chỉ thực hiện các bước làm tăng giá trị cho sản phẩm hoặc dịch vụ.

Chiến lược quản trị chuỗi cung ứng tinh gọn dựa vào dự báo lượng hàng tồn kho cần thiết để đáp ứng nhu cầu. Trong một số chuỗi cung ứng tinh gọn, sản phẩm tạo ra dựa trên những nhu cầu cơ bản để không xảy ra việc dư thừa sản phẩm. Cách tiếp cận tinh gọn được cho là phù hợp nhất với những thị trường không có sự biến động lớn.

Quản trị chuỗi cung ứng tinh gọn được xây dựng dựa trên 5 nguyên tắc cơ bản:

  • Hệ thống Just-in-tine (JIT):

Hệ thống JIT được hiểu là các quy trình không tạo ra giá trị gia tăng trong quá trình sản xuất hay cung ứng dịch vụ phải bị bãi bỏ. Hệ thống JIT là sự tích hợp của các chu trình trong chiến lược cung ứng bao gồm sản xuất - JIT, mua hàng - JIT, bán hàng - JIT và thông tin - JIT. Cụ thể, JIT điều hành sản xuất trong đó các luồng nguyên nhiên vật liệu, hàng hóa và sản phẩm lưu hành trong quá trình sản xuất và phân phối được lập kế hoạch chi tiết nhất trong từng bước, sao cho quy trình tiếp theo có thể thực hiện ngay khi quy trình hiện thời chấm dứt. Hay đối với quy trình cho đến bán hàng, số lượng hàng bán và luồng hàng điều động sẽ gần khớp với số lượng hàng sản xuất ra, tránh tồn đọng vốn và tồn kho hàng không cần thiết. Qua đó, không có hạng mục nào trong quá trình sản xuất rơi vào tình trạng để không, chờ xử lý, không có nhân công hay thiết bị nào phải đợi để có đầu vào vận hành.

  • Luồng thông tin:

Luồng thông tin nhằm mục đích thu nhận và phổ biến thông tin giữa các thành viên trong chuỗi cung ứng để cải thiện các quyết định, hoạt động, khả năng đáp ứng và mức độ dịch vụ. Thông tin được chia sẻ có thể bao gồm thông tin sản xuất, mức tồn kho, thông tin giao hàng và giao hàng, năng lực, số lượng đặt hàng, giá cả, điểm bán và thông tin cạnh tranh.
Mối quan hệ giữa các nhà cung cấp:
Mối quan hệ nhà cung cấp đề cập đến khả năng của một công ty để thiết lập, quản lý và duy trì mối quan hệ đối tác đáng tin cậy lâu dài với các nhà cung cấp của mình. Mối quan hệ nhà cung cấp sẽ góp phần giảm chi phí và tăng mức độ tin cậy, nâng cao trách nhiệm và cải thiện khả năng công nghệ của các đối tác trong chuỗi cung ứng, và giảm thiểu hoặc loại bỏ các hoạt động và thời gian lãng phí. Nó cũng có thể bao gồm các quy trình tích hợp, hợp đồng dài hạn, chương trình cải thiện chất lượng lẫn nhau và chia sẻ rủi ro, phần thưởng.

  • Mối quan hệ khách hàng:

Mối quan hệ khách hàng được định nghĩa là một tập hợp các hoạt động liên quan đến việc xây dựng mối quan hệ lâu dài với khách hàng, tăng cường liên hệ với khách hàng, phản hồi hiệu quả các khiếu nại của khách hàng và tăng sự hài lòng của khách hàng. Cải thiện quan hệ khách hàng sẽ giúp cải thiện chỉ số trung thành của khách hàng, cải thiện quy trình giải quyết vấn đề, nâng cao kiến thức và chia sẻ chuyên môn, nâng cao hiểu biết về khách hàng nhằm đáp ứng với nhu cầu khách hàng, tạo ra sự khác biệt hóa sản phẩm và tăng thị phần

  • Giảm thiểu lãng phí:

Giảm thiểu lãng phí được định nghĩa các thành viên trong chuỗi cung ứng tiêu tốn những nguồn lực mà không làm tăng thêm giá trị cho sản phẩm cuối cùng. Giảm thiểu lãng phí trong các quy trình giúp toàn bộ chuỗi cung ứng được tối ưu và đơn giản hóa. Trong quản trị chuỗi cung ứng tinh gọn, lãng phí chủ yếu được phân bổ theo 4 thành phần chính bao gồm: lãng phí con người, lãng phí quy trình, lãng phí thông tin và lãng phí tài sản.
-------------------------
II. Quản lý chuỗi cung ứng nhanh (Agile Supply Chain Management)
Quản lý chuỗi cung ứng nhanh ưu tiên khả năng đáp ứng những thay đổi về cầu một cách nhanh chóng, dễ dàng, trong tầm dự đoán và với chất lượng cao. Nó dành cho các tổ chức có thể nhanh chóng thích nghi với các tình huống thay đổi. Phương pháp này giúp dễ dàng điều chỉnh nguồn cung ứng, hậu cần và bán hàng để đáp ứng với các yếu tố như thay đổi kinh tế, thay đổi công nghệ và nhu cầu của khách hàng.

Thông thường, hệ thống cung ứng nhanh sẽ luôn duy trì việc theo dõi nhu cầu của thị trường là gì trước khi kết thúc quá trình sản xuất. Dự báo ngắn hạn giúp các công ty phản ứng nhanh, tuy nhiên yếu tố then chốt của chuỗi cung ứng agile là họ đáp ứng nhu cầu khi nó xảy ra. Cách tiếp cận này rất phù hợp với các công ty sản xuất các mặt hàng có sự thay đổi nhanh và tùy biến theo nhu cầu của khách hàng như may mặc, thời trang.

Quản trị chuỗi cung ứng nhanh được xây dựng dựa trên 4 yếu tố nền tảng, bao gồm:
  • Yếu tố tốc độ:
Yếu tố tốc độ được xem là một trong những yếu tố quan trọng nhất trong quản trị chuỗi cung ứng nhanh nhạy, đó là sự nhanh nhạy nắm bắt được nhu cầu tiêu dùng mới hình thành và phát tín hiệu hiệu quả để có được phản xạ thông minh từ chuỗi cung ứng. Ví dụ, mất bao lâu để một cả một chuỗi cung ứng – từ giai đoạn xác định yếu tố đầu vào, sản xuất, làm hàng, cho đến phân phối và giao hàng - nhận biết được nhu cầu mới sau khi nhu cầu này hình thành ở người tiêu dùng trên thị trường, và mất bao lâu thì chuỗi cung ứng của công ty bắt đầu hoạt động cho nhu cầu này.
  • Yếu tố linh hoạt: 
Khác với tốc độ, yếu tố này còn xét đến độ nhanh nhạy của cả chuỗi cung ứng khi mà xuất hiện rủi ro tại một quy trình nào đó, như khâu lực lượng lao động, nguyên vật liệu, sức ép về năng lực sản xuất trong kế hoạch sản xuất tổng thể, lượng thời gian đã cố định trong kế hoạch và thiết kế quy trình sản xuất..., hay có sự tăng chi phí so với kế hoạch ban đầu. Do vậy, chuỗi cung ứng nhanh được thiết kế linh hoạt thích ứng với những biến động và thay đổi về cầu không lường trước được.
  • Yếu tố về khả năng dự đoán: 
Khả năng dự đoán trước về nhu cầu thị trường cũng là một trong những yếu tố then chốt trong quản lý chuỗi cung ứng nhanh. Khả năng dự đoán chính là nền tảng để đạt được yếu tố tốc độ trong cả chuỗi cung ứng, nâng cao khả năng cạnh tranh của mình so với các chuỗi cung ứng khác.

  • Yếu tố chất lượng: 
Trong bất kì mô hình quản trị chuỗi cung ứng nào, yếu tố chất lượng lúc nào cũng phải được đảm bảo, đặc biệt tại một số các khâu trong chuỗi cung ứng bao gồm nhà cung cấp, sản xuất, và giao hàng. Một chuỗi cung ứng nhanh nhạy, dễ dàng nắm bắt và phản hồi nhu cầu luôn phải đi cùng với chất lượng cung ứng tốt nhất để hài lòng khách hàng. 

Friday, 22 May 2020

Fix Code: Banca FV

create or replace PACKAGE BODY PKG_ANP_BANCA_FV AS --DONE

PROCEDURE MAIN(cur_month_yyyymm in NUMBER) AS
BEGIN
    BANCA_CUSTOMERS(cur_month_yyyymm);
    CNT_BANCA_CONTRACT(cur_month_yyyymm);
    NEW_CONTRACTS(cur_month_yyyymm);
    TOT_APE_AND_SUM_ASSURED(cur_month_yyyymm);
    LAST_BANCA_CONTRACT_SINCE(cur_month_yyyymm);
    COVERAGE(cur_month_yyyymm);
    FREELOOK_CONTRACTS(cur_month_yyyymm);

END MAIN;

 PROCEDURE BANCA_CUSTOMERS(cur_month_yyyymm in NUMBER) AS
    BEGIN
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'BANCA_CUSTOMERS', 'Begin processing: '||cur_month_yyyymm);
    DELETE FROM BANCA_FV WHERE MONTH_ID = cur_month_yyyymm;
    COMMIT;
   
    INSERT  INTO BANCA_FV (CST_NBR, MONTH_ID)
    SELECT DISTINCT CST_NBR, cur_month_yyyymm FROM TBL_BANCA WHERE CST_NBR IS NOT NULL;
    COMMIT;
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'BANCA_CUSTOMERS', 'End processing: '||cur_month_yyyymm);
  END BANCA_CUSTOMERS;
 
--#####################################################################################################################
 -- this procedure create 4 feature vector:
 --CNT_BANCA_CONTRACT_3M, CNT_BANCA_CONTRACT_6M, CNT_BANCA_CONTRACT_1Y,  CNT_BANCA_CONTRACT_EOM , CNT_BANCA_CONTRACT_2Y,
 -- BANCA_HOLD_2Y, BANCA_HOLD_1Y, BANCA_HOLD_9M, BANCA_HOLD_6M, BANCA_HOLD_3M, BANCA_HOLD_EOM,

   PROCEDURE CNT_BANCA_CONTRACT(cur_month_yyyymm in NUMBER) AS
    v_to_month number;
    v_from_month_3 number;
    v_from_month_6 number;
    v_from_month_12 number;
    v_from_month_24 number;
    BEGIN
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'CNT_BANCA_CONTRACT', 'Begin processing: '||cur_month_yyyymm);
    v_to_month := cur_month_yyyymm;
    v_from_month_3 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-2 ),'yyyymm'));
    v_from_month_6 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-5 ),'yyyymm'));
    v_from_month_12 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-11 ),'yyyymm'));
    v_from_month_24 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-23 ),'yyyymm'));
    ----------------------------------------------------------
    MERGE INTO BANCA_FV A
    USING (
        with dat1 as (
        select cst_nbr, ar_id
        from TBL_BANCA
        where cst_nbr is not null
        AND status IN ('VALID')
        and month_id  = v_to_month
        ),
        dat2 as (
        select cst_nbr, count(distinct ar_id) as CNT_BANCA_CONTRACT_EOM
        from dat1
        group by cst_nbr
        )
        select cst_nbr, v_to_month as month_id, CNT_BANCA_CONTRACT_EOM ,
        CASE
        WHEN CNT_BANCA_CONTRACT_EOM >0  THEN 1
        ELSE 0
        END AS BANCA_HOLD_EOM
        FROM DAT2
        ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
    A.CNT_BANCA_CONTRACT_EOM = B.CNT_BANCA_CONTRACT_EOM , A.BANCA_HOLD_EOM = B.BANCA_HOLD_EOM
    WHEN NOT MATCHED then
    INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_BANCA_CONTRACT_EOM, A.BANCA_HOLD_EOM)
    VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_BANCA_CONTRACT_EOM, B.BANCA_HOLD_EOM) ;
    COMMIT;
   
    ----------------------------------------------------------
    MERGE INTO BANCA_FV A
    USING (
        with dat1 as (
        select cst_nbr, ar_id
        from TBL_BANCA
        where cst_nbr is not null
        AND status IN ('VALID')
        and month_id  between v_from_month_3 AND v_to_month
        ),
        dat2 as (
        select cst_nbr, count(distinct ar_id) as CNT_BANCA_CONTRACT_3M
        from dat1
        group by cst_nbr
        )
        select cst_nbr, v_to_month as month_id, CNT_BANCA_CONTRACT_3M ,
        CASE
        WHEN CNT_BANCA_CONTRACT_3M >0  THEN 1
        ELSE 0
        END AS BANCA_HOLD_3M
        FROM DAT2
        ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
    A.CNT_BANCA_CONTRACT_3M = B.CNT_BANCA_CONTRACT_3M , A.BANCA_HOLD_3M = B.BANCA_HOLD_3M
    WHEN NOT MATCHED then
    INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_BANCA_CONTRACT_3M, A.BANCA_HOLD_3M)
    VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_BANCA_CONTRACT_3M, B.BANCA_HOLD_3M) ;
    COMMIT;
   
    -------------------------------------------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    select cst_nbr, ar_id
    from TBL_BANCA
    where cst_nbr is not null
    AND status IN ('VALID')
    and month_id  between v_from_month_6 AND v_to_month
    ),
    dat2 as (
    select cst_nbr, count(distinct ar_id) as CNT_BANCA_CONTRACT_6M
    from dat1
    group by cst_nbr
    )
    select cst_nbr, v_to_month as month_id, CNT_BANCA_CONTRACT_6M,
     CASE
        WHEN CNT_BANCA_CONTRACT_6M >0  THEN 1
        ELSE 0
        END AS BANCA_HOLD_6M
    FROM DAT2
    ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.CNT_BANCA_CONTRACT_6M = B.CNT_BANCA_CONTRACT_6M , A.BANCA_HOLD_6M = B.BANCA_HOLD_6M
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_BANCA_CONTRACT_6M, A.BANCA_HOLD_6M)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_BANCA_CONTRACT_6M, B.BANCA_HOLD_6M) ;
    COMMIT;
    -------------------------------------------------------------
    -------------------------------------------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    select cst_nbr, ar_id
    from TBL_BANCA
    where CST_NBR IS NOT NULL
    AND status IN ('VALID')
    and month_id  between v_from_month_12 AND v_to_month
    ),
    dat2 as (
    select cst_nbr, count(distinct ar_id) as CNT_BANCA_CONTRACT_1Y
    from dat1
    group by cst_nbr
    )
    select cst_nbr, v_to_month as month_id, CNT_BANCA_CONTRACT_1Y,
    CASE
        WHEN CNT_BANCA_CONTRACT_1Y >0  THEN 1
        ELSE 0
        END AS BANCA_HOLD_1Y
    FROM DAT2
    ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.CNT_BANCA_CONTRACT_1Y = B.CNT_BANCA_CONTRACT_1Y , A.BANCA_HOLD_1Y = B.BANCA_HOLD_1Y
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_BANCA_CONTRACT_1Y, A.BANCA_HOLD_1Y)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_BANCA_CONTRACT_1Y, B.BANCA_HOLD_1Y) ;
    COMMIT;
    -------------------------------------------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    select cst_nbr, ar_id
    from TBL_BANCA
    where CST_NBR IS NOT NULL
    AND status IN ('VALID')
    and month_id  between v_from_month_24 AND v_to_month
    ),
    dat2 as (
    select cst_nbr, count(distinct ar_id) as CNT_BANCA_CONTRACT_2Y
    from dat1
    group by cst_nbr
    )
    select cst_nbr, v_to_month as month_id, CNT_BANCA_CONTRACT_2Y,
    CASE
        WHEN CNT_BANCA_CONTRACT_2Y >0  THEN 1
        ELSE 0
        END AS BANCA_HOLD_2Y
    FROM DAT2
    ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.CNT_BANCA_CONTRACT_2Y = B.CNT_BANCA_CONTRACT_2Y , A.BANCA_HOLD_2Y =B.BANCA_HOLD_2Y
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_BANCA_CONTRACT_2Y, A.BANCA_HOLD_2Y)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_BANCA_CONTRACT_2Y, B.BANCA_HOLD_2Y) ;
    COMMIT;
   PKG_LOGS.log('PKG_ANP_BANCA_FV', 'CNT_BANCA_CONTRACT', 'End processing: '||cur_month_yyyymm);
  END CNT_BANCA_CONTRACT;
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
  PROCEDURE NEW_CONTRACTS(cur_month_yyyymm in NUMBER) AS
    v_to_month number;
    v_from_month_3 number;
    v_from_month_6 number;
    v_from_month_12 number;
    v_from_month_24 number;
    BEGIN
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'NEW_CONTRACTS', 'Begin processing: '||cur_month_yyyymm);
   
    v_to_month := cur_month_yyyymm;
    v_from_month_3 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-2 ),'yyyymm'));
    v_from_month_6 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-5 ),'yyyymm'));
    v_from_month_12 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-11 ),'yyyymm'));
    v_from_month_24 := to_number(to_char(add_months(to_date(cur_month_yyyymm,'yyyymm'),-23 ),'yyyymm'));
 
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID, APE, sum_assured
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND to_number(to_char(NO_FREELOOK_DATE,'yyyymm')) = v_to_month
    and month_id =v_to_month
    AND STATUS IN ('VALID')
    )
    select cst_nbr, v_to_month AS MONTH_ID,
    SUM(APE) as TOT_APE_EOM ,
    COUNT(DISTINCT AR_ID) AS CNT_NEW_BANCA_CONTRACT_EOM,
    SUM(sum_assured) AS TOT_SUM_ASSURED_EOM
    from dat1
    group by cst_nbr
    ) B
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.TOT_APE_EOM = B.TOT_APE_EOM ,
        A.CNT_NEW_BANCA_CONTRACT_EOM = B.CNT_NEW_BANCA_CONTRACT_EOM,
        A.TOT_SUM_ASSURED_EOM = B.TOT_SUM_ASSURED_EOM
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.TOT_APE_EOM, A.CNT_NEW_BANCA_CONTRACT_EOM, A.TOT_SUM_ASSURED_EOM)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.TOT_APE_EOM, B.CNT_NEW_BANCA_CONTRACT_EOM, B.TOT_SUM_ASSURED_EOM) ;
    COMMIT;
--------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID, APE,  sum_assured
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND to_number(to_char(NO_FREELOOK_DATE,'yyyymm')) BETWEEN v_from_month_3 AND v_to_month
    AND STATUS IN ('VALID')
    AND MONTH_ID = to_number(to_char(NO_FREELOOK_DATE,'yyyymm'))
    )
    select cst_nbr, v_to_month AS MONTH_ID,
    SUM(APE) as TOT_APE_3M ,
    COUNT(DISTINCT AR_ID) AS CNT_NEW_BANCA_CONTRACT_3M,
    SUM(sum_assured) AS TOT_SUM_ASSURED_3M
   
    from dat1
    group by cst_nbr
    ) B
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.TOT_APE_3M = B.TOT_APE_3M , A.CNT_NEW_BANCA_CONTRACT_3M = B.CNT_NEW_BANCA_CONTRACT_3M, A.TOT_SUM_ASSURED_3M = B.TOT_SUM_ASSURED_3M
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.TOT_APE_3M, A.CNT_NEW_BANCA_CONTRACT_3M, A.TOT_SUM_ASSURED_3M)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.TOT_APE_3M, B.CNT_NEW_BANCA_CONTRACT_3M, B.TOT_SUM_ASSURED_3M) ;
    COMMIT;
--------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID, APE, SUM_ASSURED
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND to_number(to_char(NO_FREELOOK_DATE,'yyyymm')) BETWEEN v_from_month_6 AND v_to_month
    AND STATUS IN ('VALID')
    AND MONTH_ID = to_number(to_char(NO_FREELOOK_DATE,'yyyymm'))
    )
    select cst_nbr, v_to_month AS MONTH_ID,
    SUM(APE) as TOT_APE_6M ,
    COUNT(DISTINCT AR_ID) AS CNT_NEW_BANCA_CONTRACT_6M,
    SUM(sum_assured) AS TOT_SUM_ASSURED_6M
    from dat1
    group by cst_nbr
    ) B
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.TOT_APE_6M = B.TOT_APE_6M , A.CNT_NEW_BANCA_CONTRACT_6M = B.CNT_NEW_BANCA_CONTRACT_6M, A.TOT_SUM_ASSURED_6M = B.TOT_SUM_ASSURED_6M
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.TOT_APE_6M, A.CNT_NEW_BANCA_CONTRACT_6M, A.TOT_SUM_ASSURED_6M)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.TOT_APE_6M, B.CNT_NEW_BANCA_CONTRACT_6M, B.TOT_SUM_ASSURED_6M) ;
    COMMIT;
--------------------------
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID, APE, sum_assured
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND to_number(to_char(NO_FREELOOK_DATE,'yyyymm')) BETWEEN v_from_month_12 AND v_to_month
    AND STATUS IN ('VALID')
    AND MONTH_ID = to_number(to_char(NO_FREELOOK_DATE,'yyyymm'))
    )
    select cst_nbr, v_to_month AS MONTH_ID,
    SUM(APE) as TOT_APE_1Y ,
    COUNT(DISTINCT AR_ID) AS CNT_NEW_BANCA_CONTRACT_1Y,
    SUM(sum_assured) AS TOT_SUM_ASSURED_1Y
    from dat1
    group by cst_nbr
    ) B
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.TOT_APE_1Y = B.TOT_APE_1Y , A.CNT_NEW_BANCA_CONTRACT_1Y = B.CNT_NEW_BANCA_CONTRACT_1Y, A.TOT_SUM_ASSURED_1Y = B.TOT_SUM_ASSURED_1Y
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.TOT_APE_1Y, A.CNT_NEW_BANCA_CONTRACT_1Y, A.TOT_SUM_ASSURED_1Y)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.TOT_APE_1Y, B.CNT_NEW_BANCA_CONTRACT_1Y, B.TOT_SUM_ASSURED_1Y) ;
    COMMIT;
--------------------------
  END NEW_CONTRACTS;
-----------------------------------------------------------------------
PROCEDURE TOT_APE_AND_SUM_ASSURED(cur_month_yyyymm in NUMBER) AS

  BEGIN

    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID, APE, SUM_ASSURED
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND STATUS IN ('VALID')
    AND MONTH_ID = cur_month_yyyymm
    )
    select cst_nbr, cur_month_yyyymm AS MONTH_ID,
    SUM(APE) as TOT_APE ,
    SUM(sum_assured) AS TOT_SUM_ASSURED
    from dat1
    group by cst_nbr
       ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.TOT_APE = B.TOT_APE, A.TOT_SUM_ASSURED = B.TOT_SUM_ASSURED
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.TOT_APE, A.TOT_SUM_ASSURED)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.TOT_APE, B.TOT_SUM_ASSURED) ;
    COMMIT;
  PKG_LOGS.log('PKG_ANP_BANCA_FV', 'NEW_CONTRACTS', 'End processing: '||cur_month_yyyymm); 
  END TOT_APE_AND_SUM_ASSURED;
------------------------------------------------------------------------------------------------------------------------------
  PROCEDURE LAST_BANCA_CONTRACT_SINCE(cur_month_yyyymm in NUMBER) AS
  v_to_month number;
  BEGIN
  PKG_LOGS.log('PKG_ANP_BANCA_FV', 'LAST_BANCA_CONTRACT_SINCE', 'Begin processing: '||cur_month_yyyymm);
  v_to_month := cur_month_yyyymm;
 
    MERGE INTO BANCA_FV A
    USING (
    WITH DAT1 AS (
    SELECT DISTINCT CST_NBR, AR_ID, no_freelook_date
    FROM TBL_BANCA
    WHERE STATUS IN ('VALID')
    and to_number(to_char(NO_FREELOOK_DATE,'yyyymm')) <= v_to_month
    ),
    DAT2 AS (
    SELECT DAT1.*,
    ROW_NUMBER() OVER (PARTITION BY CST_NBR ORDER BY no_freelook_date desc) AS date_ORDER
    FROM DAT1
    )
    select cst_nbr, v_to_month AS MONTH_ID, last_day (to_date(v_to_month,'YYYYMM')) - no_freelook_date as LAST_BANCA_CONTRACT_SINCE
    from dat2 where date_order =1
    ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.LAST_BANCA_CONTRACT_SINCE = B.LAST_BANCA_CONTRACT_SINCE
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.LAST_BANCA_CONTRACT_SINCE)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.LAST_BANCA_CONTRACT_SINCE) ;
    COMMIT;
  PKG_LOGS.log('PKG_ANP_BANCA_FV', 'LAST_BANCA_CONTRACT_SINCE', 'End processing: '||cur_month_yyyymm); 
  END LAST_BANCA_CONTRACT_SINCE;


PROCEDURE COVERAGE (cur_month_yyyymm in NUMBER) AS   
    BEGIN
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'COVERAGE', 'Begin processing: '||cur_month_yyyymm);
   
    MERGE INTO BANCA_FV A
    USING (
    WITH DAT1 AS (
    SELECT * FROM (
    SELECT DISTINCT CST_NBR, AR_ID, RELATIONSHIP
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND STATUS IN ('VALID')
    AND MONTH_ID = cur_month_yyyymm
    )
    PIVOT (
    COUNT(DISTINCT AR_ID)
    FOR RELATIONSHIP
    IN (1 AS A1,2 AS A2)
    )
    ),
    DAT2 AS (
    SELECT CST_NBR, A1, A2,
     CASE
     WHEN A1 >0  AND A2 = 0 THEN 1
     WHEN A1 =0 AND A2 > 0 THEN 2
     WHEN A1 >= 0 AND A2 >= 0 THEN 3
     ELSE NULL
     END AS FL_COVERAGE
     FROM DAT1
    )
    SELECT CST_NBR, cur_month_yyyymm AS MONTH_ID, FL_COVERAGE
    FROM DAT2
    ) B
   
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.FL_COVERAGE = B.FL_COVERAGE
       
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.FL_COVERAGE)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.FL_COVERAGE) ;
    COMMIT;
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'COVERAGE', 'End processing: '||cur_month_yyyymm);
  END COVERAGE;
  --------------------------------------------------------------
 
  PROCEDURE FREELOOK_CONTRACTS(cur_month_yyyymm in NUMBER) AS
   
    BEGIN
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'FREELOOK_CONTRACTS', 'Begin processing: '||cur_month_yyyymm);
   
    MERGE INTO BANCA_FV A
    USING (
    with dat1 as (
    SELECT CST_NBR, AR_ID
    FROM TBL_BANCA
    WHERE CST_NBR IS NOT NULL
    AND STATUS IN ('FREELOOK')
    AND MONTH_ID = cur_month_yyyymm
    )
    select cst_nbr, cur_month_yyyymm AS MONTH_ID,
    COUNT(DISTINCT AR_ID) AS CNT_FREELOOK_CONTRACTS
    from dat1
    group by cst_nbr
    ) B
    ON (A.CST_NBR = B.CST_NBR AND  A.MONTH_ID = B.MONTH_ID)
    WHEN MATCHED THEN UPDATE SET
        A.CNT_FREELOOK_CONTRACTS = B.CNT_FREELOOK_CONTRACTS 
    WHEN NOT MATCHED then
     INSERT (A.CST_NBR,   A.MONTH_ID, A.CNT_FREELOOK_CONTRACTS)
     VALUES (B.CST_NBR,   B.MONTH_ID, B.CNT_FREELOOK_CONTRACTS) ;
    COMMIT;
    PKG_LOGS.log('PKG_ANP_BANCA_FV', 'FREELOOK_CONTRACTS', 'End processing: '||cur_month_yyyymm);
    END FREELOOK_CONTRACTS ;
--------END OF PACKAGE--------
END PKG_ANP_BANCA_FV;

Fix Code: Package Card Transaction

create or replace PACKAGE BODY PKG_ANP_ALL_CARD_TXN AS --DONE

  PROCEDURE ALL_CARD_TXN(cur_month_yyyymm IN number) AS
  BEGIN
 
  PKG_LOGS.log('PKG_ANP_ALL_CARD_TXN', 'ALL_CARD_TXN', 'Begin processing: '||cur_month_yyyymm);
  delete from TBL_FULL_CARD_TXN where MONTH_ID = cur_month_yyyymm;
  commit;
 
    INSERT /*+ APPEND NOLOGGING */ INTO TBL_FULL_CARD_TXN (CUSID, MONTH_ID, CARD_TYPE, ENTERTAINMENT_AMT, ENTERTAINMENT_CNT, RESTAURANT_AMT, RESTAURANT_CNT, HOTEL_AMT, HOTEL_CNT, HOSPITAL_AMT, HOSPITAL_CNT, SPA_AMT, SPA_CNT, SUPERMARKET_AMT, SUPERMARKET_CNT, SHOPPING_AMT, SHOPPING_CNT, KID_AMT, KID_CNT, BANK_AMT, BANK_CNT, OTHER_AMT, OTHER_CNT, SCHOOL_AMT, SCHOOL_CNT, AIRLINE_AMT, AIRLINE_CNT, VEHICLE_AMT, VEHICLE_CNT, OnlPay_AMT, OnlPay_CNT, TAX_AMT, TAX_CNT, FASHION_AMT, FASHION_CNT, HomeSer_AMT, HomeSer_CNT, PUBTRANS_AMT, PUBTRANS_CNT, PRITRANS_AMT, PRITRANS_CNT, FINANCE_AMT, FINANCE_CNT, PerSer_AMT, PerSer_CNT, OFFSER_AMT, OFFSER_CNT, EDUCATION_AMT, EDUCATION_CNT)


    with dat as
    (
      SELECT C.cst_nbr cusid,
          A.CDR_MTH_ID month_id,
          case when b.ACS_FCY_TP_CODE  IN ('CR_CARD') then 'CR_CARD' else 'DB_CARD' end CARD_TYPE,
          F.MCC_ANP_LVV2,
   
          SUM(TOT_TXN_AMT_LCY) TOT_TXN_AMT_LCY,
          sum(TOT_TXN_AMT_FCY) TOT_TXN_FCY,
          SUM(TOT_NBR_OF_TXN) TOT_NBR_OF_TXN
        FROM EDW_DMT.CMS_TXN_ANL_FCT_MO a ,
              EDW_DMT.AR_ACS_FCY_DIM b,
              EDW_DMT.CST_DIM C,
              EDW_DMT.ccy_dim d,
              anp_mcc_202001 F
        WHERE 1 =1
        AND A.CDR_MTH_ID = cur_month_yyyymm---UPDATE TIME WINDOW
        AND a.ar_dim_id         =b.ar_dim_id
        AND a.CST_DIM_ID        =c.CST_DIM_ID
        and a.ccy_dim_id = d.ccy_dim_id     
        and c.BSN_LINE = 'RETAIL' --Tung them ne :)
        AND a.MRCH_CGY_DIM_ID   =F.MRCH_CGY_DIM_ID
        AND b.ACS_FCY_TP_CODE  IN ('CR_CARD','LDR_CARD','DB_CARD') ----card only
        AND A.TXN_CGY_DIM_ID   IN (502, 541) ----withdraw, purchase
        AND A.TXN_LCS_TP_DIM_ID =1 --SUCCESS TXN
        AND a.tot_nbr_of_txn    >0
       
        GROUP BY C.cst_nbr,
          A.CDR_MTH_ID,
          case when b.ACS_FCY_TP_CODE  IN ('CR_CARD') then 'CR_CARD' else 'DB_CARD' end,
   
          F.MCC_ANP_LVV2
    ) , dat1 as
    (
    SELECT * FROM (SELECT cusid,month_id ,CARD_TYPE,MCC_ANP_LVV2,TOT_TXN_AMT_LCY,TOT_NBR_OF_TXN FROM DAT)
        PIVOT
        (SUM(TOT_TXN_AMT_LCY) AMT,
        SUM(TOT_NBR_OF_TXN) CNT
   
        FOR MCC_ANP_LVV2 IN
        ('Entertainment' Entertainment,
        'RESTAURANT' RESTAURANT,'Hotel' Hotel,'Hospital' Hospital,'Healthcare/Spa' SPA,'Supermarket' Supermarket,'Shopping' Shopping,
          'Kid' Kid,'Bank' Bank,'Other' Other,'Office_School_Supplies' School,'Airline' Airline,'Vehicle' Vehicle,'Online_payment' OnlPay,'Tax' Tax,'Fashion' Fashion,'Home_services' HomeSer,
          'PUBLIC_TRANSPORT' PUBTRANS,'Private_TRANSPORT' PRITRANS,'Finance' Finance,'Personal_services' PerSer,'Office_services'OffSer,'Education' Education
        )
        )
    ) select * from dat1;
  PKG_LOGS.log('PKG_ANP_ALL_CARD_TXN', 'ALL_CARD_TXN', 'End processing: '||cur_month_yyyymm); 
  commit;
  END ALL_CARD_TXN;

END PKG_ANP_ALL_CARD_TXN;

Tuesday, 12 May 2020

SQL Sever LOOP


select a.Customer_id
,'201801' as month_id
,b.segment_final
,case
when c.cussince < '20180101' then 'Existing'
else 'New'
end Cus_type
,SUM (a.NOTRANS_1M) no_tran
from [DC-ACI-DB].MONTHLY.dbo.CURRACCOUNT_201801 a
left join [DC-ACI-DB].MONTHLY.dbo.BUDGET2020_CUS_SEGMENT_201907 b
on a.Customer_id= b.cusid
left join [DC-ACI-DB].ACI_Common.dbo.customers_dwh c
on a.Customer_id= c.cusid
group by a.Customer_id
,b.segment_final
,case
when c.cussince < '20180101' then 'Existing' else 'New' end

----------------------------------------------------------------------------
drop TABLE #TMP_CAS_0712
CREATE TABLE #TMP_CAS_0712
(
CUSID VARCHAR(20),
MONTH_ID VARCHAR(20),
segment_final VARCHAR(20),
custype VARCHAR(20),
no_trans float

)

DECLARE @TU_NGAY VARCHAR(20)
DECLARE @DEN_NGAY VARCHAR(20)
DECLARE @TBL_TOI VARCHAR(1000)

SET @TU_NGAY = '201807'
SET @DEN_NGAY = '201812'
WHILE @TU_NGAY <= @DEN_NGAY
BEGIN
PRINT @TU_NGAY
SET @TBL_TOI = '[DC-ACI-DB].MONTHLY.dbo.CURRACCOUNT_' + @TU_NGAY
PRINT @TBL_TOI
EXEC
('
INSERT INTO #TMP_CAS_0712(CUSID, MONTH_ID, segment_final,custype,no_trans)
SELECT a.Customer_id
,'+@TU_NGAY+' as month_id
,b.segment_final
,case when c.cussince < ''20180101'' then ''Existing''
else ''New''
end Cus_type
,SUM (a.NOTRANS_1M) no_tran
from '+@TBL_TOI+' a
LEFT JOIN [DC-ACI-DB].MONTHLY.dbo.BUDGET2020_CUS_SEGMENT_201907 b
ON a.Customer_id= b.cusid
LEFT JOIN [DC-ACI-DB].ACI_Common.dbo.customers_dwh c
ON a.Customer_id= c.cusid
GROUP BY a.Customer_id
,b.segment_final
,case when c.cussince < ''20180101'' then ''Existing'' else ''New'' end
')
SET @TU_NGAY = CONVERT(VARCHAR(6), DATEADD(MONTH,1,@TU_NGAY + '01'),112)
END
SELECT *
INTO ANL.dbo.PHU_CASA_BUONBUON_0712
FROM #TMP_CAS_0712;

---------------------------------------------
CREATE TABLE #TMP_CAS_0712
(
CUSID VARCHAR(20),
MONTH_ID VARCHAR(20),
segment_final VARCHAR(20),
custype VARCHAR(20),
no_trans float

)

DECLARE @TU_NGAY VARCHAR(20)
DECLARE @DEN_NGAY VARCHAR(20)
DECLARE @TBL_TOI VARCHAR(1000)

SET @TU_NGAY = '201807'
SET @DEN_NGAY = '201812'
WHILE @TU_NGAY <= @DEN_NGAY
BEGIN
PRINT @TU_NGAY
SET @TBL_TOI = '[DC-ACI-DB].MONTHLY.dbo.CURRACCOUNT_' + @TU_NGAY
PRINT @TBL_TOI
EXEC
('
INSERT INTO #TMP_CAS_0712(CUSID, MONTH_ID, segment_final,custype,no_trans)
SELECT a.Customer_id
,'+@TU_NGAY+' as month_id
,b.segment_final
,case when c.cussince < ''20180101'' then ''Existing''
else ''New''
end Cus_type
,SUM (a.NOTRANS_1M) no_tran
from '+@TBL_TOI+' a
LEFT JOIN [DC-ACI-DB].MONTHLY.dbo.BUDGET2020_CUS_SEGMENT_201907 b
ON a.Customer_id= b.cusid
LEFT JOIN [DC-ACI-DB].ACI_Common.dbo.customers_dwh c
ON a.Customer_id= c.cusid
GROUP BY a.Customer_id
,b.segment_final
,case when c.cussince < ''20180101'' then ''Existing'' else ''New'' end
')
SET @TU_NGAY = CONVERT(VARCHAR(6), DATEADD(MONTH,1,@TU_NGAY + '01'),112)
END
SELECT *
INTO ANL.dbo.PHU_CASA_BUONBUON_0712
FROM #TMP_CAS_0712;

----------------------------
SELECT month_id, count (distinct cusid)
FROM ANL.dbo.PHU_CASA_BUONBUON_071218 group by month_id
--------------------------------------------------------------

CREATE TABLE #TMP_CAS_010619
(
CUSID VARCHAR(20),
MONTH_ID VARCHAR(20),
segment_final VARCHAR(20),
custype VARCHAR(20),
no_trans float

)

DECLARE @TU_NGAY VARCHAR(20)
DECLARE @DEN_NGAY VARCHAR(20)
DECLARE @TBL_TOI VARCHAR(1000)

SET @TU_NGAY = '201901'
SET @DEN_NGAY = '201906'
WHILE @TU_NGAY <= @DEN_NGAY
BEGIN
PRINT @TU_NGAY
SET @TBL_TOI = '[DC-ACI-DB].MONTHLY.dbo.CURRACCOUNT_' + @TU_NGAY
PRINT @TBL_TOI
EXEC
('
INSERT INTO #TMP_CAS_010619(CUSID, MONTH_ID, segment_final,custype,no_trans)
SELECT a.Customer_id
,'+@TU_NGAY+' as month_id
,b.segment_final
,case when c.cussince < ''20190101'' then ''Existing''
else ''New''
end Cus_type
,SUM (a.NOTRANS_1M) no_tran
from '+@TBL_TOI+' a
LEFT JOIN [DC-ACI-DB].MONTHLY.dbo.BUDGET2020_CUS_SEGMENT_201907 b
ON a.Customer_id= b.cusid
LEFT JOIN [DC-ACI-DB].ACI_Common.dbo.customers_dwh c
ON a.Customer_id= c.cusid
GROUP BY a.Customer_id
,b.segment_final
,case when c.cussince < ''20190101'' then ''Existing'' else ''New'' end
')
SET @TU_NGAY = CONVERT(VARCHAR(6), DATEADD(MONTH,1,@TU_NGAY + '01'),112)
END
SELECT *
INTO ANL.dbo.PHU_CASA_BUONBUON_010619
FROM #TMP_CAS_010619;

select month_id, count(distinct cusid) from ANL.dbo.PHU_CASA_BUONBUON_010619 group by month_id ;

select cusid, min_start_date from [DC-ACI-DB].ACI_Echannel.[dbo].[cus_ebank_20190930];

SELECT * FROM ANL.DBO.CUS_ALL_MASK WHERE CUSID ='33725918'

select * from [DC-ACI-DB].[aci_COMMON].

Monday, 6 January 2020

How to Use Big Data to Your Advantage: A/B Testing

How Does A/B Testing Work?

You start an A/B test by deciding what it is you want to test. Fung gives a simple example: the size of the subscribe button on your website. Then you need to know how you want to evaluate its performance. In this case, let’s say your metric is the number of visitors who click on the button. To run the test, you show two sets of users (assigned at random when they visit the site) the different versions (where the only thing different is the size of the button) and determine which influenced your success metric the most. In this case, which button size caused more visitors to click?

How Do Companies Use A/B Testing?

The popularity of the methodology has risen as companies have realized that the online environment is well suited to help managers, especially marketers, answer questions like, “What is most likely to make people click? Or buy our product? Or register with our site?” A/B testing is now used to evaluate everything from website design to online offers to headlines to product descriptions. 
Understanding statistical metrics before deploying A/B Testing:
What a null hypothesis is? A null hypothesis, proposes that no significant difference exists in a set of given observations.
What is Critical Value? Critical values tell us that what is the probability of two sample means belonging to the same distribution.
A T-test to compare the mean of two given samples.

Chi-squared test is used to compare categorical variables.
ANOVA, also known as analysis of variance, is used to compare multiple (three or more) samples with a single test. There are 2 major flavors of ANOVA
1. One-way ANOVA: It is used to compare the difference between the three or more samples/groups of a single independent variable.
2. MANOVA: MANOVA allows us to test the effect of one or more independent variable on two or more dependent variables. In addition, MANOVA can also detect the difference in co-relation between dependent variables given the groups of independent variables.
The hypothesis being tested in ANOVA is
Null: All pairs of samples are same i.e. all sample means are equal
Alternate: At least one pair of samples is significantly different

Friday, 3 January 2020

Basket analysis/ Association Rule