delta = stop - start # Определение фиксации продолжительности отработки блока
print (delta) # Вывод продолжительности отработки блока
df201703tr = df201703[df201703.VIASAT_ON == 1] # Получение всех записей со значением целевой метки, равным 1
df201703fls = df201703[df201703.VIASAT_ON == 0].sample(60000, axis = 0) # Получение всех записей с негативными исходами,
# выделение случайным образом выборки объемом 60000 записей
del df201703 # Удаление DataFrame со свеми данными за период 201703 (с целью освобождения памяти)
# Аналогичное получение DataFrame с данными за 201704 из таблицы MA_CLIENT_DATA_MART
start = datetime.datetime.now()
conn = None
sql_query = 'SELECT DISTINCT viasat_on, z.* FROM MA_CLIENT_DATA_MART_201704 z INNER JOIN (SELECT id_client, \
billing_id, viasat_on from CA_201704) d ON d.id_client = z.id_client and d.billing_id = z.billing_id \
WHERE viasat_on IS NOT NULL'
try:
conn = cx_Oracle.connect("ext_consult/GfhjkmGjlhzlxbrf@DM")
try:
curs = conn.cursor()
curs.execute(sql_query)
headers = [ x[0] for x in curs.description]
data = curs.fetchall()
df201704 = pd.DataFrame( data, columns=headers)
print(df201704)
finally:
curs.close()
finally:
if conn is not None:
conn.close()
stop = datetime.datetime.now()
delta = stop - start
print (delta)
df201704tr = df201704[df201704.VIASAT_ON == 1] # Получение всех записей со значением целевой метки, равным 1
df201704fls = df201704[df201704.VIASAT_ON == 0].sample(60000, axis = 0) # Получение всех записей с негативными исходами,
# выделение случайным образом выборки объемом 60000 записей
del df201704 # Удаление DataFrame со свеми данными за период 201703 (с целью освобождения памяти)
# Получение DataFrame с данными за 201705 из таблицы MA_CLIENT_DATA_MART
start = datetime.datetime.now()
conn = None
sql_query = 'SELECT DISTINCT viasat_on, z.* FROM MA_CLIENT_DATA_MART_201705 z INNER JOIN (SELECT id_client, \
billing_id, viasat_on from CA_201705) d ON d.id_client = z.id_client and d.billing_id = z.billing_id \
WHERE viasat_on IS NOT NULL'
try:
conn = cx_Oracle.connect("ext_consult/GfhjkmGjlhzlxbrf@DM")
try:
curs = conn.cursor()
curs.execute(sql_query)
headers = [ x[0] for x in curs.description]
data = curs.fetchall()
df201705 = pd.DataFrame( data, columns=headers)
#df.to_csv('test_data_from_OracleDB1.csv', sep=';', encoding='utf-8')
print(df201705)
finally:
curs.close()
finally:
if conn is not None:
conn.close()
stop = datetime.datetime.now()
delta = stop - start
print (delta)
df201705tr = df201705[df201705.VIASAT_ON == 1] # Получение всех записей со значением целевой метки, равным 1
df201705fls = df201705[df201705.VIASAT_ON == 0].sample(60000, axis = 0) # Получение всех записей с негативными исходами,
# выделение случайным образом выборки объемом 60000 записей
del df201705 # Удаление DataFrame со свеми данными за период 201703 (с целью освобождения памяти)
df = pd.concat([df201703tr, df201703fls, df201704tr, df201704fls, df201705tr, df201705fls], axis = 0, ignore_index = True)
# Вертикальная конкатенация датасетов с целевой меткой 0 и 1 за 201703, 201704, 201705
df.info() # Выводим информацию о DataFrame
df.head() # Выводим первые 5 строк DataFrame
# Создание пользовательской функции для расчета среднего значения для каждого поля вечественного массива numpy
def calculate_means(numeric_data):
means = np.zeros(numeric_data.shape[1])
for j in range(numeric_data.shape[1]):
to_sum = numeric_data.iloc[:,j]
indices = np.nonzero(~numeric_data.iloc[:,j].isnull())[0]
correction = np.amax(to_sum[indices])
to_sum /= correction
for i in indices:
means[j] += to_sum[i]
means[j] /= indices.size
means[j] *= correction
return pd.Series(means, numeric_data.columns)
# Проверка DataFrmae на наличие пустых значений
df.isnull().values.any()
# Формирование dummy на основе категориальных признаков
df = pd.get_dummies(df, columns = ['AG_IKTV_TARIFF','AG_INTER_TARIFF_NAME','AG_KTV_TARIFF','AG_TEL_TARIFF'], drop_first = True)
# Формирование обучающих меток
train_labels = df['VIASAT_ON']
# Формирование обучающих данных
train_data = df.drop(['VIASAT_ON','ID_CLIENT','CALC_PERIOD','BILLING_ID','CL_ID_BI',\
'CL_ID_LOYALTY','CL_BILLING_ID','CL_BTHDAY','CL_TEL_CNT',\
'CL_DAYS_FORMER_TO_CURRENT','CL_AGE','AG_CATCHUP_DATE','AG_CATCHUP_DATE_CLOSE',\
'AG_INTER_ID','AG_MULTIROOM_DATE','AG_MULTISCR_DATE','AG_SERVICE_1593_DATE','AG_SERVICE_1639_DATE',
'AG_SERVICE_243_DATE','APC_ALTYN','APC_AMEDIA','APC_AMEDIAPREMIUMHD','APC_BAZOVYYHD','APC_BAZOVYYHDMINI',
'APC_BAZOVYYMINI','APC_BESSONNITSA','APC_BESSONNITSA_84','APC_DETSKIY1','APC_DETSKIY2','APC_DOZHD',
'APC_GEYMER','APC_HDMAKSIMUM','APC_HDMAX','APC_HDSTART','APC_KHLHD','APC_KINO1','APC_KINO2',
'APC_KINOIMUZYKAHD','APC_MATCHFUTBOL','APC_MATCHSPORT','APC_MEZHDUNARODNYY','APC_MIKSHD',
'APC_MUZYKA1','APC_MUZYKA2','APC_NASHFUTBOL','APC_NASTOYASCHIYMUZHSKOY','APC_NASTROYKINO',
'APC_NATSIONALNYY','APC_NOVOSTI','APC_NTVPLYUSFUTBOL','APC_NTVPLYUSSPORT','APC_OKRUZHAYUSCHIYMIR',
'APC_POZNANIE','APC_PUTESHESTVIYA','APC_RAZVLECHENIYA1','APC_RAZVLECHENIYA2','APC_RUSSKOEKINO',
'APC_SERIALY','APC_SHANTPREMIUMHD','APC_SPORT1','APC_SPORT2','APC_SPORTIUVLECHENIYAHD',
'APC_STANDARTNYYHD','APC_STANDARTNYYHDMINI','APC_STARTOVYY','APC_TSIFROVOYHD','APC_TSIFROVOYHDNEW',
'APC_UDIVITELNAYAPLANETA','APC_UMKA','APC_UMKAOLD','APC_UVLECHENIYA1','APC_UVLECHENIYA2',
'APC_VIASATPREMIUMHD','APC_VIASATPREMIUMHDOLD'], axis = 1)
# Заполнение пропусков в тренировочных данных средними
train_data = train_data.fillna(calculate_means(numeric_data))
# Проверка на наличие пропусков в тренировочных данных
train_data.isnull().values.any()
# Информация о тренировочном датасете
train_data.info()
# Определение алгоритма фильтрации по параметру fscore
select = SelectKBest(f_classif, k = 40) # Ищем 40 наиболее значимых показателей
X_new = select.fit(train_data, train_labels) # Обучаем созданный фильтр
mask = X_new.get_support() # Получить маску с индексами выбранных предикторов
sc = X_new.scores_ # Получить значимость выбранных предикторов
new_train_data = [] # Определение массива, который будет содержать список наиболее значимых предикторов с весами
for bool, feature, score in zip(mask, train_data, sc): # Для маски с индексами подбираем названия атрибутов
if bool:
new_train_data.append([feature, score])
new_train_data.to_csv('Important_features.csv')
new_train_data # Вывод наиболее значимых показателей с весами на экран
import numpy as np
import pandas as pd
import cx_Oracle
import datetime
import sklearn
from sklearn import feature_selection, linear_model
from sklearn.feature_selection import chi2, f_classif, SelectKBest
import os
os.environ['NLS_LANG'] = 'American_America.AL32UTF8'
start = datetime.datetime.now()
conn = None
sql_query = 'SELECT DISTINCT viasat_on, z.* FROM MA_NAPA_DPI_CAT_201703 z INNER JOIN (SELECT id_client, \
billing_id, viasat_on from CA_201703) d ON d.id_client = z.client_id and d.billing_id = z.city_id \
WHERE viasat_on IS NOT NULL'
try:
conn = cx_Oracle.connect("ext_consult/GfhjkmGjlhzlxbrf@DM")
try:
curs = conn.cursor()
curs.execute(sql_query)
headers = [ x[0] for x in curs.description]
data = curs.fetchall()
df201703 = pd.DataFrame( data, columns=headers)
#df.to_csv('test_data_from_OracleDB1.csv', sep=';', encoding='utf-8')
print(df201703)
finally:
curs.close()
finally:
if conn is not None:
conn.close()
stop = datetime.datetime.now()
delta = stop - start
print (delta)
df201703tr = df201703[df201703.VIASAT_ON == 1]
df201703fls = df201703[df201703.VIASAT_ON == 0].sample(60000, axis = 0)
del df201703
start = datetime.datetime.now()
conn = None
sql_query = 'SELECT DISTINCT viasat_on, z.* FROM MA_NAPA_DPI_CAT_201704 z INNER JOIN (SELECT id_client, \
billing_id, viasat_on from CA_201704) d ON d.id_client = z.client_id and d.billing_id = z.city_id \
WHERE viasat_on IS NOT NULL'
try:
conn = cx_Oracle.connect("ext_consult/GfhjkmGjlhzlxbrf@DM")
try:
curs = conn.cursor()
curs.execute(sql_query)
headers = [ x[0] for x in curs.description]
data = curs.fetchall()
df201704 = pd.DataFrame( data, columns=headers)
#df.to_csv('test_data_from_OracleDB1.csv', sep=';', encoding='utf-8')
print(df201704)
finally:
curs.close()
finally:
if conn is not None:
conn.close()
stop = datetime.datetime.now()
delta = stop - start
print (delta)
df201704tr = df201704[df201704.VIASAT_ON == 1]
df201704fls = df201704[df201704.VIASAT_ON == 0].sample(60000, axis = 0)
del df201704
start = datetime.datetime.now()
conn = None
sql_query = 'SELECT DISTINCT viasat_on, z.* FROM MA_NAPA_DPI_CAT_201705 z INNER JOIN (SELECT id_client, \
billing_id, viasat_on from CA_201705) d ON d.id_client = z.client_id and d.billing_id = z.city_id \
WHERE viasat_on IS NOT NULL'
try:
conn = cx_Oracle.connect("ext_consult/GfhjkmGjlhzlxbrf@DM")
try:
curs = conn.cursor()
curs.execute(sql_query)
headers = [ x[0] for x in curs.description]
data = curs.fetchall()
df201705 = pd.DataFrame( data, columns=headers)
#df.to_csv('test_data_from_OracleDB1.csv', sep=';', encoding='utf-8')
print(df201705)
finally:
curs.close()
finally:
if conn is not None:
conn.close()
stop = datetime.datetime.now()
delta = stop - start
print (delta)
df201705tr = df201705[df201705.VIASAT_ON == 1]
df201705fls = df201705[df201705.VIASAT_ON == 0].sample(60000, axis = 0)
del df201705
df = pd.concat([df201703tr, df201703fls, df201704tr, df201704fls, df201705tr, df201705fls], axis = 0, ignore_index = True)
df.info()
df.head()
def calculate_means(numeric_data):
means = np.zeros(numeric_data.shape[1])
for j in range(numeric_data.shape[1]):
to_sum = numeric_data.iloc[:,j]
indices = np.nonzero(~numeric_data.iloc[:,j].isnull())[0]
correction = np.amax(to_sum[indices])
to_sum /= correction
for i in indices:
means[j] += to_sum[i]
means[j] /= indices.size
means[j] *= correction
return pd.Series(means, numeric_data.columns)
df.isnull().values.any()
df = pd.get_dummies(df, columns = ['MODEL_DEV'], drop_first = True)
train_labels = df['VIASAT_ON']
train_data = df.drop(['VIASAT_ON', 'CLIENT_ID', 'CALC_PERIOD','CITY_ID','FOR_DAY',\
'CITY_NAME','LOGIN_NAME','AGREEMENT_NUMBER','CL_ID_BI'], axis = 1)
train_data = train_data.fillna(0)
train_data.isnull().values.any()
train_data.info()
select = SelectKBest(f_classif, k = 40)
X_new = select.fit(train_data, train_labels)
mask = X_new.get_support()
sc = X_new.scores_
new_train_data = []
for bool, feature, score in zip(mask, train_data, sc):
if bool:
new_train_data.append([feature, score])
new_train_data
П 2 Листинг кода модели
# Импорт библиотек
import numpy as np # Библиотека для работы с np-массивами, а также для использования некоторых метематических функуций
import pandas as pd # Библиотека для работы с csv-файлами, а также объектами DataFrame
import cx_Oracle # Библиотека для подключения к Oracle и импорта данных из БД
import datetime # Библиотека для работы со временем (используется для замера времени выполнения запросов).
# По факту, можно было использовать функцию %%time, то измерение с помощью datetime является менее ресурсоемким и
# более "прозрачным"
import sklearn # Библиотека для использования методов машинного обучения и анализа данных
from sklearn import metrics, ensemble, learning_curve # Модули библиотеки sklearn для
# обучения и настройки моделей, а также для оценки их качества
import os # Библиотека для определения некоторых системных параметров (в нашем случае - кодировки окружения)
import math # Библиотека для использования математических функций
import pickle # Библиотека для формирования пиклов (сохранения важных переменных, заданных в скрипте)
import xgboost as xgb # Библиотека для использования алгоритма градиентного бустинга
from sklearn.preprocessing import StandardScaler
%pylab inline
# Функционал для построения графиков
os.environ['NLS_LANG'] = 'American_America.AL32UTF8' # Изменение языковой схемы окружения для корректного отображения
# текстовых полей с содержанием кириллицы
# Данный блок помагает растянуть notebook по всей ширине
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
# Определение запроса SQL для получения данных за 201703
sql_query_201703 = 'SELECT DISTINCT g.VIASAT_ON, \
a.ID_CLIENT, a.BILLING_ID, a.CALC_PERIOD, CL_PRIV, ADP_AMEDIAPREMIUMHD, ADP_BAZOVYYHD, ADP_MATCHFUTBOL, ADP_NASTROYKINO, AG_BEFORE_PAID_SVOD, AG_COUNT_ACT_IKTV, \
AG_COUNT_CHANNEL_HD_TOTAL, AG_COUNT_CHANNEL_TOTAL, AG_IKTV_ARPU, AG_IKTV_TARIFF_ARCH, AG_INTER_ARPU, AG_MULTIROOM_COST, AG_MULTISCR, AG_PAY_CUR_MONTH, APP_NASTROYKINO, \
PAY_ARPU_SUMM, PAY_COUNT_ADD_PACK_DISC, \
HOME2_VISITS_DAYS_WKND_M, LEISURE2_VISITS_DAYS_WKND_M, MAX_SHOPS2_VISITS_DAY_CNT, MAX_SPORT2_VISITS_DAY_CNT, NEWS_VISITS_DAYS_WKND_M, SHOPS2_VISITS_DAYS_WKND_M, \
SHOPS2_VISITS_SHARE_M, SOC_VISITS_DAYS_WKND_M, SOCCER_VISITS_DAYS_WKND_M, SPORT2_VISITS_CNT_WKND_M, SPORT2_VISITS_DAYS_M, SPORT2_VISITS_SHARE_WORKD_M, \
CNT_AD_SERV_IKTV_CM, HAS_PC_MFUT_CM, HAS_PC_NASTKIN_CM, HAS_AD_PC_CM, CNT_TELE_AD_PC_CM, MAX_DAYS_FILM_AD_PC_CM, AG_IKTV_ARPU_CM, PAY_ARPU_SUMM_CM, HAS_ANY_AD_SERV_CM, \
CNT_FILM_AD_PC_PPM, AG_INTER_ARPU_PPM, AG_IKTV_ARPU_MORE_AVG_AAB, AG_INTER_ARPU_TO_MEDIAN_AAB, AG_INTER_ARPU_MORE_MOD_AAB, PAY_ARPU_SUMM_TO_MOD_AAB, \
PAY_ARPU_SUMM_MORE_AVG_AAB, MONTHPART_PC_MFUT_CM, MONTHPART_PC_NASTKIN_CM, \
MINUTES_COMMUN_CM, MINUTES_COMMUN_SPECPREDLK_CM, CNT_UNIQ_CHANNEL_CM, CNT_LOYAL_CM, MINUTES_LOYAL_CM, CNT_ESPONSE_2_CM, CNT_RESPONSE_3_CM, GP_2_OBJ_SOHR_CM, \
GP_3_OBJ_DZ_CM, MIN_ONE_COMM_SPECPREDLK_PM, CNT_COMMUN_PPM, MINUTES_COMMUN_SPECPREDLK_PPM, MINUTES_LOYAL_PPM, CNT_ESPONSE_2_PPM, CNT_LOYAL_CM_TO_PM, GP_2_OBJ_RAZVUSL_PPM, \
MAX_SPORT_HTTP_VISITS_CM, CNT_SPORT_HTTP_WKND_CM, CNT_DAYS_SPORT_HTTP_CM, SPORT_HTTP_TO_ALL_CM, CNT_DAYS_HOMELIFE_HTTP_CM, CNT_SPORT_HTTP_PM, SPORT_HTTP_CNT_TO_DAYS_PM, \
CNT_DAYS_INTBUY_HTTP_PM, FILM_HTTP_TO_ALL_PPM, CNT_DAYS_SPORT_HTTP_PPM, SPORT_HTTP_SHARE_CM_MORE_PM, INTBUY_HTTP_SHARE_CM_MORE_PM, HOMELIFE_HTTP_SHARE_CM_MORE_PM, \
NEWS_VISITS_CM_TO_PM, \
ANT_KASPERSKY_DAYS_MNTH, APP_BOOKING_DAYS_M, APP_DROPBOX_DAYS_M, APP_VIBER_DAYS_MNTH, APP_WHATSAPP_DAYS_MNTH, APP_YA_MAPS_DAYS_M, APP_YA_TAXI_DAYS_M, \
DEV_CONSOLE_PS_DAYS_MNTH, DEV_CONSOLE_XBOX_DAYS_MNTH, HTTP_VIS_ANDD_WKND_SHARE_MNTH, HTTP_VIS_S_TV_WORKD_SHARE_MNTH, OBP_SBERBANK_DAYS_M, PROTO_HTTP_DAYS_M, \
PROTO_HTTP_SHARE_MNTH, PROTO_OTHER_DAYS_M, PROTO_TORRENT_DAYS_M, PROTO_TOTAL_DAYS_M, WTHT_HTTP_VIS_S_TV_DAYS_ALL, WTHT_HTTP_VIS_WIN_M_DAYS_ALL, WTHT_HTTP_VISITS_DAYS \
FROM MA_CLIENT_DATA_MART_201703 a \
INNER JOIN MA_NAPA_DPI_CAT_201703 b ON a.ID_CLIENT = b.CLIENT_ID AND a.BILLING_ID = b.CITY_ID \
LEFT JOIN MA_NAPA_DPI_STAT_201703 c ON a.ID_CLIENT = c.CLIENT_ID AND a.BILLING_ID = c.CITY_ID \
LEFT JOIN PREDICT_BIL_201703 d ON a.ID_CLIENT = d.ID_CLIENT AND a.BILLING_ID = d.BILLING_ID \
LEFT JOIN PREDICT_CAT_201703 e ON a.ID_CLIENT = e.ID_CLIENT AND a.BILLING_ID = e.BILLING_ID \
LEFT JOIN PREDICT_CAMP_201703 f ON a.ID_CLIENT = f.ID_CLIENT AND a.BILLING_ID = f.BILLING_ID \
INNER JOIN \
(SELECT ID_CLIENT, BILLING_ID, VIASAT_ON FROM CA_201703 WHERE VIASAT_ON IS NOT NULL) g \
ON a.ID_CLIENT = g.ID_CLIENT AND a.BILLING_ID = g.BILLING_ID'
# Определение запроса SQL для получения данных за 201704
sql_query_201704 = 'SELECT DISTINCT g.VIASAT_ON, \
a.ID_CLIENT, a.BILLING_ID, a.CALC_PERIOD, CL_PRIV, ADP_AMEDIAPREMIUMHD, ADP_BAZOVYYHD, ADP_MATCHFUTBOL, ADP_NASTROYKINO, AG_BEFORE_PAID_SVOD, AG_COUNT_ACT_IKTV, \
AG_COUNT_CHANNEL_HD_TOTAL, AG_COUNT_CHANNEL_TOTAL, AG_IKTV_ARPU, AG_IKTV_TARIFF_ARCH, AG_INTER_ARPU, AG_MULTIROOM_COST, AG_MULTISCR, AG_PAY_CUR_MONTH, APP_NASTROYKINO, \
PAY_ARPU_SUMM, PAY_COUNT_ADD_PACK_DISC, \
HOME2_VISITS_DAYS_WKND_M, LEISURE2_VISITS_DAYS_WKND_M, MAX_SHOPS2_VISITS_DAY_CNT, MAX_SPORT2_VISITS_DAY_CNT, NEWS_VISITS_DAYS_WKND_M, SHOPS2_VISITS_DAYS_WKND_M, \
SHOPS2_VISITS_SHARE_M, SOC_VISITS_DAYS_WKND_M, SOCCER_VISITS_DAYS_WKND_M, SPORT2_VISITS_CNT_WKND_M, SPORT2_VISITS_DAYS_M, SPORT2_VISITS_SHARE_WORKD_M, \
CNT_AD_SERV_IKTV_CM, HAS_PC_MFUT_CM, HAS_PC_NASTKIN_CM, HAS_AD_PC_CM, CNT_TELE_AD_PC_CM, MAX_DAYS_FILM_AD_PC_CM, AG_IKTV_ARPU_CM, PAY_ARPU_SUMM_CM, HAS_ANY_AD_SERV_CM, \
CNT_FILM_AD_PC_PPM, AG_INTER_ARPU_PPM, AG_IKTV_ARPU_MORE_AVG_AAB, AG_INTER_ARPU_TO_MEDIAN_AAB, AG_INTER_ARPU_MORE_MOD_AAB, PAY_ARPU_SUMM_TO_MOD_AAB, \
PAY_ARPU_SUMM_MORE_AVG_AAB, MONTHPART_PC_MFUT_CM, MONTHPART_PC_NASTKIN_CM, \
MINUTES_COMMUN_CM, MINUTES_COMMUN_SPECPREDLK_CM, CNT_UNIQ_CHANNEL_CM, CNT_LOYAL_CM, MINUTES_LOYAL_CM, CNT_ESPONSE_2_CM, CNT_RESPONSE_3_CM, GP_2_OBJ_SOHR_CM, \
GP_3_OBJ_DZ_CM, MIN_ONE_COMM_SPECPREDLK_PM, CNT_COMMUN_PPM, MINUTES_COMMUN_SPECPREDLK_PPM, MINUTES_LOYAL_PPM, CNT_ESPONSE_2_PPM, CNT_LOYAL_CM_TO_PM, GP_2_OBJ_RAZVUSL_PPM, \
MAX_SPORT_HTTP_VISITS_CM, CNT_SPORT_HTTP_WKND_CM, CNT_DAYS_SPORT_HTTP_CM, SPORT_HTTP_TO_ALL_CM, CNT_DAYS_HOMELIFE_HTTP_CM, CNT_SPORT_HTTP_PM, SPORT_HTTP_CNT_TO_DAYS_PM, \
CNT_DAYS_INTBUY_HTTP_PM, FILM_HTTP_TO_ALL_PPM, CNT_DAYS_SPORT_HTTP_PPM, SPORT_HTTP_SHARE_CM_MORE_PM, INTBUY_HTTP_SHARE_CM_MORE_PM, HOMELIFE_HTTP_SHARE_CM_MORE_PM, \
NEWS_VISITS_CM_TO_PM, \
ANT_KASPERSKY_DAYS_MNTH, APP_BOOKING_DAYS_M, APP_DROPBOX_DAYS_M, APP_VIBER_DAYS_MNTH, APP_WHATSAPP_DAYS_MNTH, APP_YA_MAPS_DAYS_M, APP_YA_TAXI_DAYS_M, \
DEV_CONSOLE_PS_DAYS_MNTH, DEV_CONSOLE_XBOX_DAYS_MNTH, HTTP_VIS_ANDD_WKND_SHARE_MNTH, HTTP_VIS_S_TV_WORKD_SHARE_MNTH, OBP_SBERBANK_DAYS_M, PROTO_HTTP_DAYS_M, \
PROTO_HTTP_SHARE_MNTH, PROTO_OTHER_DAYS_M, PROTO_TORRENT_DAYS_M, PROTO_TOTAL_DAYS_M, WTHT_HTTP_VIS_S_TV_DAYS_ALL, WTHT_HTTP_VIS_WIN_M_DAYS_ALL, WTHT_HTTP_VISITS_DAYS \
FROM MA_CLIENT_DATA_MART_201704 a \
INNER JOIN MA_NAPA_DPI_CAT_201704 b ON a.ID_CLIENT = b.CLIENT_ID AND a.BILLING_ID = b.CITY_ID \