<jupyter_start><jupyter_text>Primero importamos todas las librerías que vamos a utilizar<jupyter_code>import pandas as pd
import numbers as np
import csv<jupyter_output><empty_output><jupyter_text>"EJERCICIO 1:  CREACIÓN Y MEJORA DE LOS FICHEROS " Leer los datos con python. Ficheros de navegación y de conversión<jupyter_code>def leer_csv (archivo):
    df= pd.read_csv(archivo, sep = ';')
    return df
#Leemos el archivo conversiones.py
df_conv = leer_csv('conversiones.csv')
df_conv.head()
#Leemos el archivo navegacion.py
df_nav = leer_csv('navegacion.csv')
df_nav.head()<jupyter_output><empty_output><jupyter_text>Separar los datos en columnas, y obtener para cada línea de navegación: campaña, adgoup, advertisement y site link que se obtiene de la columna URL.<jupyter_code>def separar_url (fila, df):
    df_url=df._get_value(fila,'url_landing')
    url_parts = df_url.split('&')
    try:
        for part in url_parts:
            key, value= part.split('=')
            if key == 'camp':
                print (key ,'=', value)
            if key == 'adg':
                print (key,'=', value)
            if key == 'adv':
                print (key, '=', value)
            if key == 'sl':
                if value == '':
                    value = '0'
                print (key, '=', value)
    except ValueError:
            print ('')
separar_url (120, df_nav)
#Ahora lo probamos ocn la columna 137, la cual no tiene los parámetros que nos pide el ejercicio 
#porque la url es erronea. No tiene que devolver nada
separar_url (137, df_nav)<jupyter_output><jupyter_text>Identificar si hay usuarios repetidos: id_user, gclid, cookie El gclid es lo mismo que las cookies Para los que no tienen id_user, hay que mirar el gclid, y si tampoco está hay que mirar la cookie<jupyter_code>#True= común
#False= diferente
df_conv['id_user'].isin(df_nav['id_user']).value_counts()<jupyter_output><empty_output><jupyter_text>El primer DataFrame que escribas por parámetro, será el DataFrame que retornará con los id_user que estén repetidos en el segundo dataFrame<jupyter_code>def rep_id_user (df1, df2):
    df_rep = df1.loc[df1['id_user'].isin(df2['id_user'])]
        
    return df_rep
rep_id_user (df_conv, df_nav)
rep_id_user (df_nav, df_conv)
#True= común
#False= diferente
df_conv['gclid'].isin(df_nav['gclid']).value_counts()
def rep_gclid (df1, df2):
    df_rep = df1.loc[df1['gclid'].isin(df2['gclid'])]
        
    return df_rep
rep_gclid (df_conv, df_nav)
rep_gclid (df_nav, df_conv)<jupyter_output><empty_output><jupyter_text>Y ordenar los datos según ts<jupyter_code>def ordenar_ts (df):
    return df.sort_values('ts')
ordenar_ts(df_nav)<jupyter_output><empty_output><jupyter_text>Unir los datos de navegación ya tratados con los datos de conversiones,creando una columna de 0 y 1 indicando si el usuario no ha convertido o si ha convertido. La unión se hace a partir de la columna id_suite, si esta está vacía sería por la de gclid, y si esta está vacía también por cookie. Nota: tenemos 2 opciones (ISSUES) a) Si hay usuarios repetidos nos quedamos con un solo dato (ISSUES/COMPROBAR QUE HAY CON UN COMMIT) b) Si nos quedamos con todos los datos repetidos buscar el más cercano a la conversión<jupyter_code>#creamos una nueva columna en conv 
def columna_conversion(df):
    for i in df:
        conversion = '1'
    df['conversion'] = conversion
def columna_datos_dummies(df):
    df.loc[df['conversion'].isna(), 'conversion']=0
def crear_df_total(df1,df2):
    columna_conversion(df1)
    df_total=pd.concat([df2 , df1])
    columna_datos_dummies(df_total)
    return df_total<jupyter_output><empty_output><jupyter_text>Ahora, para los usuarios que te tengan verdadero en user_recurrence, hallamos el gclid<jupyter_code>def establecer_cookies(df):
    df.drop(df[df['user_recurrent']==False].index , inplace=True  )
    return df['gclid']
df_total=crear_df_total(df_conv , df_nav)
df_total
establecer_cookies(df_total)
def eliminar_duplicados (df):
    df.drop_duplicates(subset ="id_user",
        keep = False, inplace = True)
    return df
df_total_elim= eliminar_duplicados (df_total)
df_total_elim<jupyter_output><empty_output><jupyter_text>"EJERCICIO 2: CREACIÓN DE LOS INFORMES DE LOS APARTADOS" Cuántas visitas recibe en el día el cliente<jupyter_code>#El número de visitas es el número de filas del fichero
#No hay ningún reperido ya en el fichero
def num_visitas (df):
    return df.shape[0]
