es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    import pandas as pd
    
    # leer los archivos JSON de historial de transacciones en un dataframe
    transactions_df = pd.concat([pd.read_json(file, lines=True) for file in transactions_files], ignore_index=True)
    
    # expandir la columna "basket" para obtener cada producto individual
    transactions_df = transactions_df.explode('basket').reset_index(drop=True)
    
    # extraer el product_id y el price de la columna "basket"
    transactions_df[['product_id', 'price']] = pd.DataFrame(transactions_df['basket'].tolist())[['product_id', 'price']]
    
    # agrupar las transacciones por customer_id y product_id, y contar el número de compras
    purchase_counts = transactions_df.groupby(['customer_id', 'product_id']).count()['price'].reset_index()
    
    # renombrar la columna "price" a "purchase_count"
    purchase_counts = purchase_counts.rename(columns={'price': 'purchase_count'})
    
    # imprimir el resultado
    print(purchase_counts)
    

    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:

      customer_id product_id  purchase_count
    0          C1         P3               2
    1          C1         P4               2
    2         C27        P42               1
    3         C27        P47               1
    4         C27        P57               1
    

    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.

Comments are closed.