Entrega de comida inmediata II

Si la fecha de entrega preferida por el cliente coincide con la fecha del pedido, 茅ste se denomina inmediato; en caso contrario, se denomina programado. El primer pedido de un cliente es el pedido con la fecha de pedido m谩s antigua que realiz贸 el cliente. Se garantiza que cada cliente tiene precisamente un primer pedido. Escriba una soluci贸n para hallar el porcentaje de pedidos inmediatos en los primeros pedidos de todos los clientes, redondeado a 2 decimales

#pandas#basic-aggregate

Tabla: Delivery

+-----------------------------+---------+
| Column Name                 | Type    |
+-----------------------------+---------+
| delivery_id                 | int     |
| customer_id                 | int     |
| order_date                  | date    |
| customer_pref_delivery_date | date    |
+-----------------------------+---------+

- delivery_id es una columna con valores 煤nicos.
- La tabla contiene informaci贸n sobre la entrega de comida a clientes que hacen pedidos en una fecha
  determinada y especifican una fecha de entrega preferida (en la misma fecha del pedido o despu茅s).

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Delivery:
+-------------+-------------+------------+-----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
+-------------+-------------+------------+-----------------------------+
| 1           | 1           | 2019-08-01 | 2019-08-02                  |
| 2           | 2           | 2019-08-02 | 2019-08-02                  |
| 3           | 1           | 2019-08-11 | 2019-08-12                  |
| 4           | 3           | 2019-08-24 | 2019-08-24                  |
| 5           | 3           | 2019-08-21 | 2019-08-22                  |
| 6           | 2           | 2019-08-11 | 2019-08-13                  |
| 7           | 4           | 2019-08-09 | 2019-08-09                  |
+-------------+-------------+------------+-----------------------------+

Salida:

+----------------------+
| immediate_percentage |
+----------------------+
| 50.00                |
+----------------------+

Explicac贸n:
- El cliente con ID 1 hizo su primer pedido con ID de entrega 1 y fue marcado como programado.
- El cliente con ID 2 hizo su primer pedido con ID de entrega 2 y fue marcado como inmediato.
- El cliente con ID 3 hizo su primer pedido con ID de entrega 5 y fue marcado como programado.
- El cliente con ID 4 hizo su primer pedido con ID de entrega 7 y fue marcado como inmediato.
- Por lo tanto, la mitad de los clientes tienen primera orden inmediata.

Soluci贸n

import pandas as pd


def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
    delivery.sort_values(by='order_date', inplace=True)
    first_orders = delivery.groupby('customer_id').first()
    immediate_orders = first_orders.loc[
        first_orders.order_date.eq(first_orders.customer_pref_delivery_date)
    ]
    percentage = 100 * len(immediate_orders) / len(first_orders)
    result = pd.DataFrame({'immediate_percentage': [percentage]})
    result['immediate_percentage'] = result['immediate_percentage'].round(2)
    return result


def test_immediate_food_delivery():
    data = [
        [1, 1, '2019-08-01', '2019-08-02'],
        [2, 2, '2019-08-02', '2019-08-02'],
        [3, 1, '2019-08-11', '2019-08-12'],
        [4, 3, '2019-08-24', '2019-08-24'],
        [5, 3, '2019-08-21', '2019-08-22'],
        [6, 2, '2019-08-11', '2019-08-13'],
        [7, 4, '2019-08-09', '2019-08-09']]
    columns = {
        'delivery_id': 'Int64',
        'customer_id': 'Int64',
        'order_date': 'datetime64[ns]',
        'customer_pref_delivery_date': 'datetime64[ns]'
    }
    delivery = pd.DataFrame(data,
        columns=columns.keys()
    ).astype(columns)
    expected = pd.DataFrame({'immediate_percentage': [50.00]})
    got = immediate_food_delivery(delivery)
    pd.testing.assert_frame_equal(got, expected)

slackmart blog 漏 2024