Clientes que compraron todos los productos

Escribe una solución para reportar el customer_id de los clientes que compraron todos los productos de la tabla Product. Regresa el resultado en cualquier orden.

#pandas#sorting-and-grouping

Tabla: Customer

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| customer_id | int     |
| product_key | int     |
+-------------+---------+

- Esta tabla puede contener filas duplicadas.
- customer_id no puede ser NULL.
- product_key es una llave foranea (columna de referencia) a la tabla Product.

Tabla: Product

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_key | int     |
+-------------+---------+

- product_key es la llave primaria (columna con valores únicos).

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Customer:
+-------------+-------------+
| customer_id | product_key |
+-------------+-------------+
| 1           | 5           |
| 2           | 6           |
| 3           | 5           |
| 3           | 6           |
| 1           | 6           |
+-------------+-------------+

Tabla Product:
+-------------+
| product_key |
+-------------+
| 5           |
| 6           |
+-------------+

Salida:

+-------------+
| customer_id |
+-------------+
| 1           |
| 3           |
+-------------+

Explicación:
- Los clientes que compraron todos los productos (5 y 6) son los clientes con IDs 1 y 3.

Solución:

import pandas as pd


def find_customers(customer: pd.DataFrame, product: pd.DataFrame) -> pd.DataFrame:
    customer = customer.drop_duplicates()
    counts = customer.groupby('customer_id')['product_key'].count().reset_index(name='products')

    cond = counts['products'].eq(product.index.size)
    answer = counts.loc[cond]['customer_id'].reset_index(drop=True)

    return answer.to_frame()


def test_find_customers():
    # Pandas Schema
    data = [[1, 5], [2, 6], [3, 5], [3, 6], [1, 6], [1, 6]]
    customer = pd.DataFrame(
        data, columns=['customer_id', 'product_key']
    ).astype({'customer_id':'Int64', 'product_key':'Int64'})

    data = [[5], [6]]
    product = pd.DataFrame(data, columns=['product_key']).astype({'product_key':'Int64'})

    # Test
    expected = pd.DataFrame([[1], [3]], columns=['customer_id']).astype({'customer_id': 'Int64'})

    # Function to test
    got = find_customers(customer, product)
    pd.testing.assert_frame_equal(got, expected)

slackmart blog © 2024