创建一个将时间转换为二进制响应变量的函数
Create a function that converts time to a binary response variable
我目前有一个 RDD,其中有两列
Row(pickup_time=datetime.datetime(2014, 2, 9, 14, 51)
dropoff_time=datetime.datetime(2014, 2, 9, 14, 58)
我想将它们转换为二进制响应变量,其中 1 表示夜间,0 表示白天。
我知道我们可以使用 UserDefinedFunction
创建一个函数,它将这些更改为所需的格式。
例如,我有另一列是一个字符串,它指定支付类型为 'CSH' 或 'CRD',所以我可以解决这个问题
pay_map = {'CRD':1.0, 'CSH':0.0}
pay_bin = UserDefinedFunction(lambda z: pay_map[z], DoubleType())
df = df.withColumn('payment_type', pay_bin(df['payment_type']))
我如何将同样的逻辑应用于我提出的问题?如果有帮助,我会尝试转换这些变量,因为我将成为 运行 决策树。
这里不需要UDF。您可以使用 between
并键入 casting:
from pyspark.sql.functions import hour
def in_range(colname, lower_bound=6, upper_bound=17):
"""
:param colname - Input column name (str)
:lower_bound - Lower bound for day hour (int, 0-23)
:upper_bound - Upper bound for day hour (int, 0-23)
"""
assert 0 <= lower_bound <= 23
assert 0 <= upper_bound <= 23
if lower_bound < upper_bound:
return hour(colname).between(lower_bound, upper_bound).cast("integer")
else:
return (
(hour(colname) >= lower_bound) |
(hour(colname) <= upper_bound)
).cast("integer")
用法示例:
df = sc.parallelize([
Row(
pickup_time=datetime.datetime(2014, 2, 9, 14, 51),
dropoff_time=datetime.datetime(2014, 2, 9, 14, 58)
),
Row(
pickup_time=datetime.datetime(2014, 2, 9, 19, 51),
dropoff_time=datetime.datetime(2014, 2, 9, 1, 58)
)
]).toDF()
(df
.withColumn("dropoff_during_day", in_range("dropoff_time"))
# between 6pm and 5am
.withColumn("pickpup_during_night", in_range("pickup_time", 18, 5)))
+--------------------+--------------------+------------------+--------------------+
| dropoff_time| pickup_time|dropoff_during_day|pickpup_during_night|
+--------------------+--------------------+------------------+--------------------+
|2014-02-09 14:58:...|2014-02-09 14:51:...| 1| 0|
|2014-02-09 01:58:...|2014-02-09 19:51:...| 0| 1|
+--------------------+--------------------+------------------+--------------------+
我目前有一个 RDD,其中有两列
Row(pickup_time=datetime.datetime(2014, 2, 9, 14, 51)
dropoff_time=datetime.datetime(2014, 2, 9, 14, 58)
我想将它们转换为二进制响应变量,其中 1 表示夜间,0 表示白天。
我知道我们可以使用 UserDefinedFunction
创建一个函数,它将这些更改为所需的格式。
例如,我有另一列是一个字符串,它指定支付类型为 'CSH' 或 'CRD',所以我可以解决这个问题
pay_map = {'CRD':1.0, 'CSH':0.0}
pay_bin = UserDefinedFunction(lambda z: pay_map[z], DoubleType())
df = df.withColumn('payment_type', pay_bin(df['payment_type']))
我如何将同样的逻辑应用于我提出的问题?如果有帮助,我会尝试转换这些变量,因为我将成为 运行 决策树。
这里不需要UDF。您可以使用 between
并键入 casting:
from pyspark.sql.functions import hour
def in_range(colname, lower_bound=6, upper_bound=17):
"""
:param colname - Input column name (str)
:lower_bound - Lower bound for day hour (int, 0-23)
:upper_bound - Upper bound for day hour (int, 0-23)
"""
assert 0 <= lower_bound <= 23
assert 0 <= upper_bound <= 23
if lower_bound < upper_bound:
return hour(colname).between(lower_bound, upper_bound).cast("integer")
else:
return (
(hour(colname) >= lower_bound) |
(hour(colname) <= upper_bound)
).cast("integer")
用法示例:
df = sc.parallelize([
Row(
pickup_time=datetime.datetime(2014, 2, 9, 14, 51),
dropoff_time=datetime.datetime(2014, 2, 9, 14, 58)
),
Row(
pickup_time=datetime.datetime(2014, 2, 9, 19, 51),
dropoff_time=datetime.datetime(2014, 2, 9, 1, 58)
)
]).toDF()
(df
.withColumn("dropoff_during_day", in_range("dropoff_time"))
# between 6pm and 5am
.withColumn("pickpup_during_night", in_range("pickup_time", 18, 5)))
+--------------------+--------------------+------------------+--------------------+
| dropoff_time| pickup_time|dropoff_during_day|pickpup_during_night|
+--------------------+--------------------+------------------+--------------------+
|2014-02-09 14:58:...|2014-02-09 14:51:...| 1| 0|
|2014-02-09 01:58:...|2014-02-09 19:51:...| 0| 1|
+--------------------+--------------------+------------------+--------------------+