时间特征

使用 PySpark 进行特征工程

John Hogue

Lead Data Scientist, General Mills

事物的周期性

时间图片

使用 PySpark 进行特征工程

选择合适的粒度

日销售额

使用 PySpark 进行特征工程

选择合适的粒度

月销售额

使用 PySpark 进行特征工程

把日期字段当作日期处理…

from pyspark.sql.functions import to_date

# 将数据类型转换为日期
df = df.withColumn('LISTDATE', to_date('LISTDATE'))
# 查看字段
df[['LISTDATE']].show(2)
+----------+
|  LISTDATE|
+----------+
|2017-07-14|
|2017-10-08|
+----------+
only showing top 2 rows
使用 PySpark 进行特征工程

时间组成部分

from pyspark.sql.functions import year, month

# 新增年份列
df = df.withColumn('LIST_YEAR', year('LISTDATE'))
# 新增月份列
df = df.withColumn('LIST_MONTH', month('LISTDATE'))
from pyspark.sql.functions import dayofmonth, weekofyear

# 新增月内日序列
df = df.withColumn('LIST_DAYOFMONTH', dayofmonth('LISTDATE'))
# 新增年内周序列
df = df.withColumn('LIST_WEEKOFYEAR', weekofyear('LISTDATE'))
使用 PySpark 进行特征工程

基础时间度量

在市天数图片

from pyspark.sql.functions import datediff

# 计算两个日期字段的差值
df.withColumn('DAYSONMARKET', datediff('OFFMARKETDATE', 'LISTDATE'))
使用 PySpark 进行特征工程

滞后特征

杯中落下的咖啡滴

window()

基于一组记录返回一条记录

lag(col, count=1)

返回当前行之前偏移行的值

使用 PySpark 进行特征工程

用 PySpark 构建滞后特征

from pyspark.sql.functions import lag
from pyspark.sql.window import Window

# 创建窗口 w = Window().orderBy(m_df['DATE'])
# 创建滞后列 m_df = m_df.withColumn('MORTGAGE-1wk', lag('MORTGAGE', count=1).over(w))
# 查看结果 m_df.show(3)
+----------+------------+----------------+
|      DATE|    MORTGAGE|    MORTGAGE-1wk|
+----------+------------+----------------+
|2013-10-10|        4.23|            null|
|2013-10-17|        4.28|            4.23|
|2013-10-24|        4.13|            4.28|
+----------+------------+----------------+
only showing top 3 rows
使用 PySpark 进行特征工程

是时候练习了!

使用 PySpark 进行特征工程

Preparing Video For Download...