将连续的浮点数转化成哑变量

图片一

图片二

应用场景:输入为图片一,其每行都有一个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')]})


辅助函数,效果:contain(1,[1,20,3,1,5,10,3])  输出 [1,0,0,1,0,0,0],即第二个参数中是否包含第一个参数
def contain(x,y):
    l=[]
    for s in y:
        if x in s:
            l.append(1)
        else:
            l.append(0)
    return l


 思路 将两个时间点中的小时变量提取出来做成区间[starttime,offlinetime],然后针对每一个时间创建一个哑变量

data['detla_time'] = data['starttime'].map(lambda x:str(x.hour)) +','+ data['offlinetime'].map(lambda x:str(x.hour))

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函数进行重排。

这种方法相比于上面的方法比较容易理解,但是需要循环一次数据,在这个数据量普遍相当大的时代不太合适,但如果你要想对每一行创造更加复杂的特征,那可能就不得不对数据进行循环了吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值