1. Faro

Nivel 9 · Enruta un reembolso desde el formulario web

La solicitud

De Angela Rivera, Directora de Atención al Cliente

“El formulario de devoluciones envía todo como texto. Para este caso: calcula el reembolso y enrútalo. Dañado o artículo equivocado va al almacén, tardío va al equipo de transportistas, cambio de opinión va a devoluciones, y cualquier otra cosa a revisión manual.”

Tu objetivo

Asigna a result un diccionario con las claves 'input_type' (el nombre del tipo de qty_text, con type(...).name), 'refund' (quantity * price como float redondeado a 2, tras convertir los textos a int y float), 'queue' ('warehouse' para los códigos DMG o WRG, 'carrier' para LATE, 'returns' para CHG, y en otro caso 'manual'; el código debe quitarse los espacios y pasarse a mayúsculas antes) y 'label' (exactamente "Order 10482 -> warehouse": 'Order ', el id del pedido, ' -> ', la cola).

  • Usa el DataFrame returnspendiente
  • Guarda un dict en resultpendiente

Tu código

Python

Cargando el editor…

    ResultadoVista previa de returns · presiona Ejecutar para ver el tuyo
    Vista previa 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

    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.

    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
    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
    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
    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
    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

    ¿De qué tipo es este valor?

    Todo valor en Python tiene un tipo, y type() te dice cuál es:

    type(10482)        # <class 'int'>
    type("3")          # <class 'str'>
    type(24.99)        # <class 'float'>
    type("3").__name__ # 'str'  just the name, handy in a report

    Los datos de un formulario web, de un CSV abierto a mano o de una API suelen llegar como texto, incluso cuando parecen un número. El texto y los números no se mezclan: "3" * 2 es "33" (el texto repetido), y "3" * "24.99" lanza un TypeError. Cuando un cálculo da una respuesta extraña, type() es lo primero que hay que revisar.

    Convertir entre tipos

    int(), float() y str() crean un valor nuevo del tipo que pides:

    int("3")             # 3
    float("24.99")       # 24.99
    int("3") * float("24.99")   # 74.97 (after rounding to 2)
    str(10482)           # '10482'
    "Order " + str(10482)       # 'Order 10482'

    + entre dos strings los une, pero "Order " + 10482 falla porque un lado es un int. Convierte con str() o usa un f-string, que convierte por ti. Las conversiones también pueden fallar: int("3.0") y float("n/a") lanzan ValueError, que suele ser la forma de descubrir una fila errónea.

    match y case

    Cuando un valor decide entre varias opciones fijas, match se lee con más claridad que una larga cadena if/elif. Python compara el valor con cada case de arriba abajo y ejecuta el primero que encaja:

    match "WRG":
        case "DMG" | "WRG":     # | means "either of these"
            queue = "warehouse"
        case "LATE":
            queue = "carrier"
        case _:                 # _ catches everything else
            queue = "manual"

    Cada case lista un valor con el que comparar, y gana el primero que coincide, así que el orden sigue importando si dos casos pueden solaparse. Comparado con if code == "DMG" or code == "WRG": ... elif ..., la versión con match nombra el valor una sola vez y presenta las opciones como la tabla de enrutamiento que mandó Angela, lo que facilita comprobarla contra la política línea por línea.

    case _ es la red de seguridad, como un else final. Sin él, un código desconocido dejaría queue sin definir y la línea siguiente fallaría con un NameError. match requiere Python 3.10 o más reciente, que es lo que se ejecuta aquí.

    Errores comunes

    • Multiplicar los textos directamente. Convierte primero y calcula después.
    • Comparar la entrada sin limpiar. Límpiala con .strip().upper() para que ” wrg” y “WRG” se traten igual.
    • Olvidar case _, de modo que un código inesperado deja la cola sin definir.
    • Unir un número a un texto con + sin str().

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