import pandas as pd #преобразование данных
import sqlalchemy as db #соединение с БД
import numpy as np #поиск максимальной даты
import datetime as dt #экспорт необходимых библиотек, преобразование дат
import pickle #глобальная переменная
with open('connection.pkl', 'rb') as f:
connection = pickle.load(f) # чтение переменной
connection = db.create_engine(connection) #подключение к БД
query_leads = "SELECT \"Leads\".* FROM \"Leads\"" #создаем переменные с запросом формирование запроса к таблице Leads, слэши - экранирование кавычек
query_calls = "SELECT \"Calls\".* FROM \"Calls\"" #формирование запроса к таблице Calls
Leads=pd.DataFrame(connection.execute(query_leads).fetchall()) #выполнение запроса к таблице Leads, переменная содержит DF таблицы
Calls=pd.DataFrame(connection.execute(query_calls).fetchall()) #выполнение запроса к таблице Calls
options_status = ['Win']
Leads = Leads[Leads['Status'].isin(options_status)] #фильтрация поля Status по значению Win
Leads= Leads.groupby(['Client_ID']) #группировка по Client_ID
Leads = Leads.agg(Maximum_Date=('Close_date', np.max)) #поиск максимальной даты в группировке
Leads['current_date'] = pd.to_datetime(dt.datetime.now().date()) #добавление столбца с текущей датой
Leads['diff'] = Leads['current_date'] - Leads['Maximum_Date'] #вычисление разницы между текущей даты и максимальной даты
Leads['diff'] = Leads['diff'].astype(np.int64) // 10**9 // 86400 #преобразование типа данных для значения разницы
def klass_func(row):
if row['diff'] < 30:
return 'ОК'
elif row['diff'] >= 30 and row['diff'] < 60:
return 'Теряем'
else:
return 'Потеряли' #условие для параметра
Leads['klass']=Leads.apply(lambda row: klass_func(row), axis=1) #применения условия
Calls = Calls.groupby(['Client_ID']) #группировка по Client_ID
Calls = Calls.agg(Maximum_Date=('Date', np.max)) #поиск максимальной даты в группировке
Calls['current_date'] = pd.to_datetime(dt.datetime.now().date()) #добавление столбца с текущей датой
Calls['diff'] = Calls['current_date'] - Calls['Maximum_Date'] #вычисление разницы между текущей даты и максимальной даты
Calls['diff'] = Calls['diff'].astype(np.int64) // 10**9 // 86400 #преобразование типа данных для значения разницы
Calls['klass'] = ['На связи' if x >=0 and x < 14 else 'Не контактируем' for x in Calls['diff']] #условие для параметра и его применения
Leads_calls = pd.merge(Leads, Calls, on='Client_ID', how='left') #объединение таблиц
Leads_calls.to_csv('Leads_calls.csv', index=True) #экспорт итоговой таблицы в CSV
Домашнее задание
ЗАДАЧА СО ЗВёздочкой
Помните, что для самых активных участников чата заготовлены призы от Visiology! ;)