1. Faro

Nivel 5 · Cuenta los pedidos por estado

La solicitud

De Megan Collins, Directora de Ventas

“¿Cuántos de nuestros pedidos se completaron de verdad, y cuántos se cancelaron, se reembolsaron o siguen pendientes? Quiero el desglose completo.”

Tu objetivo

Asigna a result una Series con el número de pedidos por status, tal como lo devuelve value_counts(): índice = valores de status, ordenados de más a menos frecuentes.

  • Usa el DataFrame orderspendiente
  • Muestra exactamente status countpendiente
  • 4 filas, ordenadas como se pidependiente

Tu código

Python

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    DataFrames

    Cargados como DataFrames de pandas, junto con pd y np.

    orders12,000 filas · 7 columnas
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    Primeras 5 filas de orders
    order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
    10011252023-01-01 20:51:19completedweb0.00NaN
    10021562023-01-02 07:58:46completedweb0.00NaN
    1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
    1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
    1005822023-01-02 11:43:36completedweb0.00WELCOME10
    customers2,018 filas · 9 columnas
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    Primeras 5 filas de customers
    customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
    1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
    2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNaN
    3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNaN
    4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
    5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNaN
    products120 filas · 8 columnas
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    Primeras 5 filas de products
    product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
    101Vale Velvet LoveseatFurnitureSofas1659.00NaN2023-09-11true
    102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
    103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
    104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
    105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
    order_items30,338 filas · 6 columnas
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    Primeras 5 filas de order_items
    order_item_idorder_idproduct_idquantityunit_pricediscount_pct
    11001121931.990.00
    21001154311.990.00
    31002154411.990.00
    410021941149.000.00
    51002193219.990.00
    returns1,673 filas · 5 columnas
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    Primeras 5 filas de returns
    return_idorder_item_idreturned_onreasonrefund_amount
    1142023-01-10damaged83.69
    2422023-01-10wrong_item19.99
    31052023-01-14wrong_item10.99
    4242023-01-16changed_mind26.99
    51262023-01-16late20.99
    employees60 filas · 8 columnas
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    Primeras 5 filas de employees
    employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
    1CatherineHaleExecutiveChief Executive OfficerNaN2016-03-01285000
    2RobertKimExecutiveChief Operating Officer12017-01-09235000
    3MeganCollinsSalesHead of Sales12018-04-16172000
    4ChloeGutierrezSalesAccount Executive32020-01-2172000
    5FrankBellSalesAccount Executive32023-05-2173000
    web_sessions40,000 filas · 7 columnas
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    Primeras 5 filas de web_sessions
    session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
    1NaN2023-01-01 23:02:24mobilepaid1false
    2182023-01-01 15:07:49desktoppaid1false
    3NaN2023-01-01 16:55:46desktopdirect7false
    4NaN2023-01-01 12:43:28mobileorganic3false
    5NaN2023-01-01 13:06:21mobilesocial2false
    marketing_spend3,276 filas · 3 columnas
    • spend_datedate
    • channelvarchar
    • amountdecimal
    Primeras 5 filas de marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13

    La lección

    value_counts: ¿cuántos de cada uno?

    Para una columna de texto o de categorías, la primera pregunta siempre es «¿qué valores hay y con qué frecuencia?». value_counts() la responde en una llamada:

    orders["status"].value_counts()
    status
    completed    10849
    cancelled      726
    refunded       304
    pending        121
    Name: count, dtype: int64

    El resultado es una Series: los valores pasan a ser el índice y los conteos son los datos. Está ordenada de más a menos frecuente, así que lo de arriba responde a «¿qué es lo más común?».

    Opciones útiles:

    orders["status"].value_counts(normalize=True)   # shares that add up to 1
    orders["coupon_code"].value_counts(dropna=False)   # include NaN as its own row
    orders["channel"].value_counts(ascending=True)     # least common first

    La opción dropna=False es importante. Por defecto, los valores que faltan se omiten en silencio, y en coupon_code las filas que faltan (sin cupón) son, con mucho, el grupo más grande. Una proporción calculada sin ellas estaría muy equivocada.

    Funciones auxiliares relacionadas

    orders["channel"].unique()     # array(['web', 'marketplace', 'app'], dtype=object)
    orders["channel"].nunique()    # 3
    orders["customer_id"].nunique()   # how many distinct customers ordered

    nunique es como respondes a «¿cuántos clientes distintos?», que no es lo mismo que el número de pedidos.

    describe: números de un vistazo

    Para columnas numéricas, describe() da el resumen estándar:

    products["unit_price"].describe()
    count     120.00
    mean      270.16
    std       362.06
    min        10.99
    25%        51.74
    50%       154.00
    75%       289.00
    max      1659.00

    Léelo como un analista. La media ($270) está muy por encima de la mediana, la línea del 50% ($154). Esa diferencia te dice que los precios están sesgados: unas pocas piezas caras de mobiliario suben el promedio. Con datos sesgados, la mediana suele ser el mejor valor «típico» para informar. Los cuartiles (25% y 75%) te dicen que la mitad central de los productos cuesta entre unos $52 y $289.

    En un DataFrame completo, orders.describe() resume cada columna numérica, y orders.describe(include="object") resume las columnas de texto con count, unique, top y freq.

    Cuidado con los IDs

    describe() informará con gusto la media de customer_id. No tiene sentido: los IDs son etiquetas, no cantidades. Ignora los resúmenes de columnas de ID, o selecciona primero las columnas que de verdad te importan.

    Errores comunes

    • Llamar a value_counts() sobre el DataFrame completo cuando querías una columna. orders.value_counts() cuenta combinaciones únicas de todas las columnas.
    • Olvidar dropna=False en columnas con valores que faltan, y luego informar proporciones demasiado altas.
    • Informar la media de una columna sesgada como «el precio típico».
    • Reordenar el resultado a mano. value_counts() ya pone primero el valor más común; usa .sort_index() cuando quieras los valores en orden alfabético.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.