以下是前文的代码,集合在这里
In [9]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
train = pd.read_csv('D:/RUL/CMAPSSData/train_FD001.txt', parse_dates=False, delimiter=" ", decimal=".", header=None)
test = pd.read_csv('D:/RUL/CMAPSSData/test_FD001.txt', parse_dates=False, delimiter=" ", decimal=".", header=None)
RUL = pd.read_csv('D:/RUL/CMAPSSData/RUL_FD001.txt', parse_dates=False, delimiter=" ", decimal=".", header=None)
table_NaN = pd.concat([train.isnull().sum(), test.isnull().sum()], axis=1)
table_NaN.columns = ['train', 'test']
#清理无用列
train.drop(train.columns[[-1,-2]], axis=1, inplace=True)
test.drop(test.columns[[-1,-2]], axis=1, inplace=True)
RUL.drop(RUL.columns[[-1,-1]], axis=1, inplace=True)
#命名表头
cols = ['unit', 'cycles', 'op_setting1', 'op_setting2', 'op_setting3', 's1', 's2', 's3', 's4', 's5',
's6', 's7', 's8', 's9', 's10', 's11', 's12', 's13', 's14', 's15', 's16', 's17', 's18', 's19', 's20', 's21']
train.columns = cols
test.columns = cols
由于数据中可能存在一些值,和主要数据分布的值相去甚远,就像在比赛中要去除一个最低分和一个最高分一样,我们也要清理掉数据集中的极限值。
In [10]:
train.describe().transpose()
Out[10]:
观察上面的数据,我们会发现,有些数据与别的数据很不一样,比如说S16传感器,最大最小值都是0.0300,并且标准方差为0,这种数据被称为平线,意味着传感器可能发生了故障。其它传感器如S1、S5、S10、S16、S19以及op_setting 3,数据都为平线,所以这些数据需要从数据集中清理掉。清理掉极端值后,我们通过直方图来直观地看下剩余的列的数据的分布:
In [11]:
train.drop(['s1', 's5', 's10', 's16', 's18', 's19', 'op_setting3'], axis=1, inplace=True)
test.drop(['s1', 's5', 's10', 's16', 's18', 's19', 'op_setting3'], axis=1, inplace=True)
train.hist(bins=50, figsize=(18,16))
plt.show()
通过直方图,我们能够直观地观察引擎的数据。但是,到目前为止,我们对于每个传感的最长使用寿命一无所知,只有在有一个大致的期望的情况下,才能够对数据的推演结果及过程保持乐观。
In [12]:
cyclestrain = train.groupby('unit', as_index=False)['cycles'].max()
cyclestest = test.groupby('unit', as_index=False)['cycles'].max()
fig = plt.figure(figsize = (16,12))
fig.add_subplot(1,2,1)
bar_labels = list(cyclestrain['unit'])
bars = plt.bar(list(cyclestrain['unit']), cyclestrain['cycles'], color='red')
plt.ylim([0, 400])
plt.xlabel('Units', fontsize=16)
plt.ylabel('Max. Cycles', fontsize=16)
plt.title('Max. Cycles per unit in trainset', fontsize=16)
plt.xticks(np.arange(min(bar_labels)-1, max(bar_labels)-1, 5.0), fontsize=12)
plt.yticks(fontsize=12)
fig.add_subplot(1,2,2)
bars = plt.bar(list(cyclestest['unit']), cyclestest['cycles'], color='grey')
plt.ylim([0, 400])
plt.xlabel('Units', fontsize=16)
plt.ylabel('Max. Cycles', fontsize=16)
plt.title('Max. Cycles per unit in testset', fontsize=16)
plt.xticks(np.arange(min(bar_labels)-1, max(bar_labels)-1, 5.0), fontsize=12)
plt.yticks(fontsize=12)
plt.show()
In [ ]: