Spaces:
Sleeping
Sleeping
GMARTINEZMILLA
commited on
Commit
•
6e09d82
1
Parent(s):
d67815a
feat: generated files
Browse files- app.py +129 -27
- clientes_relevantes.csv +684 -0
- productos.csv +0 -0
app.py
CHANGED
@@ -3,6 +3,8 @@ import pandas as pd
|
|
3 |
import plotly.express as px
|
4 |
import matplotlib.pyplot as plt
|
5 |
import numpy as np
|
|
|
|
|
6 |
|
7 |
# Page configuration
|
8 |
st.set_page_config(page_title="Customer Insights App", page_icon=":bar_chart:")
|
@@ -16,6 +18,11 @@ euros_proveedor = pd.read_csv("euros_proveedor.csv", sep=',')
|
|
16 |
df['CLIENTE'] = df['CLIENTE'].astype(str)
|
17 |
nombres_proveedores['codigo'] = nombres_proveedores['codigo'].astype(str)
|
18 |
euros_proveedor['CLIENTE'] = euros_proveedor['CLIENTE'].astype(str)
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
# Convert all columns except 'CLIENTE' to float in euros_proveedor
|
21 |
for col in euros_proveedor.columns:
|
@@ -87,7 +94,7 @@ st.markdown("""
|
|
87 |
""")
|
88 |
|
89 |
# Navigation menu
|
90 |
-
page = st.selectbox("Select the tool you want to use", ["", "Customer Analysis", "
|
91 |
|
92 |
# Home Page
|
93 |
if page == "":
|
@@ -188,11 +195,14 @@ elif page == "Customer Analysis":
|
|
188 |
st.warning(f"No data found for customer {customer_code}. Please check the code.")
|
189 |
|
190 |
# Customer Recommendations Page
|
191 |
-
elif page == "
|
192 |
-
st.title("
|
193 |
-
st.markdown("""Get tailored product recommendations for your customers based on their purchasing basket.""")
|
194 |
|
195 |
-
|
|
|
|
|
|
|
|
|
196 |
partial_code = st.text_input("Enter part of Customer Code for Recommendations (or leave empty to see all)")
|
197 |
if partial_code:
|
198 |
filtered_customers = df[df['CLIENTE'].str.contains(partial_code)]
|
@@ -201,30 +211,122 @@ elif page == "Basket Recommendations":
|
|
201 |
customer_list = filtered_customers['CLIENTE'].unique()
|
202 |
customer_code = st.selectbox("Select Customer Code for Recommendations", customer_list)
|
203 |
|
204 |
-
#
|
205 |
-
|
206 |
-
|
|
|
|
|
207 |
|
208 |
-
#
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
for i in range(num_lines):
|
213 |
-
col1, col2 = st.columns(2)
|
214 |
-
with col1:
|
215 |
-
article_code = st.text_input(f"Enter Article Code for Line {i + 1}")
|
216 |
-
with col2:
|
217 |
-
units = st.number_input(f"Enter Units for Line {i + 1}", min_value=1, value=1, step=1)
|
218 |
|
219 |
-
|
220 |
-
|
221 |
-
basket_items.append((article_code, units))
|
222 |
|
223 |
-
# Generate the concatenated string
|
224 |
-
input_cesta = ''.join([f"{code * units}" for code, units in basket_items])
|
225 |
|
226 |
-
#
|
227 |
-
|
228 |
|
229 |
-
#
|
230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
import plotly.express as px
|
4 |
import matplotlib.pyplot as plt
|
5 |
import numpy as np
|
6 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
7 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
8 |
|
9 |
# Page configuration
|
10 |
st.set_page_config(page_title="Customer Insights App", page_icon=":bar_chart:")
|
|
|
18 |
df['CLIENTE'] = df['CLIENTE'].astype(str)
|
19 |
nombres_proveedores['codigo'] = nombres_proveedores['codigo'].astype(str)
|
20 |
euros_proveedor['CLIENTE'] = euros_proveedor['CLIENTE'].astype(str)
|
21 |
+
fieles_df = pd.read_csv("clientes_relevantes.csv")
|
22 |
+
# Cargo csv del histórico de cestas
|
23 |
+
cestas = pd.read_csv("cestas.csv")
|
24 |
+
# Cargo csv de productos y descripcion
|
25 |
+
productos = pd.read_csv("productos.csv")
|
26 |
|
27 |
# Convert all columns except 'CLIENTE' to float in euros_proveedor
|
28 |
for col in euros_proveedor.columns:
|
|
|
94 |
""")
|
95 |
|
96 |
# Navigation menu
|
97 |
+
page = st.selectbox("Select the tool you want to use", ["", "Customer Analysis", "Articles Recommendations"])
|
98 |
|
99 |
# Home Page
|
100 |
if page == "":
|
|
|
195 |
st.warning(f"No data found for customer {customer_code}. Please check the code.")
|
196 |
|
197 |
# Customer Recommendations Page
|
198 |
+
elif page == "Articles Recommendations":
|
199 |
+
st.title("Articles Recommendations")
|
|
|
200 |
|
201 |
+
st.markdown("""
|
202 |
+
Get tailored recommendations for your customers based on their basket.
|
203 |
+
""")
|
204 |
+
|
205 |
+
# Campo input para cliente
|
206 |
partial_code = st.text_input("Enter part of Customer Code for Recommendations (or leave empty to see all)")
|
207 |
if partial_code:
|
208 |
filtered_customers = df[df['CLIENTE'].str.contains(partial_code)]
|
|
|
211 |
customer_list = filtered_customers['CLIENTE'].unique()
|
212 |
customer_code = st.selectbox("Select Customer Code for Recommendations", customer_list)
|
213 |
|
214 |
+
# DEfinicion de la funcion recomienda
|
215 |
+
def recomienda(new_basket):
|
216 |
+
# Calcular la matriz TF-IDF
|
217 |
+
tfidf = TfidfVectorizer()
|
218 |
+
tfidf_matrix = tfidf.fit_transform(cestas['Cestas'])
|
219 |
|
220 |
+
# Convertir la nueva cesta en formato TF-IDF
|
221 |
+
new_basket_str = ' '.join(new_basket)
|
222 |
+
new_basket_tfidf = tfidf.transform([new_basket_str])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
|
224 |
+
# Comparar la nueva cesta con las anteriores
|
225 |
+
similarities = cosine_similarity(new_basket_tfidf, tfidf_matrix)
|
|
|
226 |
|
|
|
|
|
227 |
|
228 |
+
# Obtener los índices de las cestas más similares
|
229 |
+
similar_indices = similarities.argsort()[0][-3:] # Las 3 más similares
|
230 |
|
231 |
+
# Crear un diccionario para contar las recomendaciones
|
232 |
+
recommendations_count = {}
|
233 |
+
total_similarity = 0
|
234 |
+
|
235 |
+
# Recomendar productos de cestas similares
|
236 |
+
for idx in similar_indices:
|
237 |
+
sim_score = similarities[0][idx]
|
238 |
+
total_similarity += sim_score
|
239 |
+
products = cestas.iloc[idx]['Cestas'].split()
|
240 |
+
|
241 |
+
for product in products:
|
242 |
+
if product.strip() not in new_basket: # Evitar recomendar lo que ya está en la cesta
|
243 |
+
if product.strip() in recommendations_count:
|
244 |
+
recommendations_count[product.strip()] += sim_score
|
245 |
+
else:
|
246 |
+
recommendations_count[product.strip()] = sim_score
|
247 |
+
|
248 |
+
# Calcular la probabilidad relativa de cada producto recomendado
|
249 |
+
recommendations_with_prob = []
|
250 |
+
if total_similarity > 0: # Verificar que total_similarity no sea cero
|
251 |
+
recommendations_with_prob = [(product, score / total_similarity) for product, score in recommendations_count.items()]
|
252 |
+
else:
|
253 |
+
print("No se encontraron similitudes suficientes para calcular probabilidades.")
|
254 |
+
|
255 |
+
recommendations_with_prob.sort(key=lambda x: x[1], reverse=True) # Ordenar por puntuación
|
256 |
+
|
257 |
+
# Crear un nuevo DataFrame para almacenar las recomendaciones con descripciones y probabilidades
|
258 |
+
recommendations_df = pd.DataFrame(columns=['ARTICULO', 'DESCRIPCION', 'PROBABILIDAD'])
|
259 |
+
|
260 |
+
# Agregar las recomendaciones al DataFrame usando pd.concat
|
261 |
+
for product, prob in recommendations_with_prob:
|
262 |
+
# Buscar la descripción en el DataFrame de productos
|
263 |
+
description = productos.loc[productos['ARTICULO'] == product, 'DESCRIPCION']
|
264 |
+
if not description.empty:
|
265 |
+
# Crear un nuevo DataFrame temporal para la recomendación
|
266 |
+
temp_df = pd.DataFrame({
|
267 |
+
'ARTICULO': [product],
|
268 |
+
'DESCRIPCION': [description.values[0]], # Obtener el primer valor encontrado
|
269 |
+
'PROBABILIDAD': [prob]
|
270 |
+
})
|
271 |
+
# Concatenar el DataFrame temporal al DataFrame de recomendaciones
|
272 |
+
recommendations_df = pd.concat([recommendations_df, temp_df], ignore_index=True)
|
273 |
+
|
274 |
+
return recommendations_df
|
275 |
+
|
276 |
+
# Comprobar si el cliente está en el CSV de fieles
|
277 |
+
|
278 |
+
is_fiel = customer_code in fieles_df['CLIENTE'].astype(str).values
|
279 |
+
|
280 |
+
if customer_code:
|
281 |
+
if is_fiel:
|
282 |
+
st.write(f"### Customer {customer_code} is a loyal customer.")
|
283 |
+
option = st.selectbox("Select Recommendation Type", ["Select an option", "By Purchase History", "By Current Basket"])
|
284 |
+
|
285 |
+
if option == "By Purchase History":
|
286 |
+
st.warning("Option not available... aún")
|
287 |
+
elif option == "By Current Basket":
|
288 |
+
|
289 |
+
st.write("Enter the items in the basket:")
|
290 |
+
|
291 |
+
# Input para los artículos y unidades
|
292 |
+
items = st.text_input("Enter items (comma-separated):").split(',')
|
293 |
+
quantities = st.text_input("Enter quantities (comma-separated):").split(',')
|
294 |
+
|
295 |
+
# Crear una lista de artículos basada en la entrada
|
296 |
+
new_basket = [item.strip() for item in items]
|
297 |
+
|
298 |
+
# Asegurarse de que las longitudes de artículos y cantidades coincidan
|
299 |
+
if len(new_basket) == len(quantities):
|
300 |
+
# Procesar la lista para recomendar
|
301 |
+
recommendations_df = recomienda(new_basket)
|
302 |
+
|
303 |
+
if not recommendations_df.empty:
|
304 |
+
st.write("### Recommendations based on the current basket:")
|
305 |
+
st.dataframe(recommendations_df)
|
306 |
+
else:
|
307 |
+
st.warning("No recommendations found for the provided basket.")
|
308 |
+
else:
|
309 |
+
st.warning("The number of items must match the number of quantities.")
|
310 |
+
else:
|
311 |
+
st.write(f"### Customer {customer_code} is not a loyal customer.")
|
312 |
+
st.write("Recommendation based on the basket. Please enter the items:")
|
313 |
+
|
314 |
+
# Input para los artículos y unidades
|
315 |
+
items = st.text_input("Enter items (comma-separated):").split(',')
|
316 |
+
quantities = st.text_input("Enter quantities (comma-separated):").split(',')
|
317 |
+
|
318 |
+
# Crear una lista de artículos basada en la entrada
|
319 |
+
new_basket = [item.strip() for item in items]
|
320 |
+
|
321 |
+
# Asegurarse de que las longitudes de artículos y cantidades coincidan
|
322 |
+
if len(new_basket) == len(quantities):
|
323 |
+
# Procesar la lista para recomendar
|
324 |
+
recommendations_df = recomienda(new_basket)
|
325 |
+
|
326 |
+
if not recommendations_df.empty:
|
327 |
+
st.write("### Recommendations based on the current basket:")
|
328 |
+
st.dataframe(recommendations_df)
|
329 |
+
else:
|
330 |
+
st.warning("No recommendations found for the provided basket.")
|
331 |
+
else:
|
332 |
+
st.warning("The number of items must match the number of quantities.")
|
clientes_relevantes.csv
ADDED
@@ -0,0 +1,684 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
,Cliente
|
2 |
+
0,1019
|
3 |
+
5,1161
|
4 |
+
6,1169
|
5 |
+
7,1177
|
6 |
+
8,1193
|
7 |
+
11,1218
|
8 |
+
12,1232
|
9 |
+
16,1348
|
10 |
+
19,1381
|
11 |
+
20,1403
|
12 |
+
22,1421
|
13 |
+
23,1447
|
14 |
+
25,1486
|
15 |
+
28,1523
|
16 |
+
30,1575
|
17 |
+
32,1597
|
18 |
+
35,1630
|
19 |
+
39,1665
|
20 |
+
41,1692
|
21 |
+
43,1853
|
22 |
+
47,2098
|
23 |
+
49,2132
|
24 |
+
52,2190
|
25 |
+
53,2192
|
26 |
+
54,2204
|
27 |
+
55,2247
|
28 |
+
56,2252
|
29 |
+
57,2267
|
30 |
+
59,2279
|
31 |
+
60,2308
|
32 |
+
62,2484
|
33 |
+
63,3001
|
34 |
+
64,3003
|
35 |
+
65,3016
|
36 |
+
66,4350
|
37 |
+
67,5018
|
38 |
+
68,5022
|
39 |
+
69,5037
|
40 |
+
70,5295
|
41 |
+
72,6000
|
42 |
+
74,6062
|
43 |
+
75,6077
|
44 |
+
76,6079
|
45 |
+
77,6089
|
46 |
+
78,6110
|
47 |
+
87,6503
|
48 |
+
88,6506
|
49 |
+
90,6515
|
50 |
+
94,6559
|
51 |
+
96,6588
|
52 |
+
97,6593
|
53 |
+
100,7034
|
54 |
+
101,7035
|
55 |
+
103,7073
|
56 |
+
105,7136
|
57 |
+
106,7141
|
58 |
+
107,7179
|
59 |
+
108,7219
|
60 |
+
109,7243
|
61 |
+
110,7335
|
62 |
+
111,7340
|
63 |
+
112,7451
|
64 |
+
118,7593
|
65 |
+
121,7622
|
66 |
+
122,7629
|
67 |
+
123,7667
|
68 |
+
124,7701
|
69 |
+
125,7702
|
70 |
+
127,7763
|
71 |
+
129,7791
|
72 |
+
131,7806
|
73 |
+
132,8060
|
74 |
+
133,8063
|
75 |
+
136,8222
|
76 |
+
137,8227
|
77 |
+
139,8955
|
78 |
+
141,10018
|
79 |
+
145,12197
|
80 |
+
147,12566
|
81 |
+
149,12595
|
82 |
+
150,12612
|
83 |
+
151,13244
|
84 |
+
152,14023
|
85 |
+
153,14030
|
86 |
+
155,14064
|
87 |
+
156,14079
|
88 |
+
158,14104
|
89 |
+
159,14165
|
90 |
+
161,14177
|
91 |
+
162,14182
|
92 |
+
166,78020
|
93 |
+
170,78028
|
94 |
+
173,78050
|
95 |
+
174,78065
|
96 |
+
181,78102
|
97 |
+
184,78116
|
98 |
+
185,78122
|
99 |
+
187,78129
|
100 |
+
189,78155
|
101 |
+
191,78177
|
102 |
+
193,78195
|
103 |
+
195,78208
|
104 |
+
196,78218
|
105 |
+
198,78222
|
106 |
+
200,78229
|
107 |
+
202,78248
|
108 |
+
203,78253
|
109 |
+
205,78272
|
110 |
+
206,78276
|
111 |
+
207,78283
|
112 |
+
210,78300
|
113 |
+
213,78332
|
114 |
+
214,78335
|
115 |
+
222,78387
|
116 |
+
224,78398
|
117 |
+
225,78401
|
118 |
+
231,78450
|
119 |
+
232,78453
|
120 |
+
233,78463
|
121 |
+
234,78469
|
122 |
+
237,78486
|
123 |
+
239,78491
|
124 |
+
244,78539
|
125 |
+
252,78584
|
126 |
+
253,78585
|
127 |
+
256,78591
|
128 |
+
257,78601
|
129 |
+
260,78611
|
130 |
+
267,78664
|
131 |
+
270,78673
|
132 |
+
271,78679
|
133 |
+
276,78704
|
134 |
+
281,78722
|
135 |
+
283,78725
|
136 |
+
291,78739
|
137 |
+
294,78743
|
138 |
+
295,78747
|
139 |
+
296,78748
|
140 |
+
299,78756
|
141 |
+
300,78762
|
142 |
+
301,78763
|
143 |
+
304,78773
|
144 |
+
309,78796
|
145 |
+
310,78799
|
146 |
+
311,78802
|
147 |
+
312,78803
|
148 |
+
315,78817
|
149 |
+
317,78827
|
150 |
+
318,78830
|
151 |
+
319,78832
|
152 |
+
326,78858
|
153 |
+
327,78868
|
154 |
+
328,78872
|
155 |
+
329,78879
|
156 |
+
334,78901
|
157 |
+
338,78916
|
158 |
+
343,78942
|
159 |
+
347,78951
|
160 |
+
348,78953
|
161 |
+
351,78969
|
162 |
+
355,78987
|
163 |
+
357,78991
|
164 |
+
358,79001
|
165 |
+
359,79017
|
166 |
+
360,79019
|
167 |
+
361,79023
|
168 |
+
362,79024
|
169 |
+
363,79031
|
170 |
+
365,79037
|
171 |
+
369,79071
|
172 |
+
371,79081
|
173 |
+
373,79086
|
174 |
+
374,79090
|
175 |
+
376,79093
|
176 |
+
377,79095
|
177 |
+
379,79101
|
178 |
+
382,79113
|
179 |
+
383,79114
|
180 |
+
385,79117
|
181 |
+
386,79127
|
182 |
+
387,79129
|
183 |
+
389,79133
|
184 |
+
392,79145
|
185 |
+
393,79152
|
186 |
+
394,79160
|
187 |
+
395,79164
|
188 |
+
400,79177
|
189 |
+
401,79187
|
190 |
+
402,79188
|
191 |
+
403,79192
|
192 |
+
404,79193
|
193 |
+
405,79198
|
194 |
+
408,79205
|
195 |
+
409,79210
|
196 |
+
410,79211
|
197 |
+
411,79217
|
198 |
+
412,79221
|
199 |
+
415,79237
|
200 |
+
417,79266
|
201 |
+
420,79280
|
202 |
+
421,79284
|
203 |
+
422,79297
|
204 |
+
423,79316
|
205 |
+
424,79324
|
206 |
+
425,79325
|
207 |
+
426,79328
|
208 |
+
427,79331
|
209 |
+
428,79340
|
210 |
+
430,79354
|
211 |
+
431,79355
|
212 |
+
433,79361
|
213 |
+
434,79362
|
214 |
+
436,79378
|
215 |
+
444,79426
|
216 |
+
445,79435
|
217 |
+
447,79451
|
218 |
+
448,79462
|
219 |
+
449,79465
|
220 |
+
450,79466
|
221 |
+
451,79467
|
222 |
+
452,79477
|
223 |
+
453,79480
|
224 |
+
454,79483
|
225 |
+
455,79486
|
226 |
+
456,79488
|
227 |
+
458,79495
|
228 |
+
459,79497
|
229 |
+
463,79518
|
230 |
+
465,79529
|
231 |
+
466,79531
|
232 |
+
471,79549
|
233 |
+
472,79550
|
234 |
+
473,79551
|
235 |
+
476,79561
|
236 |
+
477,79565
|
237 |
+
478,79568
|
238 |
+
479,79576
|
239 |
+
480,79580
|
240 |
+
483,79593
|
241 |
+
484,79594
|
242 |
+
485,79609
|
243 |
+
486,79610
|
244 |
+
487,79614
|
245 |
+
489,79631
|
246 |
+
495,79653
|
247 |
+
496,79655
|
248 |
+
497,79660
|
249 |
+
498,79667
|
250 |
+
499,79673
|
251 |
+
500,79674
|
252 |
+
501,79686
|
253 |
+
502,79687
|
254 |
+
504,79694
|
255 |
+
506,79703
|
256 |
+
509,79727
|
257 |
+
513,79742
|
258 |
+
514,79754
|
259 |
+
515,79757
|
260 |
+
516,79762
|
261 |
+
517,79764
|
262 |
+
519,79769
|
263 |
+
522,79775
|
264 |
+
524,79786
|
265 |
+
526,79789
|
266 |
+
528,79803
|
267 |
+
529,79807
|
268 |
+
530,79812
|
269 |
+
531,79819
|
270 |
+
532,79827
|
271 |
+
535,79843
|
272 |
+
536,79844
|
273 |
+
537,79854
|
274 |
+
538,79859
|
275 |
+
539,79863
|
276 |
+
543,79907
|
277 |
+
544,79908
|
278 |
+
545,79909
|
279 |
+
546,79915
|
280 |
+
547,79920
|
281 |
+
548,79921
|
282 |
+
549,79931
|
283 |
+
550,79932
|
284 |
+
551,79933
|
285 |
+
556,79953
|
286 |
+
557,79965
|
287 |
+
558,79981
|
288 |
+
559,79991
|
289 |
+
561,80018
|
290 |
+
562,80022
|
291 |
+
563,80024
|
292 |
+
564,80026
|
293 |
+
565,80027
|
294 |
+
566,80030
|
295 |
+
567,80033
|
296 |
+
568,80036
|
297 |
+
569,80038
|
298 |
+
570,80039
|
299 |
+
571,80042
|
300 |
+
572,80044
|
301 |
+
573,80045
|
302 |
+
574,80048
|
303 |
+
575,80058
|
304 |
+
580,80087
|
305 |
+
581,80095
|
306 |
+
583,80106
|
307 |
+
584,80108
|
308 |
+
585,80123
|
309 |
+
586,80129
|
310 |
+
588,80139
|
311 |
+
590,80147
|
312 |
+
592,80156
|
313 |
+
595,80164
|
314 |
+
599,80180
|
315 |
+
600,80183
|
316 |
+
604,80197
|
317 |
+
605,80202
|
318 |
+
607,80210
|
319 |
+
610,80225
|
320 |
+
611,80231
|
321 |
+
613,80243
|
322 |
+
614,80249
|
323 |
+
619,80259
|
324 |
+
622,80287
|
325 |
+
624,80298
|
326 |
+
625,80301
|
327 |
+
626,80303
|
328 |
+
627,80307
|
329 |
+
628,80308
|
330 |
+
629,80310
|
331 |
+
630,80312
|
332 |
+
631,80315
|
333 |
+
632,80317
|
334 |
+
633,80318
|
335 |
+
640,80361
|
336 |
+
641,80363
|
337 |
+
642,80375
|
338 |
+
643,80377
|
339 |
+
645,80380
|
340 |
+
646,80389
|
341 |
+
647,80390
|
342 |
+
648,80392
|
343 |
+
649,80393
|
344 |
+
650,80396
|
345 |
+
651,80401
|
346 |
+
652,80404
|
347 |
+
653,80405
|
348 |
+
656,80418
|
349 |
+
657,80419
|
350 |
+
658,80429
|
351 |
+
660,80440
|
352 |
+
663,80445
|
353 |
+
664,80447
|
354 |
+
666,80453
|
355 |
+
667,80455
|
356 |
+
669,80460
|
357 |
+
671,80468
|
358 |
+
672,80471
|
359 |
+
675,80479
|
360 |
+
677,80489
|
361 |
+
678,80495
|
362 |
+
681,80511
|
363 |
+
682,80512
|
364 |
+
684,80520
|
365 |
+
685,80524
|
366 |
+
686,80532
|
367 |
+
687,80538
|
368 |
+
688,80540
|
369 |
+
690,80544
|
370 |
+
691,80546
|
371 |
+
692,80555
|
372 |
+
694,80561
|
373 |
+
696,80570
|
374 |
+
700,80582
|
375 |
+
701,80584
|
376 |
+
702,80586
|
377 |
+
705,80604
|
378 |
+
708,80612
|
379 |
+
709,80615
|
380 |
+
715,80637
|
381 |
+
718,80661
|
382 |
+
721,80680
|
383 |
+
723,80689
|
384 |
+
724,80699
|
385 |
+
727,80725
|
386 |
+
730,80734
|
387 |
+
732,80739
|
388 |
+
733,80741
|
389 |
+
734,80747
|
390 |
+
735,80751
|
391 |
+
736,80753
|
392 |
+
741,80801
|
393 |
+
744,80828
|
394 |
+
746,80852
|
395 |
+
751,80867
|
396 |
+
752,80871
|
397 |
+
753,80872
|
398 |
+
754,80873
|
399 |
+
755,80875
|
400 |
+
756,80877
|
401 |
+
757,80881
|
402 |
+
758,80886
|
403 |
+
759,80894
|
404 |
+
760,80897
|
405 |
+
761,80911
|
406 |
+
762,80912
|
407 |
+
764,80923
|
408 |
+
765,80924
|
409 |
+
766,80930
|
410 |
+
772,80952
|
411 |
+
773,80955
|
412 |
+
774,80963
|
413 |
+
778,80979
|
414 |
+
779,80980
|
415 |
+
780,80988
|
416 |
+
781,80992
|
417 |
+
782,81003
|
418 |
+
783,81014
|
419 |
+
788,81045
|
420 |
+
791,81077
|
421 |
+
796,81107
|
422 |
+
797,81110
|
423 |
+
798,81121
|
424 |
+
802,81135
|
425 |
+
804,81140
|
426 |
+
805,81144
|
427 |
+
806,81149
|
428 |
+
807,81150
|
429 |
+
808,81151
|
430 |
+
810,81160
|
431 |
+
811,81162
|
432 |
+
814,81173
|
433 |
+
815,81178
|
434 |
+
816,81188
|
435 |
+
818,81205
|
436 |
+
819,81207
|
437 |
+
820,81208
|
438 |
+
827,81239
|
439 |
+
830,81253
|
440 |
+
834,81275
|
441 |
+
835,81280
|
442 |
+
840,81295
|
443 |
+
847,81312
|
444 |
+
850,81315
|
445 |
+
851,81323
|
446 |
+
852,81325
|
447 |
+
855,81339
|
448 |
+
857,81349
|
449 |
+
859,81363
|
450 |
+
863,81380
|
451 |
+
864,81389
|
452 |
+
865,81390
|
453 |
+
870,81415
|
454 |
+
871,81418
|
455 |
+
874,81430
|
456 |
+
876,81439
|
457 |
+
877,81441
|
458 |
+
882,81461
|
459 |
+
883,81465
|
460 |
+
884,81473
|
461 |
+
885,81474
|
462 |
+
887,81476
|
463 |
+
889,81487
|
464 |
+
901,81533
|
465 |
+
914,81569
|
466 |
+
915,81570
|
467 |
+
921,81599
|
468 |
+
922,81602
|
469 |
+
923,81604
|
470 |
+
941,81765
|
471 |
+
956,81981
|
472 |
+
957,81982
|
473 |
+
958,81991
|
474 |
+
961,82019
|
475 |
+
962,82024
|
476 |
+
965,82043
|
477 |
+
969,82092
|
478 |
+
970,82096
|
479 |
+
971,82104
|
480 |
+
978,82152
|
481 |
+
979,82157
|
482 |
+
983,82180
|
483 |
+
985,82191
|
484 |
+
987,82219
|
485 |
+
994,82247
|
486 |
+
997,82302
|
487 |
+
1001,82345
|
488 |
+
1003,82360
|
489 |
+
1012,82444
|
490 |
+
1016,82466
|
491 |
+
1021,82483
|
492 |
+
1022,82487
|
493 |
+
1023,82500
|
494 |
+
1024,82507
|
495 |
+
1025,82516
|
496 |
+
1026,82521
|
497 |
+
1028,82558
|
498 |
+
1029,82565
|
499 |
+
1032,82588
|
500 |
+
1033,82589
|
501 |
+
1043,82648
|
502 |
+
1045,82694
|
503 |
+
1046,82703
|
504 |
+
1049,82715
|
505 |
+
1051,82731
|
506 |
+
1052,82737
|
507 |
+
1054,82743
|
508 |
+
1055,82763
|
509 |
+
1056,82764
|
510 |
+
1057,82768
|
511 |
+
1061,82846
|
512 |
+
1062,82848
|
513 |
+
1063,82850
|
514 |
+
1067,82891
|
515 |
+
1073,82928
|
516 |
+
1075,82944
|
517 |
+
1079,83002
|
518 |
+
1080,83023
|
519 |
+
1081,83049
|
520 |
+
1085,83080
|
521 |
+
1095,83157
|
522 |
+
1096,83168
|
523 |
+
1099,83185
|
524 |
+
1101,83192
|
525 |
+
1102,83195
|
526 |
+
1106,83238
|
527 |
+
1107,83244
|
528 |
+
1110,83254
|
529 |
+
1114,83276
|
530 |
+
1115,83278
|
531 |
+
1120,83300
|
532 |
+
1123,83319
|
533 |
+
1124,83335
|
534 |
+
1126,83340
|
535 |
+
1127,83352
|
536 |
+
1132,83380
|
537 |
+
1139,83434
|
538 |
+
1142,83451
|
539 |
+
1143,83452
|
540 |
+
1145,83473
|
541 |
+
1149,83500
|
542 |
+
1150,83502
|
543 |
+
1151,83513
|
544 |
+
1154,83529
|
545 |
+
1156,83551
|
546 |
+
1159,83566
|
547 |
+
1166,83605
|
548 |
+
1168,83613
|
549 |
+
1169,83615
|
550 |
+
1172,83624
|
551 |
+
1174,83640
|
552 |
+
1177,83665
|
553 |
+
1181,83677
|
554 |
+
1183,83694
|
555 |
+
1184,83696
|
556 |
+
1186,83703
|
557 |
+
1199,83786
|
558 |
+
1208,83906
|
559 |
+
1211,83919
|
560 |
+
1216,83968
|
561 |
+
1217,83971
|
562 |
+
1219,83984
|
563 |
+
1223,84000
|
564 |
+
1224,84001
|
565 |
+
1226,84008
|
566 |
+
1227,84014
|
567 |
+
1232,84117
|
568 |
+
1235,84140
|
569 |
+
1239,84174
|
570 |
+
1241,84177
|
571 |
+
1244,84188
|
572 |
+
1246,84203
|
573 |
+
1251,84284
|
574 |
+
1252,84297
|
575 |
+
1256,84349
|
576 |
+
1258,84364
|
577 |
+
1260,84385
|
578 |
+
1261,84386
|
579 |
+
1266,84412
|
580 |
+
1267,84435
|
581 |
+
1271,84489
|
582 |
+
1277,84537
|
583 |
+
1284,84598
|
584 |
+
1285,84599
|
585 |
+
1287,84611
|
586 |
+
1288,84619
|
587 |
+
1289,84620
|
588 |
+
1290,84623
|
589 |
+
1291,84640
|
590 |
+
1294,84648
|
591 |
+
1295,84654
|
592 |
+
1297,84679
|
593 |
+
1303,84717
|
594 |
+
1307,84781
|
595 |
+
1313,84840
|
596 |
+
1315,84845
|
597 |
+
1316,84851
|
598 |
+
1320,84883
|
599 |
+
1327,84933
|
600 |
+
1333,84969
|
601 |
+
1335,84988
|
602 |
+
1336,84992
|
603 |
+
1341,85015
|
604 |
+
1346,85028
|
605 |
+
1350,85040
|
606 |
+
1358,85085
|
607 |
+
1360,85088
|
608 |
+
1362,85099
|
609 |
+
1365,85103
|
610 |
+
1367,85106
|
611 |
+
1369,85138
|
612 |
+
1370,85139
|
613 |
+
1372,85144
|
614 |
+
1374,85150
|
615 |
+
1383,85177
|
616 |
+
1385,85179
|
617 |
+
1386,85190
|
618 |
+
1397,85276
|
619 |
+
1400,85287
|
620 |
+
1404,85305
|
621 |
+
1405,85309
|
622 |
+
1409,85333
|
623 |
+
1411,85338
|
624 |
+
1415,85348
|
625 |
+
1418,85367
|
626 |
+
1419,85368
|
627 |
+
1426,85398
|
628 |
+
1432,85430
|
629 |
+
1445,85490
|
630 |
+
1449,85508
|
631 |
+
1457,85552
|
632 |
+
1461,85563
|
633 |
+
1463,85565
|
634 |
+
1467,85582
|
635 |
+
1490,85652
|
636 |
+
1496,85668
|
637 |
+
1498,85675
|
638 |
+
1501,85680
|
639 |
+
1502,85687
|
640 |
+
1507,85711
|
641 |
+
1510,85722
|
642 |
+
1512,85729
|
643 |
+
1516,85733
|
644 |
+
1520,85737
|
645 |
+
1531,85751
|
646 |
+
1535,85755
|
647 |
+
1575,85800
|
648 |
+
1581,85809
|
649 |
+
1595,85823
|
650 |
+
1606,85834
|
651 |
+
1617,85846
|
652 |
+
1626,85857
|
653 |
+
1671,85913
|
654 |
+
1681,85925
|
655 |
+
1689,85934
|
656 |
+
1711,85962
|
657 |
+
1723,85974
|
658 |
+
1732,85986
|
659 |
+
1733,85987
|
660 |
+
1754,86012
|
661 |
+
1771,86031
|
662 |
+
1777,86040
|
663 |
+
1791,86059
|
664 |
+
1797,86067
|
665 |
+
1804,86077
|
666 |
+
1832,86110
|
667 |
+
1851,86134
|
668 |
+
1852,86135
|
669 |
+
1869,86153
|
670 |
+
1897,86184
|
671 |
+
1903,86191
|
672 |
+
1917,86205
|
673 |
+
1954,90251
|
674 |
+
1957,90742
|
675 |
+
1958,90792
|
676 |
+
1961,90876
|
677 |
+
1965,91863
|
678 |
+
1966,91876
|
679 |
+
1967,91883
|
680 |
+
1968,91884
|
681 |
+
1971,91905
|
682 |
+
1973,97148
|
683 |
+
1974,98018
|
684 |
+
1977,98317
|
productos.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|