Está en la página 1de 33

Actividad 1 Técnicas de Programación

1.- Leer los datos con Python. Ficheros de navegacion y conversion

Cargar el fichero de Navegación en un data_frame_Pandas

In [1]: import pandas as pd


import numpy as np
import re
In [2]: df_navega = pd.read_csv("navegacion.csv", sep=";")
print(df_navega.head(),"\n"*5,df_navega.count(),"\n"*2)
#print('Informacion del df: ', df_navega.info, '\n')

print('Numero de filas y columnas que tiene: ', df_navega.shape, '\n')
print('Numero total de datos: ', df_navega.size, '\n')
print('Nombre de las columnas: ', df_navega.columns, '\n')
print('Nombre de los indices: ', df_navega.index, '\n')
ts uuid \

0 2021-09-06 0:3:5.816 5d612df4-b04a-48b3-a398-25e542d0d7cf

1 2021-09-06 0:3:27.098 2ae80a9e-4a1d-495f-bfc7-24a2ee462cda

2 2021-09-06 0:3:30.475 e8cbd723-b9ec-4a61-8044-bd7d30756154

3 2021-09-06 0:3:48.196 c75d0e0d-f3de-4746-ae66-72fbf4d7bf71

4 2021-09-06 0:4:0.649 2817a76c-b912-49f0-b826-31d92fb38acf

id_user \

0 fe1e23b7-5925-428e-b103-c1803a8a802a

1 5fcc8b47-8fa0-4791-a6b8-6260f2ab0888

2 add08a93-d03a-449c-bf09-9c1535ce2419

3 0882f78e-0295-458a-934d-18278c31adc7

4 c33f22df-997a-481f-9d51-df94e0689d3d

gclid user_recurrent \

0 Cj0KCQjw1dGJBhD4ARIsANb6OdkNOTEPAcfCTEAhlJfk6g... True

1 Cj0KCQjw1dGJBhD4ARIsANb6OdmYnQIBLDemeVg6nbOtVV... False

2 Cj0KCQjw1dGJBhD4ARIsANb6OdkuQkoBgr2y0lU5c3la2s... False

3 Cj0KCQjw1dGJBhD4ARIsANb6OdmPt8bwmNTJnZJinw0MUh... False

4 Cj0KCQjw1dGJBhD4ARIsANb6Odnrixsd4Gcl1wcT68auuj... True

url_landing

0 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

1 https://www.metropolis.com/es/ixs-electrico?gc... (https://www.metropolis.com/es/ixs-electrico?gc...)

2 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...)

3 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...)

4 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

ts 7268

uuid 7268

id_user 7268

gclid 7268

user_recurrent 7268

url_landing 7148

dtype: int64

Numero de filas y columnas que tiene: (7268, 6)

Numero total de datos: 43608

Nombre de las columnas: Index(['ts', 'uuid', 'id_user', 'gclid', 'user_recurrent', 'url_landing'], dtype='object')

Nombre de los indices: RangeIndex(start=0, stop=7268, step=1)

Cargar el fichero de Conversión en un data_frame_Pandas


In [3]: df_convierte = pd.read_csv("conversiones.csv", sep=";")

print(df_convierte.head())
print('Numero de filas y columnas que tiene: ', df_convierte.shape, '\n')
print('Numero total de datos: ', df_convierte.size, '\n')
print('Nombre de las columnas: ', df_convierte.columns, '\n')
print('Nombre de los indices: ', df_convierte.index, '\n')
date hour id_lead id_user \

0 06/09/2021 9:06 7900 cefd8f05-8dd2-4e82-869f-1ddc57a9a4c3

1 06/09/2021 9:53 7877 None

2 06/09/2021 11:38 7878 None

3 06/09/2021 12:04 7875 None

4 06/09/2021 12:47 7873 None

gclid lead_type result

0 Cj0KCQjw1dGJBhD4ARIsANb6Odl8LjduiZVnMw6VFe8APD... FORM Ilocalizable

1 None CALL No le interesa

2 None CALL No le interesa

3 None CALL No le interesa

4 None CALL No le interesa

Numero de filas y columnas que tiene: (28, 7)

Numero total de datos: 196

Nombre de las columnas: Index(['date', 'hour', 'id_lead', 'id_user', 'gclid', 'lead_type', 'result'], dtype='object')

Nombre de los indices: RangeIndex(start=0, stop=28, step=1)

1.b Tratamiento de datos:

Si el criterio es la velocidad de tratamiento, deberíamos eliminar todo un registro (fila) cuando algún campo esté con NaN.

Un dato que no llega completo lleva a pensar que puede estar corrupto, y por tanto ¿Cual es la validez de los campos que sí están en ese registro???
Si estamos en

Análisis Masivo de datos, no parece lógico perder el tiempo tratando datos incompletos (tenemos muchos)

Además el tratamiento hace un programa pierda velocidad mirando datos que a priori no deberían haber llegado así. Por eso yo los eliminaría en Big Data, no así bases

tradicionales donde los datos son más excasos, y no hace falta tratarlos en tiempo real y es posible mirarlos con calma y analizar con criterio. Pero aquí en Big Data los

eliminaría.
(No lo voy a hacer porque en siguientes apartados se piden opciones sin id_user o sin g_clid)(y la profesora no quiere que lo hagamos)

Por tanto cambio los NaN a campos de texto vacíos para esta práctica

In [4]: df_navega = df_navega.fillna("")


print(df_navega.head())

ts uuid \

0 2021-09-06 0:3:5.816 5d612df4-b04a-48b3-a398-25e542d0d7cf

1 2021-09-06 0:3:27.098 2ae80a9e-4a1d-495f-bfc7-24a2ee462cda

2 2021-09-06 0:3:30.475 e8cbd723-b9ec-4a61-8044-bd7d30756154

3 2021-09-06 0:3:48.196 c75d0e0d-f3de-4746-ae66-72fbf4d7bf71

4 2021-09-06 0:4:0.649 2817a76c-b912-49f0-b826-31d92fb38acf

id_user \

0 fe1e23b7-5925-428e-b103-c1803a8a802a

1 5fcc8b47-8fa0-4791-a6b8-6260f2ab0888

2 add08a93-d03a-449c-bf09-9c1535ce2419

3 0882f78e-0295-458a-934d-18278c31adc7

4 c33f22df-997a-481f-9d51-df94e0689d3d

gclid user_recurrent \

0 Cj0KCQjw1dGJBhD4ARIsANb6OdkNOTEPAcfCTEAhlJfk6g... True

1 Cj0KCQjw1dGJBhD4ARIsANb6OdmYnQIBLDemeVg6nbOtVV... False

2 Cj0KCQjw1dGJBhD4ARIsANb6OdkuQkoBgr2y0lU5c3la2s... False

3 Cj0KCQjw1dGJBhD4ARIsANb6OdmPt8bwmNTJnZJinw0MUh... False

4 Cj0KCQjw1dGJBhD4ARIsANb6Odnrixsd4Gcl1wcT68auuj... True

url_landing

0 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

1 https://www.metropolis.com/es/ixs-electrico?gc... (https://www.metropolis.com/es/ixs-electrico?gc...)

2 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...)

3 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...)

4 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

2 Separar los datos en columnas campaña, adgroup, advertisement, site link

Función para filtrar las búsquedas a extraer y separar


