背景:我有一些日志,这些日志是在制造后对设备进行测试期间生成的。每个设备都有一个序列号和一个包含所有数据的相应csv日志文件。像这样的东西。
DATE,TESTSTEP,READING,LIMIT,RESULT
01/01/2019 07:37:17.432 AM,1,23,10,FAIL
01/01/2019 07:37:23.661 AM,2,3,3,PASS
因此,有许多此类日志文件。每个都有测试数据。 我有在现场失败的设备的序列号。我想使用这些日志文件创建一个模型。然后使用它来预测给定设备是否有机会在给定其日志文件的字段中失败。
到目前为止,作为学习的一部分,我一直在处理房价等数据。每行都是完整的。根据面积,房间数等,很容易定义预期售价的模型。
在这里,我很想找到一种方法以某种方式将所有原木平整成一行。 我正在考虑类似的东西:
DATE_1,TESTSTEP_1,READING_1,LIMIT_1,RESULT_1,DATE_2,TESTSTEP_2,READING_2,LIMIT_2,RESULT_2
1/1/2019 07:37:17.432 AM,1,23,10,FAIL,01/01/2019 07:37:23.661 AM,2,3,3,PASS
第一个问题是,我不确定这是否是处理此类数据的正确方法。如果是这样,那么请提供一些指示。
如果这是正确的方法,那么Pandas是否对此有任何内置支持?
我将使用scikit-learn创建模型。
答案 0 :(得分:1)
首先将列转换为与输出中的列顺序相同的有序CategoricalIndex
,将to_datetime
转换为DATE
列,然后用Series.dt.date
将cumcount
转换为日期时间}作为计数器,通过set_index
创建MultiIndex
,通过unstack
重塑形状,并通过sort_index
对MultiIndex in columns
的第二级进行排序。最后用reset_index
用list comprehension
对其进行展平:
df['DATE'] = pd.to_datetime(df['DATE'])
dates = df['DATE'].dt.date
df.columns = pd.CategoricalIndex(df.columns,categories=df.columns, ordered=True)
g = df.groupby(dates).cumcount().add(1)
df = df.set_index([dates, g]).unstack().sort_index(axis=1, level=1)
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index(drop=True)
print (df)
DATE_1 TESTSTEP_1 READING_1 LIMIT_1 RESULT_1 \
0 2019-01-01 07:37:17.432 1 23 10 FAIL
DATE_2 TESTSTEP_2 READING_2 LIMIT_2 RESULT_2
0 2019-01-01 07:37:23.661 2 3 3 PASS
如果还需要在单独的第一列中date
:
df['DATE'] = pd.to_datetime(df['DATE'])
dates = df['DATE'].dt.date
df.columns = pd.CategoricalIndex(df.columns,categories=df.columns, ordered=True)
g = df.groupby(dates).cumcount().add(1)
df = df.set_index([dates.rename('DAT'), g]).unstack().sort_index(axis=1, level=1)
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
print (df)
DAT DATE_1 TESTSTEP_1 READING_1 LIMIT_1 RESULT_1 \
0 2019-01-01 2019-01-01 07:37:17.432 1 23 10 FAIL
DATE_2 TESTSTEP_2 READING_2 LIMIT_2 RESULT_2
0 2019-01-01 07:37:23.661 2 3 3 PASS