The request

From Angela Rivera, Head of Customer Support
Your goal
Set result to a dictionary with keys 'input_type' (the type name of qty_text, from type(...).name), 'refund' (quantity * price as a float rounded to 2, after converting the texts to int and float), 'queue' ('warehouse' for codes DMG or WRG, 'carrier' for LATE, 'returns' for CHG, otherwise 'manual'; the code must be stripped and uppercased first) and 'label' (exactly "Order 10482 -> warehouse": 'Order ', the order id, ' -> ', the queue).
- Use the
returnsDataFramenot done yet - Store a dict in
resultnot done yet
Your code
Loading the editor…
Reference solution
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Angela gets, and why
DataFrames
Loaded for you as pandas DataFrames, plus pd and np.
returns1,673 rows · 5 columns
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
customers2,018 rows · 9 columns
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
products120 rows · 8 columns
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
orders12,000 rows · 7 columns
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 rows · 6 columns
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
employees60 rows · 8 columns
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 rows · 7 columns
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 rows · 3 columns
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
The lesson
What type is this value?
Every value in Python has a type, and type() tells you which one:
type(10482) # <class 'int'>
type("3") # <class 'str'>
type(24.99) # <class 'float'>
type("3").__name__ # 'str' just the name, handy in a report
Data from a web form, a CSV opened by hand or an API usually arrives as text, even when it looks
like a number. Text and numbers don’t mix: "3" * 2 is "33" (the text repeated), and
"3" * "24.99" raises a TypeError. When a calculation gives a strange answer, type() is the
first thing to check.
Converting between types
int(), float() and str() build a new value of the type you ask for:
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'
+ between two strings joins them, but "Order " + 10482 fails because one side is an int. Convert
with str() or use an f-string, which converts for you. Conversions can fail too: int("3.0") and
float("n/a") raise ValueError, which is often how you discover a bad row.
match and case
When one value decides between several fixed options, match reads more cleanly than a long
if/elif chain. Python compares the value with each case from top to bottom and runs the first
one that fits:
match "WRG":
case "DMG" | "WRG": # | means "either of these"
queue = "warehouse"
case "LATE":
queue = "carrier"
case _: # _ catches everything else
queue = "manual"
Each case lists a value to compare with, and the first one that matches wins, so order still
matters if two cases could overlap. Compared with if code == "DMG" or code == "WRG": ... elif ...,
the match version names the value once and lays the options out like the routing table Angela sent,
which makes it easy to check against the policy line by line.
case _ is the safety net, like a final else. Without it, an unknown code would leave queue
unset and the next line would fail with a NameError. match needs Python 3.10 or newer, which is
what runs here.
Common mistakes
- Multiplying the texts directly. Convert first, then calculate.
- Matching the raw input. Clean it with
.strip().upper()so ” wrg” and “WRG” are treated the same. - Forgetting
case _, so an unexpected code leaves the queue undefined. - Joining a number into text with
+withoutstr().
Lantern lit!
Practised: typetype conversionmatch casestrings
- Solved
- No hints
- First run