Aplico str.split y para facilitar su entendimiento creo 1 expresion regular y 1 lista de columnas nuevas

In [7]: # Crea un nuevo dataFrame copiando del df_navega


df_navega1 = df_navega.copy()

In [8]: # Crea un nuevo dataFrame copiando del df_navega
#df_navega1 = df_navega.copy()

expresion=r"\/es\/|\?gclid\=|\?gclsrc\=|\?idUser\=|\&rec\=|\&adv\=|\&sl\=|\&device\=|\&adg\=|\&camp\=|https:\/www.metropolis.com\/
#expresion=r"\/es\/|\?gclid\=|\&rec\=|\&adv\=|\&sl\=|\&device\=|\&adg\=|\&camp\=|https:\/www.metropolis.com\/"
columnas_nuevas=["web","modelo","gclid1","campaña","adgroup","device","site_link","advertisement","rec"]
df_navega1[columnas_nuevas]=df_navega1["url_landing"].str.split(pat=expresion, n =26, expand=True)
# Debe borrar un par de columnas creadas por str.split que no se van a usar
df_navega1 = df_navega1.drop(['web', 'device','gclid1'], axis = 1)

# Queda la columna rec por si se debe usar para la estadística de recurrentes
# Se Limpia el último caracter que es una ? de toda la columna rec ayudado de una expresión lambda
df_navega1['rec']=df_navega1.rec.apply(lambda x: str(x)[0:-1])
# Se Limpia posibles añadidos al coche por navegación de toda la columna modelo ayudado de str.replace y expresiones regulares
df_navega1.modelo=df_navega1.modelo.str.replace(r'\/[a-z,-]*', '')
print(df_navega1.head())

ts uuid \

0 2021-09-06 0:3:5.816 5d612df4-b04a-48b3-a398-25e542d0d7cf

1 2021-09-06 0:3:27.098 2ae80a9e-4a1d-495f-bfc7-24a2ee462cda

2 2021-09-06 0:3:30.475 e8cbd723-b9ec-4a61-8044-bd7d30756154

3 2021-09-06 0:3:48.196 c75d0e0d-f3de-4746-ae66-72fbf4d7bf71

4 2021-09-06 0:4:0.649 2817a76c-b912-49f0-b826-31d92fb38acf

id_user \

0 fe1e23b7-5925-428e-b103-c1803a8a802a

1 5fcc8b47-8fa0-4791-a6b8-6260f2ab0888

2 add08a93-d03a-449c-bf09-9c1535ce2419

3 0882f78e-0295-458a-934d-18278c31adc7

4 c33f22df-997a-481f-9d51-df94e0689d3d

gclid user_recurrent \

0 Cj0KCQjw1dGJBhD4ARIsANb6OdkNOTEPAcfCTEAhlJfk6g... True

1 Cj0KCQjw1dGJBhD4ARIsANb6OdmYnQIBLDemeVg6nbOtVV... False

2 Cj0KCQjw1dGJBhD4ARIsANb6OdkuQkoBgr2y0lU5c3la2s... False

3 Cj0KCQjw1dGJBhD4ARIsANb6OdmPt8bwmNTJnZJinw0MUh... False

4 Cj0KCQjw1dGJBhD4ARIsANb6Odnrixsd4Gcl1wcT68auuj... True

url_landing modelo \

0 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

1 https://www.metropolis.com/es/ixs-electrico?gc... (https://www.metropolis.com/es/ixs-electrico?gc...) ixs-electrico

2 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...) tria

3 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...) tria

4 https://www.metropolis.com/es/?gclid=Cj0KCQjw1... (https://www.metropolis.com/es/?gclid=Cj0KCQjw1...)

campaña adgroup site_link advertisement rec

0 732187328 46724581628 533531999904 true

1 1646697023 61477462725 379120564696 false

2 1648648995 62589383945 481025151787 false

3 1648648995 62589383945 481025151796 false

4 732187328 46724581628 533655604703 true

In [ ]: ​

Comentarios Punto 2

Dejo 2 columnas no pedidas, modelo y rec por si hubiera que usarlas en las preguntas finales

3 Identificar Usuarios repetidos

Comprueba si hay is_users repetidos No vacíos, luego sobre los vacío si hay gclids repetidos y finalmente si con id_user y gclid vacío encuentra uuid (cookie) repetidas
In [9]: # Repetidos, cuando existe id_user
serie3=df_navega1[df_navega1['id_user']!=""].groupby(df_navega1[df_navega1['id_user']!=""]['id_user'].tolist()).size()

