mysql pd.merge_记一次百行级sql的拆解和分析 附心得体会

最近一直在想做关于SQL的应用案例,这周刚好看到Github上关于天池算法大赛上,菜鸟需求预测与分仓分析,看了【队名:左手诗句,右手数据】排名第一的数据处理过程,受益良多,想着把自己的拆解过程写下来,供初学者一起参考学习。

​这个sql有340行,26KB。有兴趣的同学可以在我的文章《菜鸟需要与分仓分析SQL语句》中进行查看。

表1:标签

我们先捋一下整个SQL的结构,其中left outer join为表与表的连接语句,把表分成以下几个部分。

表2-15:最近1天--最近14天

表16:item_id为首列,非聚划算的最大,最小,标准差。

表17:item_id为首列,连接起以下各个类型特征

表18:叶子类特征

表19:大类目特征

表20:品牌特征

表21:供应商ID特征

特别要说的是表21最后这个 k on(a.item_id=k.item_id),连接起了表17到表21,非常重要。

总结:

一:由于我用pandas较多,从没想过mysql还能这么用,mysql在构建特征时,很高效,我曾想着用pandas 也能做,当然,我试了,是可以,同样对一item_id进行groupby后,使用agg复合函数,就像这样:

比如调用day_1的数据:

我们能看到,即使有agg的复合函数,虽然同样能实现这样的功能要求,但在列的命名上,不够灵活。如果每次执行的列名都是变化的,比如这里,反复的对列进行sum(),mean(),还要求列名重命名,即使可以使用(lambda:x+"_1" for x in columns)但调用14次,但也是非常低效的,而mysql一句 select sum(pv_uv)as pv_uv_sum,非常灵活。

二:另外一点,对两个表以上的聚合,merge,concat有了更深的理解,比如这里

pd.concat()可以对多个dateframe进行聚合,但它只能选择对axis=0或者axis=1 也就是按列或者按行,进行聚合。

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,

keys=None, levels=None, names=None, verify_integrity=False)

参数说明

​objs: series,dataframe或者是panel构成的序列lsit

axis:需要合并链接的轴,0是行,1是列

join:连接的方式 inner,或者outer

它没有可以选择聚合的关键连接列,即缺少on这个关键列。

而pd.merge(),是可以选择聚合的关键连接列

pd.merge(left, right, how=’inner’, on=None, left_on=None,

right_on=None, left_index=False, right_index=False, sort=False,

suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)

所以,结论是,如果两个表的结构相同,而且是只想做上下的叠加,或者左右的叠加,对index列没有要求删除,那么可以用concat,但如果是两个表之间的join,用pd.merge()。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值