The request

From Priya Shah, Head of Data
Your goal
Set result to the number of rows in order_items, as an int.
- Use the
order_itemsDataFramenot done yet - Store a number in
resultnot done yet
Your code
Loading the editor…
Reference solution
| order_item_id | order_id | product_id | quantity | unit_price |
|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 |
| 2 | 1001 | 154 | 3 | 11.99 |
| 3 | 1002 | 154 | 4 | 11.99 |
| 4 | 1002 | 194 | 1 | 149.00 |
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Priya gets, and why
DataFrames
Loaded for you as pandas DataFrames, plus pd and np.
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 |
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 |
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 |
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
Rows and columns
Before any analysis, check the size of what you’ve got:
order_items.shape # (rows, columns)
order_items.shape[0] # number of rows
order_items.shape[1] # number of columns
len(order_items) # number of rows, the most common way to write it
shape is an attribute, not a method, so it has no brackets. It’s a tuple, which you index like
a list.
Row counts are your first sanity check. If the business says “about 30,000 order lines” and you see 3,000 or 300,000, stop and find out why before going further. Maybe the file was truncated, maybe you loaded the wrong table, maybe the business number is out of date. Any of those is worth knowing.
Column names
order_items.columns
# Index(['order_item_id', 'order_id', 'product_id', 'quantity',
# 'unit_price', 'discount_pct'], dtype='object')
list(order_items.columns) # as a plain list
Column names are case-sensitive and must match exactly, so it’s worth looking at them before typing them in code.
Types with dtypes and info
Every column has a dtype (data type). The ones you’ll see most:
| dtype | holds |
|---|---|
int64 |
whole numbers |
float64 |
decimals, and whole numbers in a column with missing values |
bool |
True / False |
object |
text (and anything mixed) |
datetime64[ns] |
dates and times, once converted |
order_items.dtypes
info() puts everything in one view: number of rows, each column’s non-null count and dtype, and
memory use.
customers.info()
RangeIndex: 2018 entries, 0 to 2017
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 customer_id 2018 non-null int64
...
4 city 2004 non-null object
...
8 referral_source 1352 non-null object
Two discoveries in one glance: some customers have no city, and about a third have no referral
source. info() prints its report rather than returning a value, so use it to look, not to store.
Types tell you about the data
Types often reveal problems before you see them in rows. In web_sessions, customer_id is
float64 rather than int64. Why would an ID be a decimal? Because some sessions are anonymous,
and a classic NumPy integer column can’t hold missing values, so pandas stores the column as floats
with NaN. Similarly, order_date shows datetime64[ns] only because the tables here were loaded
with pd.read_csv(..., parse_dates=[...]). CSV files don’t carry types, so a plain read_csv would
leave dates as object text. Spotting these early saves you from confusing errors later.
Other quick checks
order_items["order_id"].nunique() # distinct orders that have lines
order_items.isna().sum() # missing values per column
Common mistakes
- Writing
order_items.shape()with brackets:TypeError: 'tuple' object is not callable. - Storing
order_items.info()in a variable. It prints and returnsNone. - Using
order_items.sizefor the row count.sizeis rows times columns.
Lantern lit!
Practised: shapeleninfodtypescolumns
- Solved
- No hints
- First run
