【发布时间】:2023-03-24 16:16:01
【问题描述】:
我正在开发一个基于 LSTM 的网络,我需要使用 Pandas 对其他列的值的出现序列进行建模,其中每个序列必须受长度限制。
一个实际的用例,我有多台带有日志的机器,日志标有标题和时间戳(为了示例,t1 < t2 < t3 ...),初始数据帧如下所示:
d = {'timestamp': ['t1', 't2', 't1', 't3', 't2', 't2', 't1'],
'machine': ['M1', 'M2', 'M2', 'M1', 'M2', 'M1', 'M3'],
'log': ['A', 'B', 'A', 'C', 'A', 'A', 'B']}
df = pd.DataFrame(d)
print(df.head(7))
timestamp machine log
0 t1 M1 A
1 t2 M2 B
2 t1 M2 A
3 t3 M1 C
4 t2 M2 A
5 t2 M1 A
6 t1 M3 B
我想要得到的是每台机器的序列最大为max_len = 2 的数据框。
所需的输出应如下所示:
max_len = 2
machine sequence
0 M1 [A, A] # index from original df: [0, 5]
1 M1 [A, C] # index from original df: [5, 3]
2 M2 [A, A] # index from original df: [2, 4]
3 M2 [A, B] # index from original df: [4, 1]
4 M3 [B] # index from original df: [6]
序列受max_len = 2 限制,其元素按timestamp 排序。
max_len = 3
machine sequence
0 M1 [A, A, C] # index from original df: [0, 5, 3]
1 M2 [A, A, B] # index from original df: [2, 4, 1]
2 M3 [B] # index from original df: [6]
序列受max_len = 3 限制,其元素按timestamp 排序。
注意:max_len 参数是序列长度的上限,我将填充短序列(如M3's)以适应 LSTM 要求。
注意 2:我实际上是按 2 列进行分组,但为了使这个示例尽可能少,我只包含了 1 列。
到目前为止我尝试了什么:
到目前为止,我一直在使用PySpark,但是我通过逐步使用F.lag 函数来做错了。这留下了许多无用的部分序列,我无法从中识别出需要填充的短序列,而且这种幼稚的方法很慢而且基本上不是那么好。
w = Window.repartition('machine').orderBy('timestamp')
for i in range(max_len):
df = df.withColumn(f"log_lag_{i}", F.lag('log', i-1).over(w))
如果使用Pandas 来处理这个问题,我将不胜感激,我已经尝试了很长时间,但失败了。
谢谢!
【问题讨论】:
标签: python pandas data-preprocessing