-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathga4Funnels.py
94 lines (67 loc) · 4.47 KB
/
ga4Funnels.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from tkinter import simpledialog
import pandas as pd
import matplotlib.pyplot as plt
from modules.excel_creator import save_dataframe_to_excel_ga4
from report import anotar_datos_excel
def get_funnel(ruta_archivo, nombre_salida, columna_inicio, fila_inicio, carpeta_salida):
data = pd.read_csv(ruta_archivo, encoding='utf-8', skiprows=9)
# Eliminar la columna "Ingreso Active users"
data = data.drop(columns=['Ingreso Active users'], errors='ignore')
# Ordenar las filas por la columna 'Day'
data = data.sort_values(by='Day', ascending=True)
# Convertir los valores numéricos en 'Day' a enteros para asegurar un orden correcto
data['Day'] = pd.to_numeric(data['Day'], errors='coerce')
# Reorganizar los datos para que los pasos sean filas y los días sean columnas
pivot_days = data.set_index('Day').T
# Crear una columna "Total" que sume los valores de todos los días
pivot_days['Total'] = pivot_days.sum(axis=1)
# Limpiar los nombres de los pasos
pivot_days.index = pivot_days.index.str.replace(r'^\d+\.\s*', '', regex=True)
# Identificar la primera fila como referencia para calcular los porcentajes
reference_row = pivot_days.iloc[0] # Seleccionar la primera fila
reference_row_name = pivot_days.index[0] # Guardar el nombre de la fila de referencia
# Calcular la tabla de porcentajes basada en la primera fila
percentages_table = pivot_days.div(reference_row) * 100
# Renombrar las filas para diferenciar las tablas
percentages_table.index = [f"{step} (%)" for step in percentages_table.index]
# Concatenar la tabla original con la tabla de porcentajes
final_table_with_percentages = pd.concat([pivot_days, percentages_table])
# Separar las tablas de números y porcentajes
counts_table = final_table_with_percentages[~final_table_with_percentages.index.str.contains(r'\(%\)', regex=True)]
percentages_table = final_table_with_percentages[final_table_with_percentages.index.str.contains(r'\(%\)', regex=True)]
# Excluir la primera fila de la tabla de porcentajes (que representa el 100%)
percentages_table = percentages_table[percentages_table.index != f"{reference_row_name} (%)"]
# Formatear la tabla de porcentajes como valores porcentuales
percentages_table = percentages_table.applymap(lambda x: f"{x:.2f}%" if pd.notnull(x) else "")
# Concatenar las tablas con una fila de espacio en blanco entre ambas
empty_row = pd.DataFrame([["" for _ in counts_table.columns]], columns=counts_table.columns)
final_table_spaced = pd.concat([counts_table, empty_row, percentages_table])
# Calcular los porcentajes relativos al paso anterior
percentages_previous_step = pivot_days.copy()
for column in percentages_previous_step.columns:
percentages_previous_step[column] = percentages_previous_step[column] / percentages_previous_step[column].shift(1)
percentages_previous_step[column] *= 100
# Reemplazar valores indefinidos (NaN) y negativos con 0%
percentages_previous_step = percentages_previous_step.fillna(0).clip(lower=0)
# Formatear la tabla de porcentajes como valores porcentuales
percentages_previous_step = percentages_previous_step.applymap(
lambda x: f"{x:.2f}%" if pd.notnull(x) else "")
# Renombrar las filas para indicar el paso anterior
steps_with_previous = percentages_previous_step.index.tolist()
steps_with_previous = [
f"{steps_with_previous[i]} (vs '{steps_with_previous[i - 1]}')"
if i > 0 else steps_with_previous[i] for i in range(len(steps_with_previous))
]
percentages_previous_step.index = steps_with_previous
# Excluir la primera fila ya que no tiene paso anterior
percentages_previous_step = percentages_previous_step.iloc[1:]
# Concatenar la nueva tabla con un espacio en blanco al final de las demás tablas
empty_row_previous = pd.DataFrame(
[["" for _ in pivot_days.columns]], columns=pivot_days.columns)
final_table_spaced_with_previous = pd.concat(
[final_table_spaced, empty_row, percentages_previous_step]
)
save_dataframe_to_excel_ga4(percentages_table, percentages_previous_step, final_table_spaced_with_previous, nombre_salida, carpeta_salida)
# Obtener los datos de la última columna de percentages_previous_step como una lista
datos = percentages_previous_step.iloc[:, -1].tolist()
anotar_datos_excel(datos, columna_inicio, fila_inicio)