我正在准备一个使用PySpark训练机器学习模型的数据集。我正在处理的数据帧包含数千条关于不同建筑和城市不同房间内不同日期登记的存在的记录。这些表示形式如下:
+----+----+----+---+---------+------+--------+-------+---------+
|room|building|city|day|month|inHour|inMinute|outHour|outMinute|
+----+--------+----+---+-----+------+--------+-------+---------+
| 1| 1| 1| 9| 11| 8| 27| 13| 15|
| 1| 1| 1| 9| 11| 8| 28| 13| 5|
| 1| 1| 1| 9| 11| 8| 32| 13| 7|
| 1| 1| 1| 9| 11| 8| 32| 8| 50|
| 1| 1| 1| 9| 11| 8| 32| 8| 48|
+----+--------+----+---+-----+------+--------+-------+---------+inHour和inMinute表示访问的小时和分钟,当然,outHour和outMinute表示退出的时间。小时数以0-23的格式考虑。所有列都只包含整数值。
我缺少的是我的机器学习模型的目标值,即房间、建筑物、城市、日、月和时间间隔的组合的人数。我将尝试更好地解释,第一行表示访问时间为8,退出时间为13的存在,因此它应该被计入间隔为8-9,9-10,10-11,11-12和13-14的记录中。我想要实现的内容如下:
+----+----+----+---+---------+------+-------+-----+
|room|building|city|day|month|timeIn|timeOut|count|
+----+--------+----+---+-----+------+-------+-----+
| 1| 1| 1| 9| 11| 8| 9| X|
| 1| 1| 1| 9| 11| 9| 10| X|
| 1| 1| 1| 9| 11| 10| 11| X|
| 1| 1| 1| 9| 11| 11| 12| X|
| 1| 1| 1| 9| 11| 12| 13| X|
+----+--------+----+---+-----+------+-------+-----+所以第一个表的第四行应该计入这个表的第一行,依此类推…
发布于 2021-01-10 01:58:06
您可以分解一系列小时(例如,第一行将具有[8,9,10,11,12,13]),按小时分组(以及其他列),并获得每个组的聚合计数。这里的hour指的是timeIn。我认为没有必要在结果数据帧中指定timeOut,因为它总是timeIn + 1。
import pyspark.sql.functions as F
df2 = df.withColumn(
'hour',
F.explode(F.sequence('inHour', 'outHour'))
).groupBy(
'room', 'building', 'city', 'day', 'month', 'hour'
).count().orderBy('hour')
df2.show()
+----+--------+----+---+-----+----+-----+
|room|building|city|day|month|hour|count|
+----+--------+----+---+-----+----+-----+
| 1| 1| 1| 9| 11| 8| 5|
| 1| 1| 1| 9| 11| 9| 3|
| 1| 1| 1| 9| 11| 10| 3|
| 1| 1| 1| 9| 11| 11| 3|
| 1| 1| 1| 9| 11| 12| 3|
| 1| 1| 1| 9| 11| 13| 3|
+----+--------+----+---+-----+----+-----+https://stackoverflow.com/questions/65645790
复制相似问题