#print("\n","*"*8,"Analizar Repetidos si id_user tiene información ","*"*8, "\n\n", df_navega3, end="\n"*2)
print("Los id_user repetidos ordenados de mayor a menor repeticion, son: \n\n",serie3[serie3 >1].sort_values(ascending=False), "\

#repetidos, cuando id_user esta en blanco

serie4=df_navega1[df_navega1['id_user']==""].groupby(df_navega1[df_navega1['id_user']==""]['gclid'].tolist()).size()
#print("\n","*"*8,"Analizar Repetidos si id_user está vacío ","*"*8, "\n\n", df_navega4, end="\n"*2)
print("Los gclid repetidos si id_user es vacío, ordenados de mayor a menor repeticion son: \n\n",serie4[serie4 >1].sort_values(asc

#repetidos, cuando id_user y gclid estan en blanco

mask= (df_navega1['id_user']=="") & (df_navega1['gclid']=="")
serie5=df_navega1[mask].groupby(df_navega1[mask]['uuid'].tolist()).size()
#print("\n","*"*8,"Analizar Repetidos si id_user y gclid están vacíos ","*"*8, "\n\n", df_navega5, end="\n"*2)
print("Los uuid repetidos si id_user y gclid están vacío, ordenados de mayor a menor repeticion son: \n\n",serie5[serie5 >1].sort_v

Los id_user repetidos ordenados de mayor a menor repeticion, son:

e9c3c28b-c6b5-4332-95f7-258a8c2f5de3 15

053a7ccc-43ab-4829-8b82-93f30180630a 12

47a4f1f8-5d1b-4186-a2c9-88e01c2e6f33 10

1ff5e77b-9338-45af-b673-0f7b7901af36 10

09369b67-fd40-4299-8990-326a52187308 8

..

9d591588-b07c-440b-94f3-7ea2bd0d41ba 2

9d52aeed-aef2-4775-b109-d1bbdcea?1b6 2

9d3d797c-bc11-4be0-8167-80a5ff4b520e 2

9cdae29c-7361-4eb4-a262-e19b4f861385 2

000f5acb-6e91-4db5-a1a7-8eace5cd42c5 2

Length: 1057, dtype: int64

****************************************************************************************************

Los gclid repetidos si id_user es vacío, ordenados de mayor a menor repeticion son:

Series([], dtype: int64)

****************************************************************************************************

Los uuid repetidos si id_user y gclid están vacío, ordenados de mayor a menor repeticion son:

Series([], dtype: int64)

****************************************************************************************************

Se han encontrado varios id_users repetidos, 15 veces, 12 veces, 10 veces, ....

Cálculo de repeticiones de Glid para comprobar arañas


In [10]: # Repetidos, cuando existe id_user
#df_navega1 = df_navega.copy()
serie6=df_navega1.groupby(df_navega1['gclid'].tolist()).size()
#print("\n","*"*8,"Analizar Repetidos si id_user tiene información ","*"*8, "\n\n", df_navega3, end="\n"*2)
print("Los gclid repetidos ordenados de mayor a menor repeticion, son: \n\n",serie6[serie6 >1].sort_values(ascending=False), "\n"

Los gclid repetidos ordenados de mayor a menor repeticion, son:

EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEgJVzfD_BwE 124

0 35

CjwKCAjwjbCDBhAwEiwAiudBy3jlJeW4vAzqieU59RXrhxtMvbHXgK5UdK0KHtUCtcp6GWd38D0u6BoC76EQAvD_BwE 10

Cj0KCQjw-NaJBhDsARIsAAja6dOww1IgSWThNMRCIYMOqCLia0Udue7wdypptdIMPRlUBCr6gTi-_C4aAgdIEALw_wcB 5

Cj0KCQjw-NaJBhDsARIsAAja6dMELUkx0xI6udIqEYLUIQSpbP0FQtNk2aVxcUiMQUjb058AhqTsvhcaAho4EALw_wcB 5

...

Cj0KCQjw-NaJBhDsARIsAAja6dPvG1JtJ9QmzxpWT4xnk0NOTtFIlJltdBGHd8a5HLTTYWURnEHvD6UaAjJwEALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPw5PpJAOZRDCT5fpiUPL4dvWDMmLFr03DOHIA9qzrDClxCS9N_YH8aAsO1EALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPxm-pY4PfjXUXnORQcN3e7fH3I-rNWx-UY6aStQi7lKbFtxlZLPVQaAttIEALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPyAIvZEJI-MNcZkHRuy_e6PZJbLvJQzsxrHd2AGva_9C46ZVqxvggaAkV2EALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dOx4Am-XpUWqhRGxT_syMW-IogS5rhqPo_TtP_k5H6xpZFRBWHte08aAmEvEALw_wcB 2

Length: 493, dtype: int64

****************************************************************************************************

In [11]: print(df_navega1[df_navega1['gclid']=="EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEgJVzfD_BwE"][['id_user','gclid']])

id_user \

6 53f1a3fa-8fc4-4aeb-87a0-dcbe059339ae

7 cbe653fa-8fc4-4aeb-87a0-dcbe059339ae

34 431a56fa-8fc4-4aeb-87a0-dcbe059339ae

41 d300f5fa-8fc4-4aeb-87a0-dcbe059339ae

47 d20e93fa-8fc4-4aeb-87a0-dcbe059339ae

... ...

7257 5bd4774a-8fc4-4aeb-87a0-dcbe059339ae

7258 d7df874a-8fc4-4aeb-87a0-dcbe059339ae

7259 521d774a-8fc4-4aeb-87a0-dcbe059339ae

7263 d6ac974a-8fc4-4aeb-87a0-dcbe059339ae

7265 de57a84a-8fc4-4aeb-87a0-dcbe059339ae

gclid

6 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

7 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

34 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

41 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

47 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

... ...

7257 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

7258 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

7259 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

7263 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

7265 EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEg...

[124 rows x 2 columns]

Hay que limpiar los datos con gclid = EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEgJVzfD_BwE y 124 repeticiones y otras 35 repeteciones con valor 0, y

diferentes id_user dentro de cada grupo de ellas, esto indica que cada grupo se corresponde con una araña rastreando en cada caso
In [12]: indices_borrar1=df_navega1[df_navega1['gclid']=="EAIaIQobChMIwPu5t4qs3AIVAQAAAB0BAAAAEAAYACAAEgJVzfD_BwE"].index
df_navega1.drop(indices_borrar1 , inplace=True)
indices_borrar2=df_navega1[df_navega1['gclid']=="0"].index
df_navega1.drop(indices_borrar2 , inplace=True)
serie6=df_navega1.groupby(df_navega1['gclid'].tolist()).size()
print("Los gclid repetidos ahora ordenados de mayor a menor repeticion, son: \n\n",serie6[serie6 >1].sort_values(ascending=False),

Los gclid repetidos ahora ordenados de mayor a menor repeticion, son:

CjwKCAjwjbCDBhAwEiwAiudBy3jlJeW4vAzqieU59RXrhxtMvbHXgK5UdK0KHtUCtcp6GWd38D0u6BoC76EQAvD_BwE 10

Cj0KCQjw-NaJBhDsARIsAAja6dMELUkx0xI6udIqEYLUIQSpbP0FQtNk2aVxcUiMQUjb058AhqTsvhcaAho4EALw_wcB 5

Cj0KCQjw-NaJBhDsARIsAAja6dOww1IgSWThNMRCIYMOqCLia0Udue7wdypptdIMPRlUBCr6gTi-_C4aAgdIEALw_wcB 5

Cj0KCQjw-NaJBhDsARIsAAja6dPLhRHDqi-qYz4dcE9XFVvOcq4o0eiCW5ss8t3T_h7u9VB4NXAS-FkaAhKzEALw_wcB 4

Cj0KCQjw-NaJBhDsARIsAAja6dPF-dZH3B6kU3Lp_q8fn9f8bl4tz8uOoZbmJJcL6EkgWPG6mvqGRZ0aAoWoEALw_wcB 4

..

Cj0KCQjw-NaJBhDsARIsAAja6dPw5PpJAOZRDCT5fpiUPL4dvWDMmLFr03DOHIA9qzrDClxCS9N_YH8aAsO1EALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPxm-pY4PfjXUXnORQcN3e7fH3I-rNWx-UY6aStQi7lKbFtxlZLPVQaAttIEALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPyAIvZEJI-MNcZkHRuy_e6PZJbLvJQzsxrHd2AGva_9C46ZVqxvggaAkV2EALw_wcB 2

Cj0KCQjw-NaJBhDsARIsAAja6dPykgOqL7Ow28PKh1dtWu76TrWRkcb7bhRbvnUqTAl71KzEhR_BqA8aAiHGEALw_wcB 2

66999d78163412d9d6affc4df53f7ac2 2

Length: 491, dtype: int64

****************************************************************************************************

Borrar usuarios repetidos opción A de la profesora

Vamos a convertir ts a una cadena numérica que permita ordenar por ella
In [13]: df= df_navega1
df['ts']=df['ts'].apply((lambda x: ''.join([str(campo.lstrip()).zfill(2) for campo in re.split(' |\.|:|-', x)])))

df1= df.sort_values(['id_user','ts'],ascending=True)
print (df1)

ts uuid \

2364 20210906121948835 a2a3c255-1b49-4964-b6cc-9554f9a8b627

4489 20210906165905026 ebfee846-b9a0-417e-af70-1b55b410ba6b

1536 20210906102951027 c5d2d6c5-f2f0-45eb-8a7c-84359ce07ad0

4133 20210906161206883 378be2d9-1985-493c-a297-d768629509d6

4286 20210906163025539 82481331-bf99-4e79-b396-b9543b7c7402

... ... ...

5510 20210906190307702 cce95f39-9fb8-44bd-b473-0a2dc1602114

5809 20210906194350164 3b05fd72-3bd2-43b5-9be3-082debb51d53

2648 20210906130219018 c648b281-07c5-4289-a546-61a99174ec02

2694 20210906130842736 c648b281-07c5-4289-a546-61a99174ec02

1026 20210906173539374 39e46fb6-ecd7-473c-96ff-25b92bd24529

id_user \

2364 00058196-6d2b-47ed-82c5-0da02ebbc036

4489 00086e39-418a-4c71-81e3-5708e7817ee6

1536 0009dc9a-b6ef-43f5-8820-dbf7fc361fe5

4133 000c70dc-5e30-43c4-960f-5a65e8230ae3

4286 000d3ecf-f976-441f-a9a4-f73551ca6fd1

... ...

5510 ffd2f80c-891a-4c42-9a47-e72477e86db0

5809 ffdf96f7-73be-4795-b76c-2a013eb7d96c

2648 ffe198c1-4af3-4f27-ad65-a11c5644eaf1

2694 ffe198c1-4af3-4f27-ad65-a11c5644eaf1

1026 fff88164-ce92-486c-a4d8-41c7b9779f24

gclid user_recurrent \

2364 Cj0KCQjw-NaJBhDsARIsAAja6dPJ-JyDW839JlfKcoC8FA... False

4489 Cj0KCQjw-NaJBhDsARIsAAja6dPDS7626ZVRCPEgnCoxI6... False

1536 Cj0KCQjw-NaJBhDsARIsAAja6dNajQVq0jWgLNTuC5FWEB... False

4133 Cj0KCQjw-NaJBhDsARIsAAja6dM9h8p2ibuONyK14kBsSD... False

4286 Cj0KCQjw-NaJBhDsARIsAAja6dMuD1IYSfb-t9IJkr0S5e... False

... ... ...

5510 Cj0KCQjw-NaJBhDsARIsAAja6dPCD8eejFw9GRbab7dPoK... False

5809 Cj0KCQjw-NaJBhDsARIsAAja6dMe6cBmKKXFJW15NeU5PG... False

2648 Cj0KCQjw-NaJBhDsARIsAAja6dOXtqRrllxAbR_ymayQIQ... False

2694 Cj0KCQjw-NaJBhDsARIsAAja6dPr5Ff-aCRv_JreBZnJP8... True

1026 EAIaIQobChMIquKwkIDq8gIVRLrVCh3JEwTmEAAYASAAEg... False

url_landing modelo \

2364 https://www.metropolis.com/es/life?gclid=Cj0KC... (https://www.metropolis.com/es/life?gclid=Cj0KC...) life

4489 https://www.metropolis.com/es/ixs-hibrido?gcli... (https://www.metropolis.com/es/ixs-hibrido?gcli...) ixs-hibrido

1536 https://www.metropolis.com/es/clin400?gclid=Cj... (https://www.metropolis.com/es/clin400?gclid=Cj...) clin400

4133 https://www.metropolis.com/es/life?gclid=EAIaI... (https://www.metropolis.com/es/life?gclid=EAIaI...) life

4286 https://www.metropolis.com/es/cea?gclid=EAIaIQ... (https://www.metropolis.com/es/cea?gclid=EAIaIQ...) cea

... ... ...

5510 https://www.metropolis.com/es/clin50?gclid=Cj0... (https://www.metropolis.com/es/clin50?gclid=Cj0...) clin50

5809 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

2648 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...) tria

2694 https://www.metropolis.com/es/?gclid=Cj0KCQjw-... (https://www.metropolis.com/es/?gclid=Cj0KCQjw-...)

1026 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

campaña adgroup site_link advertisement rec

2364 13352855428 126733863807 525407334167 true

4489 1646697566 65960618775 379120564783 true

1536 1439144774 54995539343 477211735154 false

4133 13352855428 126733863807 525407334173 false

4286 1648646316 58613330770 494939238438 false

... ... ... ... ... ...

5510 732187349 46724584708 379120563244 false

5809 732187328 46724581628 533655604703 false

2648 1648648995 62589383945 481025151787 true

2694 732187328 46724581628 533655604703 true

1026 732187328 46724581628 533655604703 false

[7109 rows x 12 columns]

a.- Resetea los índices de filas para dejar el dataframe df2 ordenado en primer nivel por id_user y en segundo nivel por fechas (ts)

b.- Añade una columna contador que contiene el número de repetición de cada valor de iduser
In [14]: df2=df1.reset_index(drop=True)
#print(df1)
df2['contador']=df2.groupby('id_user').cumcount()
print(df2)

ts uuid \

0 20210906121948835 a2a3c255-1b49-4964-b6cc-9554f9a8b627

1 20210906165905026 ebfee846-b9a0-417e-af70-1b55b410ba6b

2 20210906102951027 c5d2d6c5-f2f0-45eb-8a7c-84359ce07ad0

3 20210906161206883 378be2d9-1985-493c-a297-d768629509d6

4 20210906163025539 82481331-bf99-4e79-b396-b9543b7c7402

... ... ...

7104 20210906190307702 cce95f39-9fb8-44bd-b473-0a2dc1602114

7105 20210906194350164 3b05fd72-3bd2-43b5-9be3-082debb51d53

7106 20210906130219018 c648b281-07c5-4289-a546-61a99174ec02

7107 20210906130842736 c648b281-07c5-4289-a546-61a99174ec02

7108 20210906173539374 39e46fb6-ecd7-473c-96ff-25b92bd24529

id_user \

0 00058196-6d2b-47ed-82c5-0da02ebbc036

1 00086e39-418a-4c71-81e3-5708e7817ee6

2 0009dc9a-b6ef-43f5-8820-dbf7fc361fe5

3 000c70dc-5e30-43c4-960f-5a65e8230ae3

4 000d3ecf-f976-441f-a9a4-f73551ca6fd1

... ...

7104 ffd2f80c-891a-4c42-9a47-e72477e86db0

7105 ffdf96f7-73be-4795-b76c-2a013eb7d96c

7106 ffe198c1-4af3-4f27-ad65-a11c5644eaf1

7107 ffe198c1-4af3-4f27-ad65-a11c5644eaf1

7108 fff88164-ce92-486c-a4d8-41c7b9779f24

gclid user_recurrent \

0 Cj0KCQjw-NaJBhDsARIsAAja6dPJ-JyDW839JlfKcoC8FA... False

1 Cj0KCQjw-NaJBhDsARIsAAja6dPDS7626ZVRCPEgnCoxI6... False

2 Cj0KCQjw-NaJBhDsARIsAAja6dNajQVq0jWgLNTuC5FWEB... False

3 Cj0KCQjw-NaJBhDsARIsAAja6dM9h8p2ibuONyK14kBsSD... False

4 Cj0KCQjw-NaJBhDsARIsAAja6dMuD1IYSfb-t9IJkr0S5e... False

... ... ...

7104 Cj0KCQjw-NaJBhDsARIsAAja6dPCD8eejFw9GRbab7dPoK... False

7105 Cj0KCQjw-NaJBhDsARIsAAja6dMe6cBmKKXFJW15NeU5PG... False

7106 Cj0KCQjw-NaJBhDsARIsAAja6dOXtqRrllxAbR_ymayQIQ... False

7107 Cj0KCQjw-NaJBhDsARIsAAja6dPr5Ff-aCRv_JreBZnJP8... True

7108 EAIaIQobChMIquKwkIDq8gIVRLrVCh3JEwTmEAAYASAAEg... False

url_landing modelo \

0 https://www.metropolis.com/es/life?gclid=Cj0KC... (https://www.metropolis.com/es/life?gclid=Cj0KC...) life

1 https://www.metropolis.com/es/ixs-hibrido?gcli... (https://www.metropolis.com/es/ixs-hibrido?gcli...) ixs-hibrido

2 https://www.metropolis.com/es/clin400?gclid=Cj... (https://www.metropolis.com/es/clin400?gclid=Cj...) clin400

3 https://www.metropolis.com/es/life?gclid=EAIaI... (https://www.metropolis.com/es/life?gclid=EAIaI...) life

4 https://www.metropolis.com/es/cea?gclid=EAIaIQ... (https://www.metropolis.com/es/cea?gclid=EAIaIQ...) cea

... ... ...

7104 https://www.metropolis.com/es/clin50?gclid=Cj0... (https://www.metropolis.com/es/clin50?gclid=Cj0...) clin50

7105 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

7106 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...) tria

7107 https://www.metropolis.com/es/?gclid=Cj0KCQjw-... (https://www.metropolis.com/es/?gclid=Cj0KCQjw-...)

7108 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

campaña adgroup site_link advertisement rec contador

0 13352855428 126733863807 525407334167 true 0

1 1646697566 65960618775 379120564783 true 0

2 1439144774 54995539343 477211735154 false 0

3 13352855428 126733863807 525407334173 false 0

4 1648646316 58613330770 494939238438 false 0

... ... ... ... ... ... ...

7104 732187349 46724584708 379120563244 false 0

7105 732187328 46724581628 533655604703 false 0

7106 1648648995 62589383945 481025151787 true 0

7107 732187328 46724581628 533655604703 true 1

7108 732187328 46724581628 533655604703 false 0

[7109 rows x 13 columns]

a.- Crea un dataframe sólo con las filas cuyo valor de contador es 0 que son las más antiguas en fecha.

b.- Resetea los indices de ese nuevo dataframe

c.- Elimina la columna 'contador' porque ya ha hecho su trabajo


In [15]: # Filtra las lineas cuyo contador es 0, resetea el indice de ese nuevo dataframe, y al final elimina la columna contador
df3=df2[df2['contador']==0].reset_index(drop=True).drop(['contador'], axis = 1)
print (df3)
ts uuid \

0 20210906121948835 a2a3c255-1b49-4964-b6cc-9554f9a8b627

1 20210906165905026 ebfee846-b9a0-417e-af70-1b55b410ba6b

2 20210906102951027 c5d2d6c5-f2f0-45eb-8a7c-84359ce07ad0

3 20210906161206883 378be2d9-1985-493c-a297-d768629509d6

4 20210906163025539 82481331-bf99-4e79-b396-b9543b7c7402

... ... ...

5638 20210906151619676 0c5f079c-d689-4eef-9541-620cd3643143

5639 20210906190307702 cce95f39-9fb8-44bd-b473-0a2dc1602114

5640 20210906194350164 3b05fd72-3bd2-43b5-9be3-082debb51d53

5641 20210906130219018 c648b281-07c5-4289-a546-61a99174ec02

5642 20210906173539374 39e46fb6-ecd7-473c-96ff-25b92bd24529

id_user \

0 00058196-6d2b-47ed-82c5-0da02ebbc036

1 00086e39-418a-4c71-81e3-5708e7817ee6

2 0009dc9a-b6ef-43f5-8820-dbf7fc361fe5

3 000c70dc-5e30-43c4-960f-5a65e8230ae3

4 000d3ecf-f976-441f-a9a4-f73551ca6fd1

... ...

5638 ffcd8ee1-232b-484f-9b3c-f7373be9f049

5639 ffd2f80c-891a-4c42-9a47-e72477e86db0

5640 ffdf96f7-73be-4795-b76c-2a013eb7d96c

5641 ffe198c1-4af3-4f27-ad65-a11c5644eaf1

5642 fff88164-ce92-486c-a4d8-41c7b9779f24

gclid user_recurrent \

0 Cj0KCQjw-NaJBhDsARIsAAja6dPJ-JyDW839JlfKcoC8FA... False

1 Cj0KCQjw-NaJBhDsARIsAAja6dPDS7626ZVRCPEgnCoxI6... False

2 Cj0KCQjw-NaJBhDsARIsAAja6dNajQVq0jWgLNTuC5FWEB... False

3 Cj0KCQjw-NaJBhDsARIsAAja6dM9h8p2ibuONyK14kBsSD... False

4 Cj0KCQjw-NaJBhDsARIsAAja6dMuD1IYSfb-t9IJkr0S5e... False

... ... ...

5638 Cj0KCQjw-NaJBhDsARIsAAja6dPM80GZ2PPN9gyGhRKmiP... True

5639 Cj0KCQjw-NaJBhDsARIsAAja6dPCD8eejFw9GRbab7dPoK... False

5640 Cj0KCQjw-NaJBhDsARIsAAja6dMe6cBmKKXFJW15NeU5PG... False

5641 Cj0KCQjw-NaJBhDsARIsAAja6dOXtqRrllxAbR_ymayQIQ... False

5642 EAIaIQobChMIquKwkIDq8gIVRLrVCh3JEwTmEAAYASAAEg... False

url_landing modelo \

0 https://www.metropolis.com/es/life?gclid=Cj0KC... (https://www.metropolis.com/es/life?gclid=Cj0KC...) life

1 https://www.metropolis.com/es/ixs-hibrido?gcli... (https://www.metropolis.com/es/ixs-hibrido?gcli...) ixs-hibrido

2 https://www.metropolis.com/es/clin400?gclid=Cj... (https://www.metropolis.com/es/clin400?gclid=Cj...) clin400

3 https://www.metropolis.com/es/life?gclid=EAIaI... (https://www.metropolis.com/es/life?gclid=EAIaI...) life

4 https://www.metropolis.com/es/cea?gclid=EAIaIQ... (https://www.metropolis.com/es/cea?gclid=EAIaIQ...) cea

... ... ...

5638 https://www.metropolis.com/es/?gclid=Cj0KCQjw-... (https://www.metropolis.com/es/?gclid=Cj0KCQjw-...)

5639 https://www.metropolis.com/es/clin50?gclid=Cj0... (https://www.metropolis.com/es/clin50?gclid=Cj0...) clin50

5640 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

5641 https://www.metropolis.com/es/tria?gclid=Cj0KC... (https://www.metropolis.com/es/tria?gclid=Cj0KC...) tria

5642 https://www.metropolis.com/es/?gclid=EAIaIQobC... (https://www.metropolis.com/es/?gclid=EAIaIQobC...)

campaña adgroup site_link advertisement rec

0 13352855428 126733863807 525407334167 true

1 1646697566 65960618775 379120564783 true

2 1439144774 54995539343 477211735154 false

3 13352855428 126733863807 525407334173 false

4 1648646316 58613330770 494939238438 false

... ... ... ... ... ...

5638 732187328 46724581628 533655604703 true

5639 732187349 46724584708 379120563244 false

5640 732187328 46724581628 533655604703 false

5641 1648648995 62589383945 481025151787 true

5642 732187328 46724581628 533655604703 false

[5643 rows x 12 columns]

Se entra con [7109 rows x 13 columns] y se ha salido con [5643 rows x 12 columns]

Hasta aquí el tratamiento de los datos procedentes del fichero navegacion.csv

Ahora se tratarán los datos procedentes del fichero conversiones.csv almacenados en df_convierte
In [16]: df_convierte = df_convierte.fillna("")
print(df_convierte)

date hour id_lead id_user \

0 06/09/2021 9:06 7900 cefd8f05-8dd2-4e82-869f-1ddc57a9a4c3

1 06/09/2021 9:53 7877 None

2 06/09/2021 11:38 7878 None

3 06/09/2021 12:04 7875 None

4 06/09/2021 12:47 7873 None

5 06/09/2021 12:57 7874 None

6 06/09/2021 13:41 7872 None

7 06/09/2021 13:45 7870 None

8 06/09/2021 13:55 7868 None

9 06/09/2021 14:56 7869 None

10 06/09/2021 14:10 7889 e942cf56-2aa1-462b-b561-dd47b332e880

11 06/09/2021 16:22 7866 None

12 06/09/2021 17:24 7864 None

13 06/09/2021 17:25 7865 None

14 06/09/2021 18:20 7886 765f65aa-dea5-49e2-a0b8-656aa669b2fb

15 06/09/2021 19:00 7835 None

16 06/09/2021 19:11 7884 193f16ad-6dc0-401f-9593-06bfafb32264

17 06/09/2021 20:02 7836 fbee18ca-6970-4015-8892-814e664b3dab

18 06/09/2021 20:02 7881 2f59a840-26c4-4a41-b1b0-0c3cd3b669bf

19 06/09/2021 20:40 7879 3f336d07-2513-401a-984a-f258c032d686

20 07/09/2021 11:37 7851 1d792022-78e4-4af9-9ea5-741117389e66

21 07/09/2021 17:58 7843 2f616f73-6d38-4041-95e9-911b90fbaee2

22 08/09/2021 10:54 7917 215134e8-3170-43dc-8f08-f06438129a9c

23 08/09/2021 11:56 7914 8fb314e8-b0fe-4e17-b398-c0c5d2a988d0

24 08/09/2021 18:35 7922 ebde412f-7daf-4349-b888-fbf1d9deb04b

25 09/09/2021 13:45 7959 59257b75-5389-49e4-b1aa-5997ecfdc7f9

26 10/09/2021 12:27 8003 3f336d07-2513-401a-984a-f258c032d686

27 10/09/2021 17:36 7989 fff88164-ce92-486c-a4d8-41c7b9779f24

gclid lead_type \

0 Cj0KCQjw1dGJBhD4ARIsANb6Odl8LjduiZVnMw6VFe8APD... FORM

1 None CALL

2 None CALL

3 None CALL

4 None CALL

5 None CALL

6 None CALL

7 None CALL

8 None CALL

9 None CALL

10 Cj0KCQjw-NaJBhDsARIsAAja6dNU5vPDlafKLhm6CdDtyd... FORM

11 None CALL

12 None CALL

13 None CALL

14 Cj0KCQjw-NaJBhDsARIsAAja6dOehjJTnm8rZs-IwWC5sa... FORM

15 None CALL

16 Cj0KCQjw-NaJBhDsARIsAAja6dNCueDuJnpMRCegupZko2... FORM

17 Cj0KCQjw-NaJBhDsARIsAAja6dM1v0WCTK_OfE2RBzWB7r... CALL

18 EAIaIQobChMIsNjZj_Lq8gIVD6h3Ch2APQeBEAAYASAAEg... FORM

19 Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7... FORM

20 Cj0KCQjw-NaJBhDsARIsAAja6dM6qdbSmrcMxQl5WJrG9i... CALL

21 Cj0KCQjw-NaJBhDsARIsAAja6dMkLcC2x5KGCyFoyyjDiD... CALL

22 EAIaIQobChMIhsr_gYnp8gIVxQyLCh04MwVEEAAYASAAEg... FORM

23 Cj0KCQjw1dGJBhD4ARIsANb6Odmm0scxrJhSEv-sJOjunw... CALL

24 Cj0KCQjw-NaJBhDsARIsAAja6dNtVZXsxzlO0dE1Mk8wIs... FORM

25 Cj0KCQjw1dGJBhD4ARIsANb6OdkF0-DcGTMMXczOIXbbjK... CALL

26 Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7... FORM

27 EAIaIQobChMIquKwkIDq8gIVRLrVCh3JEwTmEAAYASAAEg... CALL

result

0 Ilocalizable

1 No le interesa

2 No le interesa

3 No le interesa

4 No le interesa

5 No le interesa

6 No le interesa

7 No le interesa

8 No le interesa

9 No le interesa

10 Positivo

11 Positivo

12 No le interesa

13 Ilocalizable

14 Positivo

15 Positivo

16 Ilocalizable

17 No le interesa

18 Ilocalizable

19 Positivo

20 Ilocalizable

21 Ilocalizable

22 No le interesa

23 Ilocalizable

24 Positivo

25 No le interesa

26 Positivo

27 No le interesa

Busca si hay algún registro de conversiones duplicado, iguales id_user, gclids, lead_type y result

In [17]: df_convierte1=df_convierte.copy()
serie8=df_convierte1.groupby(df_convierte1['gclid'].tolist()).size()
print("Los gclid repetidos ordenados de mayor a menor repeticion, son: \n\n",serie8[serie8 >1].sort_values(ascending=False), "\n"

Los gclid repetidos ordenados de mayor a menor repeticion, son:

None 13

Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7g1IE11WEQ00IZ4fYuqMnbULg7mXXPdJmYaAhEJEALw_wcB 2

dtype: int64

****************************************************************************************************

In [18]: print(df_convierte1[df_convierte1['gclid']=="Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7g1IE11WEQ00IZ4fYuqMnbULg7mXXPdJmYaAhEJEA

date hour id_lead id_user \

19 06/09/2021 20:40 7879 3f336d07-2513-401a-984a-f258c032d686

26 10/09/2021 12:27 8003 3f336d07-2513-401a-984a-f258c032d686

gclid lead_type result

19 Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7... FORM Positivo

26 Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7... FORM Positivo

Elimina el de fecha más reciente puesto que ya se había realizado su conversión

No voy a implementar más código para hacerlo automáticamente, pues se nos indica que hagamos análisis (humano)
Por lo tanto como sólo hay dos posiciones repetidas,

la 19 y la 26 y se nos pide borrar la más reciente, elimino la 26


In [19]: indices_borrar3=[26]
df_convierte1.drop(index=26 , inplace=True)
df_convierte1=df_convierte1.reset_index(drop=True)

serie9=df_convierte1.groupby(df_convierte1['gclid'].tolist()).size()
print("Los gclid repetidos ahora ordenados de mayor a menor repeticion, son: \n\n",serie9[serie9 >1].sort_values(ascending=False),

Los gclid repetidos ahora ordenados de mayor a menor repeticion, son:

None 13

dtype: int64

****************************************************************************************************

In [20]: print(df_convierte1)

date hour id_lead id_user \

0 06/09/2021 9:06 7900 cefd8f05-8dd2-4e82-869f-1ddc57a9a4c3

1 06/09/2021 9:53 7877 None

2 06/09/2021 11:38 7878 None

3 06/09/2021 12:04 7875 None

4 06/09/2021 12:47 7873 None

5 06/09/2021 12:57 7874 None

6 06/09/2021 13:41 7872 None

7 06/09/2021 13:45 7870 None

8 06/09/2021 13:55 7868 None

9 06/09/2021 14:56 7869 None

10 06/09/2021 14:10 7889 e942cf56-2aa1-462b-b561-dd47b332e880

11 06/09/2021 16:22 7866 None

12 06/09/2021 17:24 7864 None

13 06/09/2021 17:25 7865 None

14 06/09/2021 18:20 7886 765f65aa-dea5-49e2-a0b8-656aa669b2fb

15 06/09/2021 19:00 7835 None

16 06/09/2021 19:11 7884 193f16ad-6dc0-401f-9593-06bfafb32264

17 06/09/2021 20:02 7836 fbee18ca-6970-4015-8892-814e664b3dab

18 06/09/2021 20:02 7881 2f59a840-26c4-4a41-b1b0-0c3cd3b669bf

19 06/09/2021 20:40 7879 3f336d07-2513-401a-984a-f258c032d686

20 07/09/2021 11:37 7851 1d792022-78e4-4af9-9ea5-741117389e66

21 07/09/2021 17:58 7843 2f616f73-6d38-4041-95e9-911b90fbaee2

22 08/09/2021 10:54 7917 215134e8-3170-43dc-8f08-f06438129a9c

23 08/09/2021 11:56 7914 8fb314e8-b0fe-4e17-b398-c0c5d2a988d0

24 08/09/2021 18:35 7922 ebde412f-7daf-4349-b888-fbf1d9deb04b

25 09/09/2021 13:45 7959 59257b75-5389-49e4-b1aa-5997ecfdc7f9

26 10/09/2021 17:36 7989 fff88164-ce92-486c-a4d8-41c7b9779f24

gclid lead_type \

0 Cj0KCQjw1dGJBhD4ARIsANb6Odl8LjduiZVnMw6VFe8APD... FORM

1 None CALL

2 None CALL

3 None CALL

4 None CALL

5 None CALL

6 None CALL

7 None CALL

8 None CALL

9 None CALL

10 Cj0KCQjw-NaJBhDsARIsAAja6dNU5vPDlafKLhm6CdDtyd... FORM

11 None CALL

12 None CALL

13 None CALL

14 Cj0KCQjw-NaJBhDsARIsAAja6dOehjJTnm8rZs-IwWC5sa... FORM

15 None CALL

16 Cj0KCQjw-NaJBhDsARIsAAja6dNCueDuJnpMRCegupZko2... FORM

17 Cj0KCQjw-NaJBhDsARIsAAja6dM1v0WCTK_OfE2RBzWB7r... CALL

18 EAIaIQobChMIsNjZj_Lq8gIVD6h3Ch2APQeBEAAYASAAEg... FORM

19 Cj0KCQjw1dGJBhD4ARIsANb6Odlnpclu0aWW8w1k4oOWd7... FORM

20 Cj0KCQjw-NaJBhDsARIsAAja6dM6qdbSmrcMxQl5WJrG9i... CALL

21 Cj0KCQjw-NaJBhDsARIsAAja6dMkLcC2x5KGCyFoyyjDiD... CALL

22 EAIaIQobChMIhsr_gYnp8gIVxQyLCh04MwVEEAAYASAAEg... FORM

23 Cj0KCQjw1dGJBhD4ARIsANb6Odmm0scxrJhSEv-sJOjunw... CALL

24 Cj0KCQjw-NaJBhDsARIsAAja6dNtVZXsxzlO0dE1Mk8wIs... FORM

25 Cj0KCQjw1dGJBhD4ARIsANb6OdkF0-DcGTMMXczOIXbbjK... CALL

26 EAIaIQobChMIquKwkIDq8gIVRLrVCh3JEwTmEAAYASAAEg... CALL

result

0 Ilocalizable

1 No le interesa

2 No le interesa

3 No le interesa

4 No le interesa

5 No le interesa

6 No le interesa

7 No le interesa

8 No le interesa

9 No le interesa

10 Positivo

11 Positivo

12 No le interesa

13 Ilocalizable

14 Positivo

15 Positivo

16 Ilocalizable

17 No le interesa

18 Ilocalizable

19 Positivo

20 Ilocalizable

21 Ilocalizable

22 No le interesa

23 Ilocalizable

24 Positivo

25 No le interesa

26 No le interesa

Ahora quedan 27 filas, es decir ha eliminado la posición 26 completa y se ha reseteado el índice de filas

Nuevamente indico que no voy a tratar los None porque así lo indica la profesora

Creo de verdad que datos incompletos pueden indicar registro corrupto y por tanto datos no válidos, pero..

4 Unir los datos ya tratados de navegación y de conversiones

Crear una columna indicando si el usuario ha convertido o No ha convertido. Unión a través de id_user

In [77]: dfTotal = df3.merge(df_convierte1, how = 'outer', on = ['id_user'])

In [78]: print(df3.shape,df_convierte1.shape, dfTotal.shape)

(5643, 12) (27, 7) (5656, 18)

La unión está correcta puesto que hay 13 registros de los (28-1) de conversión que tienen id_user y gclid en blanco.

Por ello No es posible asociarlos a ninguna cookie pues los uuid de navegación y los id_lead de conversión no están relacionados.

Por ello pasamos de los 5643 registros de navegación limpia a 5656 (5643 + 13) en el total
In [79]: print (dfTotal[dfTotal.result.notnull()].count())

ts 14

uuid 14

id_user 27

gclid_x 14

user_recurrent 14

url_landing 14

modelo 14

campaña 14

adgroup 14

site_link 14

advertisement 14

rec 14

date 27

hour 27

id_lead 27

gclid_y 27

lead_type 27

result 27

dtype: int64

Exportamos el resultado a CSV compatible con Excel, separadores ;

In [80]: dfTotal.to_csv('Informe1_todo.csv', sep=';',index=False)

Preguntas a responder

1.- ¿Cuántas visitas recibe en el día el cliente?

Como previamente se han eliminado duplicados (ha sido mi elección), entonces entiendo que cada entrada con ts es una visita.

Voy a filtrar sólo las del día 6 de Septiembre de 2021


No serán visitas aquellos registros que figuren sin ts, pueden ser conversiones, pero No visitas (aunque dada la

proporción entre navegación y conversión, no creo que vaya a cambiar mucho el porcentaje.
In [81]: visitas6 = dfTotal[ (dfTotal["ts"] <"20210907000000") & (dfTotal["ts"] >"20210905000000") ]['ts'].count()
print("El número de visitas el 6 de septiembre: ", visitas6)

El número de visitas el 6 de septiembre: 5639

1.a.- ¿Cuántas covierten y cuántas no? en %

Todas las que aparecen se las vamos a imputar a visitas del día 6, aunque en algunas no hay enlace claro.

In [82]: positivas= dfTotal[dfTotal["result"]=="Positivo"]['result'].count()


print ("Nº de conversiones Positivas: ",positivas,end='\n')

Nº de conversiones Positivas: 6

In [83]: print ("En porcentaje, la relación de visitas y conversiones es de: ", positivas * 100 /visitas6)

En porcentaje, la relación de visitas y conversiones es de: 0.10640184429863452

Conclusión: Realmente parece que se puede expresar en tanto por mil, como un 1 por mil

Y las que No, pues serán del 999 por mil. Es decir del 99.9% no se convierten

Puede parecer exagerado pero No lo es porque hablamos de coches, las páginas se visitan mucho, pero su compra es una inversión

2.- Por tipo de conversión (Call, Form). ¿Cuántas hay de cada una?

Hay 27 en total, de ellas hay 19 Call y 8 en Form.

Que hayan sido positivas, es decir que se haya vendido un coche, son 6 en total, 2 desde Call y 4 desde Form

In [84]: print ("Nº de CALLs totales: ", dfTotal[dfTotal["lead_type"]=="CALL"]['lead_type'].count(),end='\n')


print ("Nº de FORMS totales: ", dfTotal[dfTotal["lead_type"]=="FORM"]['lead_type'].count(),end='\n')

Nº de CALLs totales: 19

Nº de FORMS totales: 8

In [85]: print ("Nº de CALLs con conversión Positiva: ", dfTotal[(dfTotal["lead_type"]=="CALL") & (dfTotal["result"]=="Positivo")]['lead_ty
print ("Nº de FORM con conversión Positiva: ", dfTotal[(dfTotal["lead_type"]=="FORM") & (dfTotal["result"]=="Positivo")]['lead_ty

Nº de CALLs con conversión Positiva: 2

Nº de FORM con conversión Positiva: 4

In [ ]: ​

3.- Porcentaje de recurrentes sobre el total de usuarios

Tenemos sobre un total de 5643 visitas (hay de más de 1 día), 947 recurrentes y 4696 por primera vez

El porcentaje de visitantes recurrentes ronda el: 16,78% mientras que son nuevos el 83,22% restante

In [86]: visitas= dfTotal["ts"].count()


recurrentes_True= dfTotal[dfTotal["user_recurrent"]==1]['user_recurrent'].count()
recurrentes_False= dfTotal[dfTotal["user_recurrent"]==0]['user_recurrent'].count()
print("Total de visitantes: ",visitas,recurrentes_True,recurrentes_True*100/visitas ,recurrentes_False, recurrentes_False*100/visit

Total de visitantes: 5643 947 16.781853623958888 4696 83.21814637604112

In [ ]: ​

In [ ]: ​

4.- Coche más visitado

277 cea
117 cea-e
60 cea-h
383 clin200
18 clin200n
10 clin200-electrico
289 clin400
134 clin50
3 comercial
153 dep30
40 dep30F
82 fm
14 fm-hev
311 home
107 ixs-

electrico
112 ixs-hibrido
22 k43
122 life
1206 tria
150 tria-hibrido
2 renting
3612 totales
In [87]: modelos=["tria-hibrido","tria[^-]|^tria$","life","k43","ixs-h","ixs-e","home","fm-h","fm[^-]|^fm$","dep30F","dep30[^F]|^dep30$","co

contador_modelo = list(map(lambda x : dfTotal[dfTotal.modelo.str.contains(x, regex=True, na=False)]['modelo'].count(), modelos))

print( [listado for listado in zip(modelos, contador_modelo)])
print (max(contador_modelo))

[('tria-hibrido', 150), ('tria[^-]|^tria$', 1206), ('life', 122), ('k43', 22), ('ixs-h', 112), ('ixs-e', 107), ('home', 311),
('fm-h', 14), ('fm[^-]|^fm$', 82), ('dep30F', 40), ('dep30[^F]|^dep30$', 153), ('comercial', 3), ('clin50', 134), ('clin400', 28
9), ('clin200n', 18), ('clin200-e', 10), ('clin200[^-^n]|^clin200$', 383), ('cea-hibrido', 60), ('cea-e', 117), ('cea[^-]|^cea
$', 277)]

1206

Es el modelo TRIA, con 1206 visitas al día

¿Es el que más convierte?

Ese día, de los positivos o conversiones, sólo parecen disponibles las de 3 coches:

1 tria, 1 cea-electrico y 1 clin400

Por lo tanto parece uno de los que más convierte

In [88]: print(dfTotal[dfTotal["result"]=="Positivo"].groupby(['modelo'])['result'].count())

modelo

cea-electrico 1

clin400 1

tria 1

Name: result, dtype: int64

5 Conversion por campañas


Ojo, en los cálculos siguientes, tenemos converiones que no están enlazadas con id_user ni gclid o cookie, por ello las partidas Nan se pueden meter en otros o tomarlas

como sitelink (es decir Nan != 0 y Nan != ""). He dejado este criterio para los cáculos

In [89]: click_anuncio= dfTotal[((dfTotal["site_link"]=="" ) | (dfTotal["site_link"]==0 ) ) ]['site_link'].count()


print ("Nº de clicks en anuncios: ", click_anuncio)
click_site= dfTotal[((dfTotal["site_link"]!="" ) & (dfTotal["site_link"]!=0) & (dfTotal["site_link"]!="undefined" ) ) ]['site_li
print ("Nº de clicks en site: ", click_site)
click_und= dfTotal[dfTotal["site_link"]=="undefined"]['site_link'].count()
print ("Nº de clicks indefinidos: ", click_und)


sl_convert= dfTotal[((dfTotal["site_link"]!="") & (dfTotal["site_link"]!=0) ) & (dfTotal["result"]=="Positivo")]['result'].count()
print ("Nº de clicks en site link con conversión Positiva: ",sl_convert,end='\n')
anuncios_convert= dfTotal[((dfTotal["site_link"]=="" ) | (dfTotal["site_link"]=="0" ) ) & (dfTotal["result"]=="Positivo")]['r
print ("Nº de clicks en anuncio con conversión Positiva: ",anuncios_convert, end='\n')
clickes=dfTotal["site_link"].count()
print ("Nº de clicks Totales: ", clickes)

print ("% de clicks covertidos sobre anuncios: ", anuncios_convert*100/click_anuncio)
print ("% de clicks covertidos sobre site click: ", sl_convert*100/click_site)

Nº de clicks en anuncios: 4642

Nº de clicks en site: 900

Nº de clicks indefinidos: 28

Nº de clicks en site link con conversión Positiva: 2

Nº de clicks en anuncio con conversión Positiva: 4

Nº de clicks Totales: 5570

% de clicks covertidos sobre anuncios: 0.08616975441619991

% de clicks covertidos sobre site click: 0.2222222222222222

In [100]: informe2= dfTotal[((dfTotal["site_link"]=="") | (dfTotal["site_link"]==0 )) & (dfTotal["result"]=="Positivo")][['date','campaña','


print("Informe de Positivos con clicks desde anuncios: \n\n",informe2)
informe2_positivos.to_csv('Informe2_positivos_anuncios.csv', sep=';',index=False)

Informe de Positivos con clicks desde anuncios:

date campaña adgroup advertisement site_link result

1418 06/09/2021 1648648995 62589383945 481025151787 Positivo

2641 06/09/2021 1646744098 58527617970 497204330125 Positivo

5128 06/09/2021 732187328 46724581628 533655604703 Positivo

5182 08/09/2021 732401028 46724585188 477211734920 Positivo

In [101]: informe3=dfTotal[((dfTotal["site_link"]!="") & (dfTotal["site_link"]!=0 )) & (dfTotal["result"]=="Positivo")][['date','campaña','a


print("Informe de Positivos con clicks desde site: \n\n",informe3)
informe3.to_csv('Informe3_positivos_anuncios.csv', sep=';',index=False)

Informe de Positivos con clicks desde site:

date campaña adgroup advertisement site_link result

5652 06/09/2021 NaN NaN NaN NaN Positivo

5655 06/09/2021 NaN NaN NaN NaN Positivo

In [ ]: ​

In [ ]: ​

In [ ]: ​

In [ ]: ​

In [ ]: ​

También podría gustarte