Para que
Con la compleja estructura de las campa帽as publicitarias y una gran cantidad de llamadas, se hacen necesarias herramientas adicionales para almacenar, procesar y analizar informaci贸n sobre las llamadas entrantes. A menudo necesita un acceso r谩pido a los datos durante un largo per铆odo de tiempo. A veces necesita un procesamiento de datos complejo, correlacionando llamadas a un canal o campa帽a espec铆ficos.
Una de las opciones para acelerar el trabajo, que tambi茅n proporciona beneficios adicionales, es importar llamadas de CoMagic a Google BigQuery. Mucho se ha escrito sobre los beneficios de BigQuery, as铆 que pasemos a la creaci贸n.
Para crear una importaci贸n autom谩tica, necesitar谩:
- Cuenta de Google (si a煤n no lo est谩) con el proyecto creado
- Conocimiento de Python
- Presentaci贸n de la documentaci贸n de Google Cloud
Aqu铆 se describe c贸mo crear un proyecto. Despu茅s de crear el proyecto, debe crear un conjunto de datos en BigQuery.
Documentaci贸n de BQ e
instrucciones para crear un conjunto de datos .
Recuperando datos de CoMagic
Volviendo a la
documentaci贸n de CoMagic. Para obtener una lista de llamadas o llamadas, necesitamos la secci贸n de informes.
Creamos una clase simple para trabajar con la API de CoMagic. Todos los requisitos necesarios se indicar谩n al final en el enlace a GitHub.
import json import requests import random import pandas as pd class ComagicClient: """ CoMagic""" def __init__(self, login, password): """ CoMagic""" self.login = login self.password = password self.base_url = 'https://dataapi.comagic.ru/v2.0' self.payload_ = {"jsonrpc":"2.0", "id":1, "method":None, "params": None} self.token = self.get_token(self.login, self.password) def base_request(self, method, params): """ CoMagic. API . JSON-like . : https://www.comagic.ru/support/api/data-api/""" id_ = random.randrange(10**7)
Ahora debe determinar qu茅 tipo de datos se necesitan. Los datos deben procesarse y hacerse visibles para poder cargarlos en BigQuery.
Cree una clase auxiliar y defina los datos recibidos de CoMagic.
class ComagicHandler(ComagicClient): """ , CoMagic""" time_partition_field = 'PARTITION_DATE' def __init__(self, login, password, first_call_date): self.day_before_first_call = pd.to_datetime(first_call_date) - pd.Timedelta(days=1) super().__init__(login, password) def get_calls_report(self, date_from, date_till): """ . . Pandas DataFrame. . Connector . . . Pnadas.DataFrame""" method = "get.calls_report" fields = ['id', 'visitor_id', 'person_id', 'start_time', 'finish_reason', 'is_lost', 'tags', 'campaign_name','communication_number', 'contact_phone_number', 'talk_duration', 'clean_talk_duration', 'virtual_phone_number', 'ua_client_id', 'ym_client_id', 'entrance_page', 'gclid', 'yclid', 'visitor_type', 'visits_count', 'visitor_first_campaign_name', 'visitor_device', 'site_domain_name','utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'eq_utm_source', 'eq_utm_medium', 'eq_utm_campaign', 'attributes']
Env铆o de datos a BigQuery
Despu茅s de recibir y convertir los datos de CoMagic, debe enviarlos a BigQuery.
from google.cloud import bigquery from google.cloud.exceptions import NotFound import pandas as pd class BQTableHanler: """ BigQuery""" time_partition_field = 'PARTITION_DATE' def __init__(self, full_table_id, service_account_file_key_path = None): """ `myproject.mydataset.mytable`. , Application Default Credentials, .""" self.full_table_id = full_table_id project_id, dataset_id, table_id = full_table_id.split(".") self.project_id = project_id self.dataset_id = dataset_id self.table_id = table_id if service_account_file_key_path:
Determinar la l贸gica para actualizar los datos.
Como existe un l铆mite en el n煤mero de filas de datos recibidas de CoMagic, es necesario limitar el n煤mero de datos solicitados. Limitaremos el per铆odo de solicitud. Para hacer esto, necesita una funci贸n auxiliar que dividir谩 un gran per铆odo de tiempo en segmentos de una longitud espec铆fica.
def interval_split(array, interval): """ . , 2, - , - . : get_intervals([1,2,3,4,5,6,7], 3) => [[1,3], [4,6], [7]] get_intervals([1,2,3], 4) => [[1,3]]""" intervals = [] iw, i = 0, 0 l = len(array) for v in array: if i==0 or (i)%interval==0: intervals.append([v]) if (i+1)%interval == 0 or (i+1) == l: intervals[iw].append(v) iw+=1 i+=1 return intervals
Esto es necesario cuando se cargan datos por primera vez, cuando necesita descargar datos durante un largo per铆odo de tiempo. El per铆odo se divide en varios per铆odos peque帽os. Por cierto, es mejor hacerlo sin usar la funci贸n de nube, ya que tienen un l铆mite de tiempo. Bueno, o, como opci贸n, puede ejecutar la funci贸n muchas, muchas veces.
Creamos una clase de conector para vincular la tabla BigQuery donde queremos almacenar los datos y los datos de CoMagic.
from helpfunctions import interval_split import pandas as pd class Connector: """ """ time_partition_field = 'PARTITION_DATE'
A continuaci贸n, prescribimos la funci贸n principal para actualizar los datos, que se lanzar谩n en un horario.
from connector import Connector from bqhandler import BQTableHanler from comagichandler import ComagicHandler from credfile import * def main(event, context): """ event, context : https://cloud.google.com/functions/docs/writing/background#functions-writing-background-hello-pubsub-python"""
Configurar Google Cloud Platform
Recopilamos todos los archivos en un archivo ZIP. En el archivo credfile.py, ingresamos el nombre de usuario y la contrase帽a de CoMagic para recibir el token, as铆 como el nombre completo de la tabla en BigQuery y la ruta al archivo de la cuenta de servicio si el script se inicia desde la m谩quina local.
Crear una funci贸n en la nube
- Ir a la consola
- Si a煤n no se ha creado ninguna funci贸n, haga clic en "Crear funci贸n"
- En el campo de activaci贸n, seleccione PUB / SUB
- Crea un nuevo tema para PUB / SUB. Por ejemplo, 'update_calls'
- Fuente: carga ZIP (archivo ZIP local)
- Entorno: Python 3.7
- Descargar el archivo zip
- Elegir un segmento temporal de almacenamiento en la nube
- En el campo `llamado funci贸n` escribimos 'main'
- Memoria asignada: opcional

Configuraci贸n del planificador y PUB / SUB
En el 煤ltimo paso, creamos el activador `update_calls`. Este tema autom谩tico ha aparecido en la
lista de temas .

Ahora, con Cloud Scheduler necesita configurar el disparador. cu谩ndo se disparar谩 y se iniciar谩 el GCF.
- Ir a la consola
- En el campo de frecuencia en el formato CRON, configure cu谩ndo debe dispararse el disparador y se inicia la funci贸n.
- Destino: Pub / Sub
- Asunto: registre el tema que se especific贸 al crear la funci贸n: "update_calls"
- Carga 煤til * (Carga 煤til): esta es la informaci贸n que se transferir谩 a Pub / Sub y a la funci贸n principal

Ahora el script se lanzar谩 diariamente a las 01:00 y los datos de la llamada se actualizar谩n al final del d铆a anterior.
Enlace a GitHub para ejecutar desde la computadora local
Enlace de GitHub al archivo ZIP