0Pricing
Pandas & NumPy Academy · 课时

收入计算与特征工程

计算订单行收入,创建月份和季度列,并为超过阈值的订单添加折扣标记。

收入计算与特征工程 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

计算行项目收入

销售数据集中最基础的计算是行项目收入:每一行的数量乘以单价。请使用向量化乘法创建该列,使 NumPy 能够同时处理每一行,而不必使用 Python 循环。该列将成为分析中所有聚合计算的基础。

import pandas as pd

df = pd.read_parquet('sales_clean.parquet')

df['revenue'] = df['quantity'] * df['unit_price']
print(df[['quantity', 'unit_price', 'revenue']].head())

提取月份和季度列

按日历周期分组对于趋势分析至关重要。请在日期时间列上使用 .dt 访问器提取年份、月份和季度。将这些值存储为单独的整数列,可以加快 groupby 操作,并让您轻松按周期筛选,而不必反复解析字符串。

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['year_month'] = df['order_date'].dt.to_period('M')

print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())

创建折扣标记

业务规则通常会定义折扣标记:总金额超过阈值的订单可获得折扣。请使用 np.where 或布尔比较,高效地创建这一二值列。折扣标记让分析人员可以通过一次 groupby 调用,比较享受折扣的订单与原价订单的收入分布。

import numpy as np

DISCOUNT_THRESHOLD = 500

df['is_discounted'] = np.where(df['revenue'] >= DISCOUNT_THRESHOLD, 1, 0)

print(df['is_discounted'].value_counts())
print(df.groupby('is_discounted')['revenue'].mean())

计算利润率列

如果数据集包含 cost_price 列,您可以使用 (unit_price - cost_price) / unit_price 计算利润率。在进一步分析前,请使用 clip(lower=0) 将由数据错误导致的负利润率限制为不低于 0。利润率列支持围绕利润进行 groupby 聚合,并可与收入分析结合使用。

df['margin'] = ((df['unit_price'] - df['cost_price']) / df['unit_price']).clip(lower=0)

print(df[['unit_price', 'cost_price', 'margin']].describe())

首次下单后的天数特征

客户首次下单与当前订单之间的天数,是一个有用的客户生命周期特征。请按 customer_id 分组,将最早日期作为群组日期,然后用每一行的日期减去该日期。时间差运算会返回由 timedelta64 值组成的列,您可以使用 .dt.days 将其转换为整数天数。

first_order = df.groupby('customer_id')['order_date'].transform('min')
df['days_since_first_order'] = (df['order_date'] - first_order).dt.days

print(df[['customer_id', 'order_date', 'days_since_first_order']].head())

使用 pd.cut 划分订单大小区间

请使用 pd.cut() 将revenue 列划分为带标签的大小区间,从而创建用于客户分群的有序特征。请提供明确的 bins 和 labels,并确保它们符合业务对小型、中型和大型订单的定义。生成的列是 Pandas Categorical,适合高效分组。

bins = [0, 100, 500, 2000, float('inf')]
labels = ['Small', 'Medium', 'Large', 'Enterprise']

df['order_size'] = pd.cut(df['revenue'], bins=bins, labels=labels)
print(df['order_size'].value_counts())

计算收入随时间的累计值

请按 order_date 对 DataFrame 排序,并对收入列使用 cumsum(),以跟踪全年总收入的累计过程。通过这一累计序列,可以轻松判断收入是在稳定线性增长、加速增长,还是趋于平稳;它也是绘制瀑布图或累计折线图的基础。

df_sorted = df.sort_values('order_date')
df_sorted['cumulative_revenue'] = df_sorted['revenue'].cumsum()

print(df_sorted[['order_date', 'revenue', 'cumulative_revenue']].tail())

周末与工作日特征

dt.day_of_week 属性返回从 0(星期一)到 6(星期日)的数值。请将星期六(5)和星期日(6)标记为周末订单,以检验周末购买行为是否不同于工作日。这是零售 EDA 和 A/B 测试分析中常见的特征。

df['is_weekend'] = df['order_date'].dt.day_of_week >= 5

print(df.groupby('is_weekend')['revenue'].agg(['mean', 'count']))

按收入对客户排名

请使用 groupby().sum() 计算每个 customer_id 的总收入,以识别顶级客户,然后使用 .rank(ascending=False, method='dense') 进行排名。通过 map() 将排名添加回主 DataFrame 后,您就可以使用一个布尔条件筛选前 N 名客户。

customer_revenue = df.groupby('customer_id')['revenue'].sum()
customer_rank = customer_revenue.rank(ascending=False, method='dense').astype(int)

df['customer_revenue_rank'] = df['customer_id'].map(customer_rank)
print(df[df['customer_revenue_rank'] <= 10][['customer_id', 'customer_revenue_rank']].drop_duplicates())

使用 Z 分数标准化收入

请将收入列标准化为 Z 分数,以便比较不同产品类别中的订单大小,即使这些类别的价格范围差异很大。请使用 (df['revenue'] - df['revenue'].mean()) / df['revenue'].std()。高于 3 或低于 -3 的 Z 分数属于值得在建模前调查的统计异常值。

mean_rev = df['revenue'].mean()
std_rev = df['revenue'].std()

df['revenue_zscore'] = (df['revenue'] - mean_rev) / std_rev

outliers = df[df['revenue_zscore'].abs() > 3]
print(f'Outlier orders: {len(outliers)}')

保存添加特征后的 DataFrame

添加计算列后,请保存添加了特征的 DataFrame,以确保所有后续笔记本都从相同且一致的状态开始。请使用 to_parquet() 保留数据类型,尤其是 Categorical 类型的 order_size 列和日期时间类型的 order_date 列。在脚本顶部添加简短的注释块,记录新增的列。

# New columns added:
# revenue, year, month, quarter, year_month
# is_discounted, order_size, is_weekend
# days_since_first_order, customer_revenue_rank, revenue_zscore

df.to_parquet('sales_features.parquet', index=False)
print('Feature DataFrame saved:', df.shape)

快速检查

测试您对本课数据分析概念的理解。

课程回顾

本课中,您学习了:计算收入和利润率列、使用 .dt 访问器提取时间特征,以及构建折扣标记、订单大小区间和客户排名等特征。接下来,我们将探索按地区和类别进行的 groupby 分析。

常见问题解答

「收入计算与特征工程」课时是免费的吗?

是的 — 「收入计算与特征工程」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「收入计算与特征工程」这节课中我会学到什么?

计算订单行收入,创建月份和季度列,并为超过阈值的订单添加折扣标记。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「收入计算与特征工程」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 加载并审计销售数据集
  2. 收入计算与特征工程
  3. 按地区和类别进行 GroupBy 分析
  4. 月度趋势可视化
← 返回 Pandas & NumPy Academy