图片一
图片二
应用场景:输入为图片一,其中每行都有一个starttime(上线时间)和offlinetime(下线时间)
要求:输出图片二,即创造24个哑变量,其中在线的时间输出特征为1,不在线的时间输出为0。
备注:python 中pandas所带的get_dummies会将整个时间作为一个字符串变量,即只能在头和尾形成哑变量,无法在中间插入数值,为了解决这个问题所以才有了现在这篇博客。
随意创建两个数据的代码
data=pd.DataFrame({'starttime':[pd.to_datetime('2018.1.10 10:00:00'),pd.to_datetime('2018.1.10 8:00:00')],'offlinetime':[pd.to_datetime('2018.1.10 12:00:00'),pd.to_datetime('2018.1.10 14:00:00')]})
l=[]
for s in y:
if x in s:
l.append(1)
else:
l.append(0)
return l
data['detla_time_range'] = data['detla_time'].map(lambda x: range(int(x.split(',')[0]),int(x.split(',')[1])+1,1))
for i in range(1,25,1):
data['在',i,'点是否在线'] = contain(i,data.detla_time_range)效果如图片二
感觉内容不是很多,那写一个如果允许直接游历整个数据的方法,思路如下:
同样针对每个样本创建在线时间,然后将其在线时间输出成字典,再做成稀疏的DataFrame,最后用0填充即可。
out_data=[]
for index,rows in data.iterrows():
out = {}
online_time = range(rows['starttime'].hour,rows['offlinetime'].hour,1)
for i in online_time:
out[str(i)+'点在线'] = 1
out_data.append(out)
out_data = pd.DataFrame(out_data).fillna(0)
效果图
由于字典本身的无序性,导致最后的dataframe列有点难看,可以用pd.DataFrame.reindex函数进行重排。
这种方法相比于上面的方法比较容易理解,但是需要循环一次数据,在这个数据量普遍相当大的时代不太合适,但如果你要想对每一行创造更加复杂的特征,那可能就不得不对数据进行循环了吧。