SQL-On-Pandas加速数据科学
1. 背景
Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
在工作中经常操作数据表会有这样一种感受,在某些具体的统计分析等场景下是pandas比较高效,但是在快速迭代的业务场景下,pandas的代码重构和数据分析就显得繁琐了,而且代码的可读性没有SQL好。基于这样的需求,萌生了将SQL和pandas相结合的想法,即用写SQL代码,将SQL转成pandas的语法然后执行得到结果。如果直接用数据库作为存储用SQL重构,不仅工作量大,而且有些业务逻辑的函数是SQL无法实现的,这也是为什么要以pandas为基础,经SQL转成pandas执行,而不是反过来,将pandas dataframe导入到数据库用SQL重构。
SQL与pandas语法哪个简洁,我们看如下比较,功能都是实现子集的操作:
-- sql
update table1 set age=score+levels where id>=5
-- sql
update table1 a set a.age=b.age+2 join table2 b on a.id=b.id where a.age>2 and b.age<10
# pandas
table1.loc[table1['id']>5,'age']=table1.loc[table1['id']>5,'score']+table1.loc[table1['id']>5,'levels]
# pandas
table2.rename(columns={'id':'id2','age':age2'}, inplace=True)
table1=pd.merge(left=table1, right=table2[['id2','age2']], left_on='id',right_on='id2', how='inner')
loc=table1['age']>2 & table1['age2']<10
table1.loc[loc, 'age']=table1.loc['age2']+2
感受下上面实现同样的功能,但是代码量完全不同,特别是第二种情况,明显是SQL