标题:Python实现优惠券构造特征:从基础到进阶的完整指南

Python实现优惠券构造特征:从基础到进阶的完整指南

在电商、O2O等业务场景中,优惠券是提升用户转化率的核心工具之一。如何通过Python高效构造优惠券特征,直接影响营销策略的精准度和效果。本文将从基础特征提取到高级组合特征,系统讲解优惠券特征的构造方法,并提供可复用的代码示例。

一、优惠券基础特征构造

1.1 基础属性提取

优惠券的基础属性是特征工程的起点,包括面额、有效期、使用门槛等。以下是一个基础属性提取的示例:

  1. import pandas as pd
  2. def extract_coupon_base_features(df):
  3. """
  4. 提取优惠券基础特征
  5. :param df: 包含优惠券信息的DataFrame
  6. :return: 添加了基础特征的DataFrame
  7. """
  8. # 面额特征
  9. df['discount_type'] = df['discount_amount'].apply(
  10. lambda x: 'fixed' if isinstance(x, (int, float)) else 'percentage'
  11. )
  12. # 有效期特征
  13. df['valid_days'] = (df['expire_date'] - df['issue_date']).dt.days
  14. df['is_short_term'] = df['valid_days'] <= 7 # 短期优惠券标记
  15. # 使用门槛特征
  16. df['threshold_type'] = df['min_spend'].apply(
  17. lambda x: 'low' if x < 50 else 'medium' if x < 200 else 'high'
  18. )
  19. return df

关键点

  • 面额类型(定额/百分比)直接影响用户感知
  • 有效期长度影响用户决策紧迫感
  • 使用门槛高低与用户群体匹配度强相关

1.2 时间维度特征

时间特征是优惠券效果分析的重要维度,包括发放时间、使用时间等:

  1. def extract_time_features(df):
  2. """
  3. 提取时间维度特征
  4. """
  5. # 发放时间特征
  6. df['issue_hour'] = df['issue_date'].dt.hour
  7. df['issue_weekday'] = df['issue_date'].dt.weekday
  8. df['is_weekend_issue'] = df['issue_weekday'].isin([5, 6])
  9. # 使用时间特征(如果已使用)
  10. if 'use_date' in df.columns:
  11. df['time_to_expire'] = (df['expire_date'] - df['use_date']).dt.days
  12. df['is_last_minute'] = df['time_to_expire'] <= 1
  13. return df

应用场景

  • 工作日/周末发放效果对比
  • 临期使用行为分析
  • 不同时段发放的转化率差异

二、用户行为关联特征

2.1 用户-优惠券匹配特征

构建用户与优惠券的匹配度特征是提升精准营销的关键:

  1. def build_user_coupon_match_features(user_df, coupon_df):
  2. """
  3. 构建用户-优惠券匹配特征
  4. :param user_df: 用户特征DataFrame
  5. :param coupon_df: 优惠券特征DataFrame
  6. :return: 合并后的特征DataFrame
  7. """
  8. # 用户消费能力匹配
  9. merged = pd.merge(user_df, coupon_df, on='user_id')
  10. merged['spend_match_score'] = merged.apply(
  11. lambda x: 1 if x['avg_spend'] >= x['min_spend'] else
  12. 0.5 if x['avg_spend'] >= x['min_spend']*0.7 else 0,
  13. axis=1
  14. )
  15. # 品类偏好匹配
  16. # 假设有用户品类偏好和优惠券品类信息
  17. if 'preferred_category' in user_df.columns and 'category' in coupon_df.columns:
  18. merged['category_match'] = merged['preferred_category'] == merged['category']
  19. return merged

优化方向

  • 基于用户历史消费构建更精细的匹配模型
  • 考虑用户对不同折扣形式的敏感度

2.2 用户生命周期特征

结合用户生命周期阶段构造特征:

  1. def extract_user_lifecycle_features(df):
  2. """
  3. 提取用户生命周期特征
  4. """
  5. # 新老用户标记
  6. df['is_new_user'] = df['user_days_since_first'] <= 30
  7. # 活跃度特征
  8. df['active_level'] = pd.qcut(
  9. df['30d_order_count'],
  10. q=3,
  11. labels=['low', 'medium', 'high']
  12. )
  13. return df

三、高级特征构造技巧

3.1 组合特征工程

