在机器学习中,特征工程是一个非常重要的环节,特征的好坏直接影响模型的效果。
除了用SQL开发一些简单的单值特征,比如每家店铺的流量,每家店铺的销量,这种单维的特征非常常见。
在实际工作中,还会有开发一些复杂特征的需求,常见的比如每家店铺在每个城市的广告投入,每家店在每个城市的产出,这里的投入产出指标会需要统计在店铺、城市两个维度下的值。
这种情况用怎么实现呢?
1. 用SQL拼出你想要的json串
- 优点:借助SQL内置功能,查询速度快,效率高
- 缺点:一次可能只能开发出一个特征值
2.用python或其他语言查询SQL结果
- 优点:编程语言对于list,set,json操作灵活
- 缺点:需要for循环,效率低
尤其是这些特征还要上调度,每天都要跑数据,在计算资源与时间的取舍后,优先选择通过SQL来实现。
实现步骤:
1.第一个group by 计算结果
2. 第二个group by拼接结果
需要掌握4个函数的用法:
- concat()函数
一 concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
3、语法:concat(str1, seperator,str2,seperator,…)
返回结果为连接参数产生的字符串并且有分隔符,如果有任何一个参数为null,则返回值为null。
- concat_ws() 函数
1.功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)
2.语法:concat_ws(separator, str1, str2, …)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
- collect_set() 函数
1.功能:group by进行分组后,将每行的数据给连接起来,加入到一个set()中
2.语法:collect_set (str)
说明:满足set集合属性,其元素值不重复
- collect_list() 函数
1.功能:group by进行分组后,将每行的数据连接起来,加入到一个list()中
2.语法:collect_list (str)
说明:满足list属性,将数据按顺序加入并存储,可以存储重复元素
完整代码如下所示:
insert into tmp.dwb_p_cust_feature_manage_dd
select mobile_no,
'prov_cnt_1m_p_cust_manage',
concat("{",concat_ws(",",collect_list(concat('"',temp.prov,'":',temp.prov_cnt_1m))),"}") as prov_cnt_1m_p_cust_manage,
from_unixtime(unix_timestamp())
from
(select
mobile_no,
r1.region_name as prov,
sum(case when r1.region_name is not null and DateDiff(from_unixtime(unix_timestamp()), c.created_time) <= 30 then 1 else 0 end) as prov_cnt_1m
from
dcs.nt_tp_p_customers c
left join dcs.nt_bb_dealers d on c.dealer_id = d.dealer_id
left join dcs.nt_bb_regions r1 on d.province = r1.region_id and r1.is_inactive=0
where
DateDiff(from_unixtime(unix_timestamp()),
c.created_time) <= 30
group by
mobile_no,
r1.region_name)temp
group by temp.mobile_no;
最终结果如下所示:
很棒是不是!
👏👏👏再看看我们以前的文章😃😃😃
🌺 Excel中数据分析工具库-相关系数篇
🌺 干货,手把手教会你做相关性分析
🌺 5年数据分析路,小结。
🌺 用户细分及画像分析
🌺 K-近邻算法及实践
欢迎关注,微信公众号“数据分析师之家”
扫描二维码 关注我们
💁提供职业规划、简历指导、面试辅导服务哦
QQ交流群:254674155