Дипломная работа: Разработка методики применения методов машинного обучения для решения маркетинговых задач в телекоммуникационном бизнесе

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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 \

Источник: https://otherreferats.allbest.ru/download/1003541/