Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 75 additions & 80 deletions homework/m1_numpy.py
Original file line number Diff line number Diff line change
@@ -1,80 +1,75 @@
"""
M1 NumPy 向量化思維 — 課後作業
================================
請完成以下每個函式,用 NumPy 向量化寫法(不要 for-loop)。
完成後 git push,GitHub Actions 會自動批改並顯示成績與解答。

提示:
- np.array, np.where, np.argsort
- 布林遮罩: arr[arr > 10]
- 統計: .sum(), .mean(), .max(), .min()
"""
import numpy as np


# ============================================================
# 🟢 送分題(每題 10 分,共 30 分)
# ============================================================

def green_mean():
"""建立 [10, 20, 30, 40, 50],回傳所有元素的平均值 (float)"""
# TODO: 你的程式碼
pass


def green_double():
"""建立 [10, 20, 30, 40, 50],回傳所有元素乘以 2 的 ndarray"""
# TODO: 你的程式碼
pass


def green_filter():
"""建立 [10, 20, 30, 40, 50],回傳大於 25 的元素 (ndarray)"""
# TODO: 你的程式碼
pass


# ============================================================
# 🟡 核心題(每題 15 分,共 45 分)
# 以下函式會接收從 products.csv 讀出的 prices, stocks 陣列
# ============================================================

def yellow_expensive_count(prices):
"""回傳單價 > 1000 的商品數量 (int)"""
# TODO: 你的程式碼
pass


def yellow_top3_stock_indices(stocks):
"""
回傳庫存最多的前 3 個商品的索引位置 (ndarray, 由大到小排)
提示:np.argsort
"""
# TODO: 你的程式碼
pass


def yellow_restock_cost(prices, stocks):
"""
單價 < 500 的商品,每種各進貨 50 個,回傳總花費 (float/int)
提示:布林遮罩 + .sum()
"""
# TODO: 你的程式碼
pass


# ============================================================
# 🔴 挑戰題(25 分)
# ============================================================

def red_double11_prices(prices, stocks):
"""
雙 11 定價規則(必須向量化,不能用 for-loop):
- 庫存 >= 100:打 7 折
- 庫存 20~99:打 9 折
- 庫存 < 20:原價
回傳每個商品的雙 11 售價 (ndarray)
提示:np.where 可以巢狀使用
"""
# TODO: 你的程式碼
pass
"""
M1 NumPy 向量化思維 — 課後作業
================================
請完成以下每個函式,用 NumPy 向量化寫法(不要 for-loop)。
完成後 git push,GitHub Actions 會自動批改並顯示成績與解答。

提示:
- np.array, np.where, np.argsort
- 布林遮罩: arr[arr > 10]
- 統計: .sum(), .mean(), .max(), .min()
"""
import numpy as np


# ============================================================
# 🟢 送分題(每題 10 分,共 30 分)
# ============================================================

def green_mean():
"""建立 [10, 20, 30, 40, 50],回傳所有元素的平均值 (float)"""
arr = np.array([10, 20, 30, 40, 50])
return arr.mean()



def green_double():
"""建立 [10, 20, 30, 40, 50],回傳所有元素乘以 2 的 ndarray"""
arr = np.array([10, 20, 30, 40, 50])
return arr*2

def green_filter():
"""建立 [10, 20, 30, 40, 50],回傳大於 25 的元素 (ndarray)"""
arr = np.array([10, 20, 30, 40, 50])
return arr[arr > 25]


# ============================================================
# 🟡 核心題(每題 15 分,共 45 分)
# 以下函式會接收從 products.csv 讀出的 prices, stocks 陣列
# ============================================================

def yellow_expensive_count(prices):
"""回傳單價 > 1000 的商品數量 (int)"""
return (prices > 1000).sum


def yellow_top3_stock_indices(stocks):
"""
回傳庫存最多的前 3 個商品的索引位置 (ndarray, 由大到小排)
提示:np.argsort
"""
return np.argsort(stocks)[-3:][::-1]


def yellow_restock_cost(prices, stocks):
"""
單價 < 500 的商品,每種各進貨 50 個,回傳總花費 (float/int)
提示:布林遮罩 + .sum()
"""
return (prices[prices < 500] * 50).sum()

# ============================================================
# 🔴 挑戰題(25 分)
# ============================================================

def red_double11_prices(prices, stocks):
"""
雙 11 定價規則(必須向量化,不能用 for-loop):
- 庫存 >= 100:打 7 折
- 庫存 20~99:打 9 折
- 庫存 < 20:原價
回傳每個商品的雙 11 售價 (ndarray)
提示:np.where 可以巢狀使用
"""
return np.where(stocks >= 100, prices * 0.7, np.where(stocks >= 20, prices * 0.9, prices))
207 changes: 111 additions & 96 deletions homework/m2_pandas_cleaning.py
Original file line number Diff line number Diff line change
@@ -1,96 +1,111 @@
"""
M2 Pandas I/O 與資料清理 — 課後作業
====================================
情境:你拿到一份「故意弄髒」的訂單 CSV (orders_raw.csv),
裡面有欄位名稱空格、金額帶 $ 符號、日期格式錯誤、缺值、重複列。
請用 Pandas 把它清乾淨。

資料路徑:datasets/ecommerce/orders_raw.csv
"""
import pandas as pd


