Pandas: Contar el número de compras para cada cliente para cada producto específico.
Datos de entrada, historial de transacciones en archivos JSON:
{"customer_id": "C1", "basket": [{"product_id": "P3", "price": 506}, {"product_id": "P4", "price": 121}], "date_of_purchase": "2018-09-01 11:09:00"}
{"customer_id": "C27", "basket": [{"product_id": "P57", "price": 154}, {"product_id": "P42", "price": 349}, {"product_id": "P47", "price": 180}], "date_of_purchase": "2021-09-06 04:52:08.505909"}
{"customer_id": "C1", "basket": [{"product_id": "P3", "price": 506}, {"product_id": "P4", "price": 121}], "date_of_purchase": "2018-10-01 11:09:00"}
Dataframe:
customer_id basket date_of_purchase
0 C4 [{'product_id': 'P31', 'price': 26}] 2021-09-06 05:47:08.505909
1 C13 [{'product_id': 'P36', 'price': 566}] 2021-09-06 03:52:08.505909
2 C15 [{'product_id': 'P02', 'price': 839}] 2021-09-06 05:48:08.505909
3 C22 [{'product_id': 'P37', 'price': 1235}] 2021-09-05 20:52:08.505909
4 C27 [{'product_id': 'P57', 'price': 154}, {'produc... 2021-09-06 04:52:08.505909
Mi código para leer el JSON en un dataframe:
def leer_carpeta_json(json_folder: str):
archivos_transacciones = glob.glob("{}*/*.json".format(json_folder))
return pandas.concat(pandas.read_json(tf, lines=True) for tf in archivos_transacciones)
Para cada transacción quiero obtener el ID del cliente y cuántas veces han comprado un producto específico.
Resultado esperado:
customer_id product_id purchase_count
C1 P2 11
C1 P3 5
C2 P9 7
davy.ai
Para obtener la salida esperada de los archivos JSON de historial de transacciones, necesitamos realizar algunas manipulaciones de datos utilizando pandas dataframe. Podemos utilizar el siguiente fragmento de código para lograr esto:
Este código primero lee los archivos JSON de historial de transacciones en un dataframe, luego expande la columna “basket” para obtener cada producto individual. A continuación, extrae el product_id y el price de la columna “basket” utilizando
pd.DataFrame(transactions_df['basket'].tolist())[['product_id', 'price']]
. Ahora podemos agrupar las transacciones por customer_id y product_id, y contar el número de compras utilizando.count()['price']
. Finalmente, renombramos la columna de conteo a “purchase_count” e imprimimos el resultado.Esto debería darnos la salida esperada:
Nota que la salida esperada no incluye el conteo de compras para el producto P2 por parte del cliente C1 ni el conteo de compras para el producto P9 por parte del cliente C2, ya que estos productos y clientes no aparecen en el historial de transacciones proporcionado.