1、初次清洗,DataFrame中存在数值型字段和非数字型字段技巧
1)将训练集和测试集数据进行合并,统一处理
dataset=pd.concat([train_data,test_data],axis=0)
2)识别数值型字段和非数值型字段
number_feats = dataset.dtypes[dataset.dtypes != "object"].index
object_feats = dataset.dtypes[adataset.dtypes == "object"].index
number_feats返回数值型字段列表,object_feats返回字符串型字段列表
3)对于数值型进行归一化操作、对于非数值型进行one-hot处理、空缺值填充
对于数值型采用Z-score归一化处理,代码如下:
dataset[number_feats] = dataset[number_feats].apply(lambda x: (x - x.mean()) / (x.std()))
技巧如下:
(1)对于多个列执行相同的操作:dataset[待处理的列].apply(lambda x: 关于x的函数)
(2)处理后直接在原始DataFrame中赋值操作:dataset[待处理的列]=dataset[待处理的列].apply(labbda x :关于x的函数)
对于存在非数值型的dataframe进行one-hot处理,上面的数值型操作和下面的非数值型操作可以前后操作处理,代码如下
dataframe = pd.get_dummies(dataframe, prefix=object_feats, dummy_na=True)
其中,函数使用pd.get_dummies(dataframe,prefix=one-hot命名的前缀,dummy_na=True), dummy_na 后面True表示字段增加一列表示空缺值,默认是以列为对象的,
空值填充,以上两步分别做完,然后进行最后空缺值填充,保证数据完整性、可用性。
dataframe = dataframe.fillna(dataframe.mean())
4)tensor数据类型改变形状的一种方法
tensor数据矩阵.squeeze():对于tensor数据矩阵去掉维度为1的。
tensor数据矩阵.unsqueeze(数值):对于tensor数据矩阵增加维度为1的,具体在那个位置加入,需要依据设定的数值,该数值表示设定的位置。
5)ndarray转化成tensor形式
train_features = torch.from_numpy(train_features).cuda()
6)TensorDataset函数类似于一个压缩的过程,将第一维度一致的两个tensor矩阵压缩到一起,此处将数据集和对应标签压缩到一块。
train_set = TensorDataset(train_features,train_labels)
7)可以实现对于压缩好的数据进行分割成多个batch_size快循环训练,类似于构建多个子数据集的过程实现数据的训练训练
#定义迭代器
train_data = DataLoader(dataset=train_set,batch_size=64,shuffle=True)
8)卷积神经网络的实现过程
class CNN(nn.Module):
2 def __init__(self):
3 super(CNN, self).__init__()
4 self.conv1 = nn.Sequential( #input shape (1,28,28)
5 nn.Conv2d(in_channels=1, #input height
6 out_channels=16, #n_filter
7 kernel_size=5, #filter size
8 stride=1, #filter step
9 padding=2 #con2d出来的图片大小不变
10 ), #output shape (16,28,28)
11 nn.ReLU(),
12 nn.MaxPool2d(kernel_size=2) #2x2采样,output shape (16,14,14)
13
14 )
15 self.conv2 = nn.Sequential(nn.Conv2d(16, 32, 5, 1, 2), #output shape (32,7,7)
16 nn.ReLU(),
17 nn.MaxPool2d(2))
18 self.out = nn.Linear(32*7*7,10)
19
20 def forward(self, x):
21 x = self.conv1(x)
22 x = self.conv2(x)
23 x = x.view(x.size(0), -1) #flat (batch_size, 32*7*7)
24 output = self.out(x)
25 return output
1、时间戳的获取
1)将字符串转化成时间戳格式
t1=pd.DatetimeIndex(['2017/8/1','2018/8/2','2018/8/3','2018/8/4/','2018/8/5'])
print(t1,type(t1))
获取时间戳中的天字段
t1=pd.DatetimeIndex(['2017/8/1','2018/8/2','2018/8/3','2018/8/4/','2018/8/5']).day
print(t1,type(t1))
获取时间戳中的月字段
t1=pd.DatetimeIndex(['2017/8/1','2018/8/2','2018/8/3','2018/8/4/','2018/8/5']).month
print(t1,type(t1))
获取时间戳中的年字段
t1=pd.DatetimeIndex(['2017/8/1','2018/8/2','2018/8/3','2018/8/4/','2018/8/5']).year
print(t1,type(t1))
2)获取选定额起点时间、终止时间的连续时间序列,默认是按天更新
t1=pd.date_range('2017/1/4','2017/1/9',normalize=True)
print(t1)
DatetimeIndex(['2017-01-04', '2017-01-05', '2017-01-06', '2017-01-07',
'2017-01-08', '2017-01-09'],
dtype='datetime64[ns]', freq='D')
3)设定起始时间和往后更新多少天数,计算需要的时间
periods:表示时间日期,从start开始往后或end往前生成n天
t2=pd.date_range('2017/1/4',periods=10)
print(t2)
DatetimeIndex(['2017-01-04', '2017-01-05', '2017-01-06', '2017-01-07',
'2017-01-08', '2017-01-09', '2017-01-10', '2017-01-11',
'2017-01-12', '2017-01-13'],
dtype='datetime64[ns]', freq='D')
4)根据获取的起始时间和更新天数,同时加入往后推的天数
增加时分秒:
t3=pd.date_range('2017/1/4 15:30:00',periods=10)
print(t3)
DatetimeIndex(['2017-01-04 15:30:00', '2017-01-05 15:30:00',
'2017-01-06 15:30:00', '2017-01-07 15:30:00',
'2017-01-08 15:30:00', '2017-01-09 15:30:00',
'2017-01-10 15:30:00', '2017-01-11 15:30:00',
'2017-01-12 15:30:00', '2017-01-13 15:30:00'],
dtype='datetime64[ns]', freq='D')