num_visitas (df_total)<jupyter_output><empty_output><jupyter_text>Del número de visitas totales, cuántas de ellas convierten y cuántas no (en %)<jupyter_code>def porcentaje_id_user (df1, df2):
    a=df1.shape[0]
    b=num_visitas(df_total)
    porcentaje=(a/b)*100
    porcentaje_no=100-porcentaje
    return ('Del total de visitas, un ' +str(porcentaje) +' se convierte y un '+ str(porcentaje_no) + ' porciento no se convierte')
porcentaje_id_user (df_nav, df_conv)<jupyter_output><empty_output><jupyter_text>Por tipo de conversión (CALL o FORM), ¿cuántas hay de cada una? Este método solo le llamamos a df_conv porque df_nav no tiene una columna 'lead_type'<jupyter_code>def call_form (df):
    call = 0
    form = 0
    for i in range (df.shape[0]):
        if df._get_value (i, 'lead_type')== 'CALL':
            call+=1
        else:
            form +=1
    return print('Hay '+ str(call)+ ' call repetidos y form hay '+str(form))
call_form (df_conv)<jupyter_output>Hay 19 call repetidos y form hay 9<jupyter_text>Porcentaje de usuarios recurrentes sobre el total de usuarios<jupyter_code>#La columna 'user_recurrent' nos indica si un usuario es recurrente(true) o no(false)
#Creamos una función para sacar el true o false 
def sacar_user_recurrent (fila, df):
    df_user_recurrent=df._get_value(fila,'user_recurrent')
    return df_user_recurrent
sacar_user_recurrent(0, df_nav)
#Ahora sacamos una función para sacar el número total de true en el df
def total_true (df):
    total=(df['user_recurrent'].values == True).sum()
    return total
total_true (df_nav)
#Ahora creamos el método
def porcentaje_recurrent (df):
    len_df = df.shape[0]
    len_true = total_true(df)
    return ('El porcentaje es '+ str((len_true/len_df)*100)+ ' %')
porcentaje_recurrent(df_nav)<jupyter_output><empty_output><jupyter_text>Coche más visitado. ¿Es el que más convierte?<jupyter_code>#Primero creamos los métodos para sacar el coche de cada url
def sacar_coche(fila, df):
    df_url=df._get_value(fila,'url_landing')
    
    return sep_url_coche (df_url)

def sep_url_coche (df_url):
    url_parts = df_url.split('/')
    coche = url_parts[4]
    return coche
sacar_coche (2, df_nav)
#Ahora intentamos crear una función para iterar el bucle
def coches (df):
    longitud = len(df)
    for i  in range (longitud-2):
        coches = sacar_coche (i, df)
    return coches
def coches (df):  
    array = []
    try:
        for i  in range (7295):
            df_url= df._get_value(i, 'url_landing')
            str_url = str(df_url)
            url_parts = str_url.split('/')
            if len(url_parts[4])<= 17:
                array.append(url_parts[4])
    except IndexError:
        print ('')
    return array
#Este método está mal, porque no retorna todoslos coches por un problema de IndexError, 
# pero si poniamos for i in range (0, len(df)); nos daba error. La solución fue poner un 
#range de 7295, que es el numero total de filas, y un try and except para coger la excepción IndexError
array_coches = coches(df_nav)
array_coches
def contar (array):
    for i in array:
        num= array.count(i)
        print('El coche '+ str(i)+' se ha repetido '+ str(num)+' veces')
        array.remove(i)
        for j in array:
            if j == i:
                array.remove(j)
#Hay varios errores
    #1  que no se eliminan todos los elementos repetidos, ya que cada vez que lla 
contar (array_coches)<jupyter_output>El coche ixs-electrico se ha repetido 1 veces
El coche tria se ha repetido 10 veces
El coche k43 se ha repetido 1 veces
El coche clin400 se ha repetido 2 veces
El coche cea se ha repetido 4 veces
El coche dep30 se ha repetido 5 veces
El coche clin200 se ha repetido 4 veces
El coche home se ha repetido 2 veces
El coche clin200-electrico se ha repetido 1 veces
El coche dep30 se ha repetido 1 veces
{'fraction_non_alphanumeric': 0.09336728507336, 'fraction_numerical': 0.012004365223717716, 'mean_word_length': 3.998787878787879, 'pattern_counts': {'":': 0, '<': 51, '<?xml version=': 0, '>': 50, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '212887', 'license': 'Apache-2.0', 'n_tokens_mistral': 3106, 'n_tokens_neox': 3024, 'n_words': 904, 'path': 'examen_parcial_1.ipynb', 'repo_name': 'mariaSerrabona/examen_parcial', 'size': '8247'}