龙空技术网

比较一下Python与Sql在数据处理分析中的应用

程序媛阿芳 234

前言:

此时各位老铁们对“sql不能实现的操作是”大体比较关注,兄弟们都需要知道一些“sql不能实现的操作是”的相关内容。那么小编同时在网摘上网罗了一些对于“sql不能实现的操作是””的相关文章,希望我们能喜欢,朋友们快快来了解一下吧!

各位老铁好,我是程序媛阿芳,来自南方一个山清水秀的地方,现在在北京中厂做一名北漂,每天要学习和处理很多事情,今天我回顾了下自己做过数据处理的一点经验,和各位分享下经验,希望更多老铁关注、转发和交流。

目前Python在数据处理分析和AI中得到了广泛应用,但Sql作为传统数据统计分析编程语言在日常数据提取分析、ETL开发和后台存储过程开发中主要用到。由于Python丰富的类库使其在数据挖掘、机器学习等方面用得十分广泛,基本将java在这一领域剔出,同时由于其自带数值科学计算Pandas和Numpy等包的特性,在数据处理分析领域也是小露锋芒,应用的越来越广,这样也与Sql有了交集。

由于目前实际工作中,开发模式的单一和循规蹈矩,另外传统上也有个误区,认为搞数仓和报表就是写Sql,只有搞机器学习和人工智能的才用Python,其实关键看是否适合和好用,择其优点用之。本篇我结合实际工作场景,尝试系统性总结分析和比较两者在数据处理分析中的应用,其中若有不当,还请各位老铁指正,也欢迎各路大咖一起加入讨论,以向更多从业者提供有价值参考。

Python是既面向对象又是过程性的语言,可以定义类和方法,数据结构也远比Sql复杂,有元素、列表、字典、元组和集合,而Sql的设计思想是一切皆关系,这个关系就是二维表(Table),由行(Row)和列(Column)组成,Sql就是围绕这个关系表组成的集合进行操作。当然Sql在存储过程中也可以定义函数,但此函数非Python函数能比,只能作为参数传入,而Python函数是可以传入对象,由于数据结构更丰富,可实现功能上要强大的多。数据处理和分析是一个基于业务实际场景需求对数据进行操作的过程,常见的有数仓的ETL(即对关系数据的抽取、合并转换和数据不同分层的载入)、指标的统计即针对数据集的聚合计算、数据的预处理即对空值的填充和异常值的剔除等。下面针对实际应用场景做一些比较分析,也希望有同样思考的志同道合者一起讨论。

集合关联操作:

数据分析需要比较和组合不同的数据集生成新的数据集,SQL中提供了大量的集合操作符支持上述需求。集合操作符支持对比性操作,可有条件连接数据集。SQL集合操作符包括UNION、UNION ALL、INTERSECT和EXCEPT(或者MINUS),INTERSECT是返回位于两个待比较的查询结果集中行,EXCEPT(或者MINUS)返回到非待比较的查询语句结果集中的行。Python中Dataframe和Series对象为二维表格数据集,通过concat等函数可实现集合关联操作。

如需要将商品购买和出售用户进行重复与并集合并,Sql示例如下:

-- SQL实现

select user_id

from data_dwd.buyers

union all

select user_id

from data_dwd.sellers

在Python中,可使用pandas.concat()函数实现上边重复合并集合操作,沿选定轴连接Dataframes或Series。

# Python实现

users = pd.concat([buyers, sellers])

上边为重复合并,要实现并集合并只需要Python中.drop_duplicates()函数对应Sql中UNION即可。如果进一步想做交集,分析既是商品买家又是卖家的用户,则Python中.merge()方法对应Sql中INTERSECT操作符就可以。

集合聚合操作:

Sql的聚合函数如sum()、avg()、count()、max()和min()等,只能用在select和group by、having子句的组合中,group by分组后聚合函数可以作用于每一个组,对每一个组的数据做一些统计。Python中DataFrame的grouby()函数+agg()函数可以实现聚合统计功能。如统计不同店铺不同产品的月销售量

#Python实现

data_set.groupby([‘date_block_num’,‘shop_id’,‘item_id’]).agg({‘item_cnt_day’:‘sum’})

总结思考:

两者的优劣如何并且在实际中怎么选择呢?Python代码实现简单,Sql则要写一大堆,如果遇到筛选很多字段的情况,则经常出现sql脚本很多行的情况,再加上后续会还有各种关联会让人看的眼花缭乱。但是Python存储数据集有内存开销,再加上目前结合Sql的Hive可以实现分布式计算,性能上是比Python强大很多的,上亿的交易表都可以实现聚合分析,这也是目前在数仓和报表数据处理分析中仍然Sql为主的重要原因。但Python不是没有可以发挥的余地,在数据量不是特别大,另外如果是Python的框架也部署在分布式环境,资源分配足够的情况下也是可以使用的,因为随着Python版本的升级,底层基本都用C++来重构实现,以解决计算时性能问题。当然这里考虑到成本和Sql已经支持的好的情况则没有必要用Python,但是如果是进一步做一些数据的治理,例如空值NAN(数据库中为null)值的填充替换或者一些校验的话,则Python更为有优势。如下图部分NAN值的替换。

Sql要实现上述功能比较麻烦,首先定位到数据问题的行,再和其它数据连接合并起来,但Python就不需要了,直接一个fillna()函数搞定。

#Python示例

data_amt = df1[3].fillna(0.0);

Python在数据处理分析真正强大之处在于可以实现Sql所不能的地方,如需要对要分组的条件归并后再对数值按照归并后的组进行聚合统计。对于归属不同门店不同小微企业所有产品月购买金额的统计,因为门店与购买企业,每个购买企业对应产品都是不确定的,无法用sql实现筛选统计,但python可以合并分组条件,计算金额,然后重新连接成一个数据集。

#Python示例

data_set2=data_set1.groupby(['date','shop_id',shop_name','corp_nm'])['prod'].apply(lambda x: '|'.join(x[:]))

data_set2=data_set2.reset_index()

data_set3=data_set1.groupby(['date','shop_id',shop_name','corp_nm'])['amt'].sum()

data_set3=data_set3.reset_index()

data_set=pd.concat([data_set2,data_set3['amt']],axis=1

此外在数据校验方面,Python可直接对数据集使用函数或自定义函数判断,不像Sql需要按条件去寻找和定位,限制了灵活发挥的空间。随着数据应用的扩展和深入和各公司基础技术开发平台的日益完善,相信在数仓数据开发和运维、数据治理和报表智能化等场景中Python会发挥越来越大的作用,Python不再是算法工程师的御用语言。

以上就是我的一点思考,我是程序媛阿芳,学院路某技校毕业后在大厂搬砖,感谢各位老铁关注,关注我公众号【码农知秋】,一起交流学习。

标签: #sql不能实现的操作是