# ============================================================
# 🟢 送分題(每題 10 分,共 30 分)
# ============================================================

def green_read_csv():
"""
讀取 orders_raw.csv,回傳原始 DataFrame(不做任何清理)
提示:pd.read_csv()
"""
# TODO: 你的程式碼
pass


def green_shape(df):
"""
回傳 DataFrame 的 (列數, 欄數) tuple
提示:df.shape
"""
# TODO: 你的程式碼
pass


def green_dtypes(df):
"""
回傳 DataFrame 的欄位型別 (Series)
提示:df.dtypes
"""
# TODO: 你的程式碼
pass


# ============================================================
# 🟡 核心題(每題 15 分,共 45 分)
# ============================================================

def yellow_clean_columns(df):
"""
清理欄位名稱:去除前後空白、全部轉小寫
回傳清理後的 DataFrame(不要修改原始 df)
提示:df.columns.str.strip().str.lower()
"""
# TODO: 你的程式碼
pass


def yellow_clean_amount(df):
"""
清理 amount 欄位:移除 '$' 和 ',' 符號,轉為 float
假設欄位名稱已經是小寫的 'amount'
回傳清理後的 DataFrame(不要修改原始 df)
提示:.str.replace() + .astype(float)
"""
# TODO: 你的程式碼
pass


def yellow_drop_duplicates(df):
"""
移除完全重複的列,回傳去重後的 DataFrame
提示:df.drop_duplicates()
"""
# TODO: 你的程式碼
pass


# ============================================================
# 🔴 挑戰題(25 分)
# ============================================================

def red_clean_orders(path):
"""
完整清理 pipeline:一個函式搞定所有清理步驟
1. 讀取 CSV
2. 欄位名稱:去空白、轉小寫
3. amount:移除 '$' ',',轉 float
4. order_date:轉為 datetime(無法轉換的設為 NaT)
5. 刪除 amount 或 order_date 為空的列
6. 移除重複列

回傳:清理後的 DataFrame
提示:pd.to_datetime(errors='coerce')
"""
# TODO: 你的程式碼
pass
"""
M2 Pandas I/O 與資料清理 — 課後作業
====================================
情境:你拿到一份「故意弄髒」的訂單 CSV (orders_raw.csv),
裡面有欄位名稱空格、金額帶 $ 符號、日期格式錯誤、缺值、重複列。
請用 Pandas 把它清乾淨。

資料路徑:datasets/ecommerce/orders_raw.csv
"""
import pandas as pd


# ============================================================
# 🟢 送分題(每題 10 分,共 30 分)
# ============================================================

def green_read_csv():
"""
讀取 orders_raw.csv,回傳原始 DataFrame(不做任何清理)
提示:pd.read_csv()
"""
return pd.read_csv("datasets/ecommerce/orders_raw.csv")


def green_shape(df):
"""
回傳 DataFrame 的 (列數, 欄數) tuple
提示:df.shape
"""
return df.shape


def green_dtypes(df):
"""
回傳 DataFrame 的欄位型別 (Series)
提示:df.dtypes
"""
return df.dtypes


# ============================================================
# 🟡 核心題(每題 15 分,共 45 分)
# ============================================================

def yellow_clean_columns(df):
"""
清理欄位名稱:去除前後空白、全部轉小寫
回傳清理後的 DataFrame(不要修改原始 df)
提示:df.columns.str.strip().str.lower()
"""
new_df = df.copy()
new_df.columns = new_df.columns.str.strip().str.lower()
return new_df


def yellow_clean_amount(df):
"""
清理 amount 欄位:移除 '$' 和 ',' 符號,轉為 float
假設欄位名稱已經是小寫的 'amount'
回傳清理後的 DataFrame(不要修改原始 df)
提示:.str.replace() + .astype(float)
"""
new_df = df.copy()
new_df['amount'] = (new_df['amount']
.str.replace('$', '', regex=False)
.str.replace(',', '', regex=False)
.astype(float))
return new_df


def yellow_drop_duplicates(df):
"""
移除完全重複的列,回傳去重後的 DataFrame
提示:df.drop_duplicates()
"""
return df.drop_duplicates()

# ============================================================
# 🔴 挑戰題(25 分)
# ============================================================

def red_clean_orders(path):
"""
完整清理 pipeline:一個函式搞定所有清理步驟
1. 讀取 CSV
2. 欄位名稱:去空白、轉小寫
3. amount:移除 '$' ',',轉 float
4. order_date:轉為 datetime(無法轉換的設為 NaT)
5. 刪除 amount 或 order_date 為空的列
6. 移除重複列

回傳:清理後的 DataFrame
提示:pd.to_datetime(errors='coerce')
"""
def yellow_clean_columns(df):
new_df = df.copy()
new_df.columns = new_df.columns.str.strip().str.lower()
return new_df


def yellow_clean_amount(df):
new_df = df.copy()
new_df['amount'] = (new_df['amount']
.str.replace('$', '', regex=False)
.str.replace(',', '', regex=False)
.astype(float))
return new_df


def yellow_drop_duplicates(df):
return df.drop_duplicates()
Loading
Loading