通过特征交叉创造更有价值的组合特征:

  1. def create_combined_features(df):
  2. """
  3. 创建组合特征
  4. """
  5. # 折扣力度与门槛的组合
  6. df['discount_threshold_ratio'] = df['discount_amount'] / df['min_spend']
  7. # 时间与折扣的组合
  8. if 'issue_weekday' in df.columns:
  9. df['weekend_high_discount'] = (
  10. df['is_weekend_issue'] &
  11. (df['discount_amount'] > df['discount_amount'].median())
  12. )
  13. return df

3.2 特征编码技巧

对分类特征进行优化编码:

  1. from sklearn.preprocessing import OrdinalEncoder
  2. def encode_categorical_features(df):
  3. """
  4. 分类特征编码
  5. """
  6. # 优惠券类型有序编码
  7. coupon_type_order = ['new_user', 'regular', 'vip', 'recovery']
  8. encoder = OrdinalEncoder(categories=[coupon_type_order])
  9. df['coupon_type_encoded'] = encoder.fit_transform(
  10. df[['coupon_type']]
  11. )
  12. return df

四、特征质量评估

构造特征后需要进行质量评估:

  1. def evaluate_feature_quality(df, target_col):
  2. """
  3. 评估特征质量
  4. :param df: 包含特征和目标变量的DataFrame
  5. :param target_col: 目标变量列名
  6. :return: 特征重要性排序
  7. """
  8. from sklearn.feature_selection import mutual_info_classif
  9. # 分离特征和目标
  10. X = df.drop(columns=[target_col, 'user_id', 'coupon_id'])
  11. y = df[target_col]
  12. # 计算互信息
  13. mi_scores = mutual_info_classif(X, y, discrete_features=X.dtypes == object)
  14. feature_importance = pd.DataFrame({
  15. 'feature': X.columns,
  16. 'mi_score': mi_scores
  17. }).sort_values('mi_score', ascending=False)
  18. return feature_importance

五、完整实现示例

以下是一个完整的优惠券特征构造流程:

  1. import pandas as pd
  2. from datetime import datetime, timedelta
  3. # 模拟数据生成
  4. def generate_sample_data(n=1000):
  5. """
  6. 生成模拟优惠券数据
  7. """
  8. users = pd.DataFrame({
  9. 'user_id': range(n),
  10. 'avg_spend': [round(x, 2) for x in np.random.normal(150, 50, n)],
  11. 'preferred_category': np.random.choice(['electronics', 'clothing', 'food'], n),
  12. 'user_days_since_first': np.random.randint(1, 365, n)
  13. })
  14. coupons = pd.DataFrame({
  15. 'coupon_id': range(n),
  16. 'discount_amount': np.random.choice([10, 20, 30, 50, '10%'], n),
  17. 'min_spend': np.random.choice([50, 100, 200, 300], n),
  18. 'issue_date': [datetime.now() - timedelta(days=x)
  19. for x in np.random.randint(0, 30, n)],
  20. 'expire_date': [datetime.now() + timedelta(days=x)
  21. for x in np.random.randint(1, 30, n)],
  22. 'category': np.random.choice(['electronics', 'clothing', 'food'], n)
  23. })
  24. # 模拟使用情况
  25. coupons['is_used'] = np.random.choice([True, False], n, p=[0.6, 0.4])
  26. return users, coupons
  27. # 完整特征构造流程
  28. def build_coupon_features():
  29. users, coupons = generate_sample_data()
  30. # 基础特征
  31. coupons = extract_coupon_base_features(coupons)
  32. coupons = extract_time_features(coupons)
  33. # 用户关联特征
  34. merged = build_user_coupon_match_features(users, coupons)
  35. # 高级特征
  36. merged = create_combined_features(merged)
  37. # 评估特征
  38. if 'is_used' in merged.columns:
  39. feature_importance = evaluate_feature_quality(merged, 'is_used')
  40. print("特征重要性排序:")
  41. print(feature_importance.head(10))
  42. return merged
  43. # 执行
  44. if __name__ == "__main__":
  45. import numpy as np
  46. np.random.seed(42)
  47. features_df = build_coupon_features()

六、实践建议

  1. 特征迭代:建立AB测试机制,持续验证特征效果
  2. 实时特征:对于时效性强的优惠券,考虑构建实时特征管道
  3. 特征监控:监控特征分布变化,及时处理数据漂移
  4. 可解释性:重要特征需具备业务可解释性,便于策略调整

通过系统化的优惠券特征构造,企业可以更精准地预测优惠券效果,优化发放策略,最终提升营销ROI。Python的强大生态为这一过程提供了高效工具链,从数据处理到机器学习建模都能无缝衔接。