From 9eecaf64d6a6c0d59aeb3fa0108355c94a4cf908 Mon Sep 17 00:00:00 2001 From: Jen C Date: Sun, 3 May 2026 17:14:11 +0800 Subject: [PATCH 1/3] Implement NumPy homework functions in m1_numpy.py --- homework/m1_numpy.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/homework/m1_numpy.py b/homework/m1_numpy.py index 5ff41ab..3c5ce35 100644 --- a/homework/m1_numpy.py +++ b/homework/m1_numpy.py @@ -18,20 +18,20 @@ def green_mean(): """建立 [10, 20, 30, 40, 50],回傳所有元素的平均值 (float)""" - # TODO: 你的程式碼 - pass + arr = np.array([10, 20, 30, 40, 50]) + return float(arr.mean()) def green_double(): """建立 [10, 20, 30, 40, 50],回傳所有元素乘以 2 的 ndarray""" - # TODO: 你的程式碼 - pass + arr = np.array([10, 20, 30, 40, 50]) + return arr * 2 def green_filter(): """建立 [10, 20, 30, 40, 50],回傳大於 25 的元素 (ndarray)""" - # TODO: 你的程式碼 - pass + arr = np.array([10, 20, 30, 40, 50]) + return arr[arr > 25] # ============================================================ @@ -41,8 +41,7 @@ def green_filter(): def yellow_expensive_count(prices): """回傳單價 > 1000 的商品數量 (int)""" - # TODO: 你的程式碼 - pass + return int((prices > 1000).sum()) def yellow_top3_stock_indices(stocks): @@ -50,8 +49,8 @@ def yellow_top3_stock_indices(stocks): 回傳庫存最多的前 3 個商品的索引位置 (ndarray, 由大到小排) 提示:np.argsort """ - # TODO: 你的程式碼 - pass + sorted_indices = np.argsort(stocks) + return sorted_indices[-3:][::-1] def yellow_restock_cost(prices, stocks): @@ -59,8 +58,8 @@ def yellow_restock_cost(prices, stocks): 單價 < 500 的商品,每種各進貨 50 個,回傳總花費 (float/int) 提示:布林遮罩 + .sum() """ - # TODO: 你的程式碼 - pass + mask = prices < 500 + return float((prices[mask] * 50).sum()) # ============================================================ @@ -76,5 +75,8 @@ def red_double11_prices(prices, stocks): 回傳每個商品的雙 11 售價 (ndarray) 提示:np.where 可以巢狀使用 """ - # TODO: 你的程式碼 - pass + return np.where( + stocks >= 100, + prices * 0.7, + np.where(stocks >= 20, prices * 0.9, prices), + ) From 1abe87ac12a2e11cfd5abbf490bb8837bbae5205 Mon Sep 17 00:00:00 2001 From: Jen C Date: Sun, 3 May 2026 18:33:24 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=B9=B3=E4=BA=A4?= =?UTF-8?q?=E4=BD=9C=E6=A5=AD=20-=E9=84=AD=E7=8E=89=20-AIPE03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework/m1_numpy.py | 20 +++++++-- homework/m2_pandas_cleaning.py | 32 +++++++++++--- homework/m3_pandas_advanced.py | 29 ++++++++++--- homework/m4_timeseries.py | 27 ++++++++---- homework/m5_visualization.py | 71 ++++++++++++++++++++++++++---- homework/m6_plotly_capstone.py | 79 +++++++++++++++++++++++++++++++--- 6 files changed, 215 insertions(+), 43 deletions(-) diff --git a/homework/m1_numpy.py b/homework/m1_numpy.py index 3c5ce35..de46b1d 100644 --- a/homework/m1_numpy.py +++ b/homework/m1_numpy.py @@ -18,18 +18,21 @@ def green_mean(): """建立 [10, 20, 30, 40, 50],回傳所有元素的平均值 (float)""" + # TODO: 你的程式碼 arr = np.array([10, 20, 30, 40, 50]) return float(arr.mean()) def green_double(): """建立 [10, 20, 30, 40, 50],回傳所有元素乘以 2 的 ndarray""" + # TODO: 你的程式碼 arr = np.array([10, 20, 30, 40, 50]) return arr * 2 def green_filter(): """建立 [10, 20, 30, 40, 50],回傳大於 25 的元素 (ndarray)""" + # TODO: 你的程式碼 arr = np.array([10, 20, 30, 40, 50]) return arr[arr > 25] @@ -38,9 +41,13 @@ def green_filter(): # 🟡 核心題(每題 15 分,共 45 分) # 以下函式會接收從 products.csv 讀出的 prices, stocks 陣列 # ============================================================ +DATA = '../datasets/ecommerce/products.csv' +stocks = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=4) +prices = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=3) def yellow_expensive_count(prices): """回傳單價 > 1000 的商品數量 (int)""" + # TODO: 你的程式碼 return int((prices > 1000).sum()) @@ -49,8 +56,9 @@ def yellow_top3_stock_indices(stocks): 回傳庫存最多的前 3 個商品的索引位置 (ndarray, 由大到小排) 提示:np.argsort """ - sorted_indices = np.argsort(stocks) - return sorted_indices[-3:][::-1] + # TODO: 你的程式碼 + sorted_stocks = np.argsort(stocks) + return sorted_stocks[-3:][::-1] def yellow_restock_cost(prices, stocks): @@ -58,13 +66,16 @@ def yellow_restock_cost(prices, stocks): 單價 < 500 的商品,每種各進貨 50 個,回傳總花費 (float/int) 提示:布林遮罩 + .sum() """ - mask = prices < 500 - return float((prices[mask] * 50).sum()) + # TODO: 你的程式碼 + return float((prices[prices < 500] * 50).sum()) # ============================================================ # 🔴 挑戰題(25 分) # ============================================================ +DATA = '../datasets/ecommerce/products.csv' +stocks = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=4) +prices = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=3) def red_double11_prices(prices, stocks): """ @@ -75,6 +86,7 @@ def red_double11_prices(prices, stocks): 回傳每個商品的雙 11 售價 (ndarray) 提示:np.where 可以巢狀使用 """ + # TODO: 你的程式碼 return np.where( stocks >= 100, prices * 0.7, diff --git a/homework/m2_pandas_cleaning.py b/homework/m2_pandas_cleaning.py index fa36bff..224dd47 100644 --- a/homework/m2_pandas_cleaning.py +++ b/homework/m2_pandas_cleaning.py @@ -13,6 +13,8 @@ # ============================================================ # 🟢 送分題(每題 10 分,共 30 分) # ============================================================ +DATA = '../datasets/ecommerce/orders_raw.csv' + def green_read_csv(): """ @@ -20,7 +22,8 @@ def green_read_csv(): 提示:pd.read_csv() """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + return df def green_shape(df): @@ -29,7 +32,8 @@ def green_shape(df): 提示:df.shape """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + return df.shape def green_dtypes(df): @@ -38,7 +42,8 @@ def green_dtypes(df): 提示:df.dtypes """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + return df.dtypes # ============================================================ @@ -52,7 +57,10 @@ def yellow_clean_columns(df): 提示:df.columns.str.strip().str.lower() """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + result = df.copy() + result.columns = result.columns.str.strip().str.lower() + return result def yellow_clean_amount(df): @@ -63,7 +71,10 @@ def yellow_clean_amount(df): 提示:.str.replace() + .astype(float) """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + result = df.copy() + result["amount"] = result["amount"].astype(str).str.replace("$", "", regex=False).str.replace(",", "", regex=False).astype(float) + return result def yellow_drop_duplicates(df): @@ -72,7 +83,8 @@ def yellow_drop_duplicates(df): 提示:df.drop_duplicates() """ # TODO: 你的程式碼 - pass + df = pd.read_csv(DATA) + return df.drop_duplicates() # ============================================================ @@ -93,4 +105,10 @@ def red_clean_orders(path): 提示:pd.to_datetime(errors='coerce') """ # TODO: 你的程式碼 - pass + df = pd.read_csv(path) + df.columns = df.columns.str.strip().str.lower() + df["amount"] = df["amount"].astype(str).str.replace("$", "", regex=False).str.replace(",", "", regex=False).astype(float) + df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce") + df = df.dropna(subset=["amount", "order_date"]) + df = df.drop_duplicates() + return df diff --git a/homework/m3_pandas_advanced.py b/homework/m3_pandas_advanced.py index 68410e8..9cd3a74 100644 --- a/homework/m3_pandas_advanced.py +++ b/homework/m3_pandas_advanced.py @@ -24,19 +24,24 @@ def green_load_and_merge(): 提示:pd.merge(how='left') """ # TODO: 你的程式碼 - pass + orders = pd.read_csv("../datasets/ecommerce/orders_clean.csv") + customers = pd.read_csv("../datasets/ecommerce/customers.csv") + products = pd.read_csv("../datasets/ecommerce/products.csv") + df = orders.merge(customers, on="customer_id", how="left") + df = df.merge(products, on="product_id", how="left") + return df def green_row_count(df): """回傳 DataFrame 的列數 (int)""" # TODO: 你的程式碼 - pass + return len(df) def green_column_list(df): """回傳 DataFrame 的所有欄位名稱 (list)""" # TODO: 你的程式碼 - pass + return list(df.columns) # ============================================================ @@ -50,7 +55,7 @@ def yellow_top_category(df): 提示:groupby('category')['amount'].sum() """ # TODO: 你的程式碼 - pass + return df.groupby("category")["amount"].sum().idxmax() def yellow_gold_vip_stats(df): @@ -60,7 +65,10 @@ def yellow_gold_vip_stats(df): 提示:df[df['vip_level'] == 'Gold'] """ # TODO: 你的程式碼 - pass + gold = df[df["vip_level"] == "Gold"] + order_count = len(gold) + total_amount = gold["amount"].sum() + return (order_count, total_amount) def yellow_region_avg_amount(df): @@ -70,7 +78,7 @@ def yellow_region_avg_amount(df): 提示:groupby('region')['amount'].mean() """ # TODO: 你的程式碼 - pass + return df.groupby("region")["amount"].mean() # ============================================================ @@ -94,4 +102,11 @@ def red_rfm_top5(df): 提示:groupby('customer_id').agg(...) """ # TODO: 你的程式碼 - pass + rfm = df.groupby("customer_id").agg( + R=("order_date", "max"), + F=("order_id", "count"), + M=("amount", "sum"), + customer_name=("customer_name", "first") + ).reset_index() + rfm = rfm.sort_values("M", ascending=False).head(5) + return rfm[["customer_id", "customer_name", "R", "F", "M"]] diff --git a/homework/m4_timeseries.py b/homework/m4_timeseries.py index 047af6a..47064a4 100644 --- a/homework/m4_timeseries.py +++ b/homework/m4_timeseries.py @@ -11,8 +11,8 @@ def _load_data(): """輔助函式:讀取並解析日期""" - df = pd.read_csv("datasets/ecommerce/orders_enriched.csv", - parse_dates=["order_date"]) + # TODO: 你的程式碼 + df = pd.read_csv("../datasets/ecommerce/orders_enriched.csv", parse_dates=["order_date"]) return df @@ -27,7 +27,8 @@ def green_avg_by_month(): 提示:df['order_date'].dt.month """ # TODO: 你的程式碼 - pass + df = _load_data() + return df.groupby(df['order_date'].dt.month)['amount'].mean() def green_top3_dates(): @@ -37,7 +38,8 @@ def green_top3_dates(): 提示:value_counts().head(3) """ # TODO: 你的程式碼 - pass + df = _load_data() + return df['order_date'].dt.date.value_counts().head(3) def green_date_range(): @@ -46,7 +48,8 @@ def green_date_range(): 格式為 pandas Timestamp """ # TODO: 你的程式碼 - pass + df = _load_data() + return (df['order_date'].min(), df['order_date'].max()) # ============================================================ @@ -60,7 +63,8 @@ def yellow_monthly_revenue(): 提示:set_index('order_date').resample('ME')['amount'].sum() """ # TODO: 你的程式碼 - pass + df = _load_data() + return df.set_index('order_date').resample('ME')['amount'].sum() def yellow_rolling_avg(monthly_revenue): @@ -71,7 +75,7 @@ def yellow_rolling_avg(monthly_revenue): 提示:.rolling(window=3).mean() """ # TODO: 你的程式碼 - pass + return monthly_revenue.rolling(window=3).mean() def yellow_category_median(df): @@ -81,7 +85,7 @@ def yellow_category_median(df): 提示:groupby + median + sort_values """ # TODO: 你的程式碼 - pass + return df.groupby('category')['amount'].median().sort_values(ascending=False) # ============================================================ @@ -101,4 +105,9 @@ def red_monthly_report(): 提示:resample + agg + pct_change """ # TODO: 你的程式碼 - pass + df = _load_data() + monthly = df.set_index('order_date').resample('ME').agg({'amount': ['count', 'sum'],'customer_id': 'nunique'}) + monthly.columns = ['order_count', 'revenue', 'active_customers'] + monthly['avg_order_value'] = monthly['revenue'] / monthly['order_count'] + monthly['revenue_growth'] = monthly['revenue'].pct_change() + return monthly diff --git a/homework/m5_visualization.py b/homework/m5_visualization.py index 7e7335d..fa291c7 100644 --- a/homework/m5_visualization.py +++ b/homework/m5_visualization.py @@ -14,8 +14,7 @@ def _load_data(): """輔助函式:讀取資料""" - return pd.read_csv("datasets/ecommerce/orders_enriched.csv", - parse_dates=["order_date"]) + return pd.read_csv("../datasets/ecommerce/orders_enriched.csv",parse_dates=["order_date"]) # ============================================================ @@ -29,7 +28,10 @@ def green_bar_category(): 提示:sns.countplot 或 value_counts().plot.bar() """ # TODO: 你的程式碼 - pass + df = _load_data() + fig, ax = plt.subplots() + sns.countplot(data=df, x='category', ax=ax) + return fig def green_hist_amount(): @@ -39,7 +41,10 @@ def green_hist_amount(): 提示:sns.histplot(bins=20) 或 plt.hist() """ # TODO: 你的程式碼 - pass + df = _load_data() + fig, ax = plt.subplots() + sns.histplot(data=df, x='amount', bins=20, ax=ax) + return fig def green_set_labels(): @@ -51,7 +56,13 @@ def green_set_labels(): 回傳 matplotlib Figure 物件 """ # TODO: 你的程式碼 - pass + df = _load_data() + fig, ax = plt.subplots() + df['category'].value_counts().plot.bar(ax=ax) + ax.set_title('Category Counts') + ax.set_xlabel('Category') + ax.set_ylabel('Count') + return fig # ============================================================ @@ -68,7 +79,17 @@ def yellow_line_region_trend(): 提示:分別 groupby 再 plot,或用 sns.lineplot(hue='region') """ # TODO: 你的程式碼 - pass + df = _load_data() + df['month'] = df['order_date'].dt.month + monthly_revenue = df.groupby(['region', 'month'])['amount'].sum().reset_index() + fig, ax = plt.subplots() + for region in ['North', 'South']: + data = monthly_revenue[monthly_revenue['region'] == region] + ax.plot(data['month'], data['amount'], label=region) + ax.legend() + ax.set_xlabel('Month') + ax.set_ylabel('Revenue') + return fig def yellow_box_vip(): @@ -78,7 +99,10 @@ def yellow_box_vip(): 提示:sns.boxplot(x='vip_level', y='amount', data=df) """ # TODO: 你的程式碼 - pass + df = _load_data() + fig, ax = plt.subplots() + sns.boxplot(data=df, x='vip_level', y='amount', ax=ax) + return fig def yellow_scatter_price_amount(): @@ -88,7 +112,10 @@ def yellow_scatter_price_amount(): 提示:plt.scatter() 或 sns.scatterplot() """ # TODO: 你的程式碼 - pass + df = _load_data() + fig, ax = plt.subplots() + sns.scatterplot(data=df, x='unit_price', y='amount', ax=ax) + return fig # ============================================================ @@ -107,4 +134,30 @@ def red_category_dashboard(category="Electronics"): 提示:fig, axes = plt.subplots(2, 2, figsize=(14, 10)) """ # TODO: 你的程式碼 - pass + df = _load_data() + cat_df = df[df['category'] == category] + + fig, axes = plt.subplots(2, 2, figsize=(14, 10)) + + # 1. 月營收趨勢 + cat_df['month'] = cat_df['order_date'].dt.month + monthly_rev = cat_df.groupby('month')['amount'].sum() + axes[0, 0].plot(monthly_rev.index, monthly_rev.values) + axes[0, 0].set_title('Monthly Revenue Trend') + + # 2. 各地區營收 + region_rev = cat_df.groupby('region')['amount'].sum() + region_rev.plot.bar(ax=axes[0, 1]) + axes[0, 1].set_title('Revenue by Region') + + # 3. Top 5 商品營收 + top_products = cat_df.groupby('product_name')['amount'].sum().nlargest(5) + top_products.plot.barh(ax=axes[1, 0]) + axes[1, 0].set_title('Top 5 Products Revenue') + + # 4. 訂單金額分佈 + sns.histplot(data=cat_df, x='amount', ax=axes[1, 1]) + axes[1, 1].set_title('Order Amount Distribution') + + plt.tight_layout() + return fig diff --git a/homework/m6_plotly_capstone.py b/homework/m6_plotly_capstone.py index 0e2c32a..98ac235 100644 --- a/homework/m6_plotly_capstone.py +++ b/homework/m6_plotly_capstone.py @@ -26,7 +26,10 @@ def green_plotly_bar(): 提示:px.bar() """ # TODO: 你的程式碼 - pass + df = pd.read_csv("datasets/ecommerce/orders_enriched.csv") + category_revenue = df.groupby('category')['amount'].sum().reset_index() + fig = px.bar(category_revenue, x='category', y='amount', title='Revenue by Category') + return fig def green_plotly_line(): @@ -37,7 +40,11 @@ def green_plotly_line(): 提示:先 groupby 月份算總營收,再 px.line() """ # TODO: 你的程式碼 - pass + df = pd.read_csv("datasets/ecommerce/orders_enriched.csv", parse_dates=['order_date']) + df['month'] = df['order_date'].dt.to_period('M').astype(str) + monthly_revenue = df.groupby('month')['amount'].sum().reset_index() + fig = px.line(monthly_revenue, x='month', y='amount', title='Monthly Revenue Trend') + return fig def green_plotly_pie(): @@ -48,7 +55,11 @@ def green_plotly_pie(): 提示:px.pie() """ # TODO: 你的程式碼 - pass + df = pd.read_csv("datasets/ecommerce/orders_enriched.csv") + vip_counts = df['vip_level'].value_counts().reset_index() + vip_counts.columns = ['vip_level', 'count'] + fig = px.pie(vip_counts, values='count', names='vip_level', title='VIP Level Distribution') + return fig # ============================================================ @@ -63,7 +74,20 @@ def yellow_clean_and_merge(raw_path, customers_path, products_path): 回傳:合併後的 DataFrame """ # TODO: 你的程式碼 - pass + # Clean orders_raw as in m2 + df = pd.read_csv(raw_path) + df.columns = df.columns.str.strip().str.lower() + df["amount"] = df["amount"].astype(str).str.replace("$", "", regex=False).str.replace(",", "", regex=False).astype(float) + df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce") + df = df.dropna(subset=["amount", "order_date"]) + df = df.drop_duplicates() + + # Merge with customers and products + customers = pd.read_csv(customers_path) + products = pd.read_csv(products_path) + df = df.merge(customers, on='customer_id', how='left') + df = df.merge(products, on='product_id', how='left') + return df def yellow_kpi_summary(df): @@ -77,7 +101,16 @@ def yellow_kpi_summary(df): } """ # TODO: 你的程式碼 - pass + total_revenue = df['amount'].sum() + order_count = len(df) + active_customers = df['customer_id'].nunique() + avg_order_value = total_revenue / order_count if order_count > 0 else 0 + return { + "total_revenue": float(total_revenue), + "order_count": int(order_count), + "active_customers": int(active_customers), + "avg_order_value": float(avg_order_value), + } def yellow_plotly_scatter(df): @@ -91,7 +124,8 @@ def yellow_plotly_scatter(df): 提示:px.scatter(hover_data=['product_name']) """ # TODO: 你的程式碼 - pass + fig = px.scatter(df, x='unit_price', y='amount', color='category', hover_data=['product_name'], title='Unit Price vs Order Amount') + return fig # ============================================================ @@ -115,4 +149,35 @@ def red_dashboard(): 提示:from plotly.subplots import make_subplots """ # TODO: 你的程式碼 - pass + df = yellow_clean_and_merge( + "datasets/ecommerce/orders_raw.csv", + "datasets/ecommerce/customers.csv", + "datasets/ecommerce/products.csv", + ) + + fig = make_subplots( + rows=2, cols=2, + subplot_titles=('Monthly Revenue Trend', 'Top 10 Products Revenue', 'Revenue by Region', 'Category Revenue Share'), + specs=[[{'type': 'xy'}, {'type': 'xy'}], + [{'type': 'xy'}, {'type': 'domain'}]] + ) + + # 左上:月營收趨勢 + df['month'] = df['order_date'].dt.to_period('M').astype(str) + monthly_rev = df.groupby('month')['amount'].sum().reset_index() + fig.add_trace(go.Scatter(x=monthly_rev['month'], y=monthly_rev['amount'], mode='lines'), row=1, col=1) + + # 右上:Top 10 商品營收 + top_products = df.groupby('product_name')['amount'].sum().nlargest(10).reset_index() + fig.add_trace(go.Bar(x=top_products['product_name'], y=top_products['amount']), row=1, col=2) + + # 左下:各地區營收 + region_rev = df.groupby('region')['amount'].sum().reset_index() + fig.add_trace(go.Bar(x=region_rev['region'], y=region_rev['amount']), row=2, col=1) + + # 右下:類別營收佔比 + category_rev = df.groupby('category')['amount'].sum().reset_index() + fig.add_trace(go.Pie(labels=category_rev['category'], values=category_rev['amount']), row=2, col=2) + + fig.update_layout(title_text='E-commerce Dashboard') + return fig From aae744d912cbdb5c27c1b291ff0a2c01f68455d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=84=AD=E7=8E=89?= Date: Sun, 3 May 2026 20:01:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=B9=B3=E4=BA=A4?= =?UTF-8?q?=E4=BD=9C=E6=A5=AD=20-=E9=84=AD=E7=8E=89=20-AIPE03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework/m1_numpy.py | 4 ++-- homework/m2_pandas_cleaning.py | 2 +- homework/m3_pandas_advanced.py | 6 +++--- homework/m4_timeseries.py | 2 +- homework/m5_visualization.py | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/homework/m1_numpy.py b/homework/m1_numpy.py index de46b1d..0b68d7f 100644 --- a/homework/m1_numpy.py +++ b/homework/m1_numpy.py @@ -41,7 +41,7 @@ def green_filter(): # 🟡 核心題(每題 15 分,共 45 分) # 以下函式會接收從 products.csv 讀出的 prices, stocks 陣列 # ============================================================ -DATA = '../datasets/ecommerce/products.csv' +DATA = 'datasets/ecommerce/products.csv' stocks = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=4) prices = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=3) @@ -73,7 +73,7 @@ def yellow_restock_cost(prices, stocks): # ============================================================ # 🔴 挑戰題(25 分) # ============================================================ -DATA = '../datasets/ecommerce/products.csv' +DATA = 'datasets/ecommerce/products.csv' stocks = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=4) prices = np.genfromtxt(DATA, delimiter=',', skip_header=1, usecols=3) diff --git a/homework/m2_pandas_cleaning.py b/homework/m2_pandas_cleaning.py index 224dd47..eef8d5b 100644 --- a/homework/m2_pandas_cleaning.py +++ b/homework/m2_pandas_cleaning.py @@ -13,7 +13,7 @@ # ============================================================ # 🟢 送分題(每題 10 分,共 30 分) # ============================================================ -DATA = '../datasets/ecommerce/orders_raw.csv' +DATA = 'datasets/ecommerce/orders_raw.csv' def green_read_csv(): diff --git a/homework/m3_pandas_advanced.py b/homework/m3_pandas_advanced.py index 9cd3a74..9d6a21b 100644 --- a/homework/m3_pandas_advanced.py +++ b/homework/m3_pandas_advanced.py @@ -24,9 +24,9 @@ def green_load_and_merge(): 提示:pd.merge(how='left') """ # TODO: 你的程式碼 - orders = pd.read_csv("../datasets/ecommerce/orders_clean.csv") - customers = pd.read_csv("../datasets/ecommerce/customers.csv") - products = pd.read_csv("../datasets/ecommerce/products.csv") + orders = pd.read_csv("datasets/ecommerce/orders_clean.csv") + customers = pd.read_csv("datasets/ecommerce/customers.csv") + products = pd.read_csv("datasets/ecommerce/products.csv") df = orders.merge(customers, on="customer_id", how="left") df = df.merge(products, on="product_id", how="left") return df diff --git a/homework/m4_timeseries.py b/homework/m4_timeseries.py index 47064a4..0dad658 100644 --- a/homework/m4_timeseries.py +++ b/homework/m4_timeseries.py @@ -12,7 +12,7 @@ def _load_data(): """輔助函式:讀取並解析日期""" # TODO: 你的程式碼 - df = pd.read_csv("../datasets/ecommerce/orders_enriched.csv", parse_dates=["order_date"]) + df = pd.read_csv("datasets/ecommerce/orders_enriched.csv", parse_dates=["order_date"]) return df diff --git a/homework/m5_visualization.py b/homework/m5_visualization.py index fa291c7..02b7cc6 100644 --- a/homework/m5_visualization.py +++ b/homework/m5_visualization.py @@ -14,7 +14,7 @@ def _load_data(): """輔助函式:讀取資料""" - return pd.read_csv("../datasets/ecommerce/orders_enriched.csv",parse_dates=["order_date"]) + return pd.read_csv("datasets/ecommerce/orders_enriched.csv",parse_dates=["order_date"]) # ============================================================