当前位置: 首页 > 后端技术 > Python

使用Python快速进行数据探索

时间:2023-03-26 12:31:09 Python

你在工作中是否遇到过这样的问题:接手新业务时,需要了解几十个或上百个数据库表的结构;快速生成下表。数据探索结果表如果你遇到了以上问题,恭喜你,本文可以帮你解决!1.解决思路但是有些人可能会有疑惑。用Python进行数据探索不是很简单吗?一个功能可以在几分钟内完成。需要特别介绍吗?如果你这么想,那就太简单了。你可以回想一下,当我们使用describe()函数时,默认前提是数据已经读入Python。但是大家有没有想过,在实际工作中读取数据也会成为一个问题。是的,一旦数据量级达到百万以上,Python读取数据的效率就很低了。看一张表可能要半个多小时,看几十张表差不多要一天。这种低效的方法绝对不可取。本文来源于工作实际需要。当上述方法不起作用时,我改变了主意,找到了另一种方法。具体逻辑思路如下:也就是说,为了快速检测,我们不需要读取整张表,只需要对每个表的每个字段进行分组查询即可。但是如何循环SQL查询语句呢?格式化输出字符串!2.代码实现首先我们导入相关包importpymysqlimportpandasaspdimportdatetimeasdtstart=dt.datetime.now()#为了计算程序执行时间,将数据库的连接和查询抽象成一个函数。这里我设置返回Dataframe格式数据#定义数据查询函数defsql_inquiry(sql):conn=pymysql.connect(host="localhost",port=****,user='****',passwd='****',db="test_titanic",charset="utf8")cur=conn.cursor()cur.execute(sql)result=cur.fetchall()cols=[a[0]foraincur.description]#获取字段名信息df=pd.DataFrame(result,columns=cols)conn.commit()cur.close()conn.close()returndf准备好后,我们就可以输入我们想要的表名了调查。table_name=['test','train']如果我们想获取这些表的字段名、注释、类型和行数,可以通过数据框的信息表来获取。这里要注意的是:为了方便循环,根据每个表建立一个SQL语句,所有的语句组合成一个列表。table_sql=[]foriinrange(len(table_name)):table_sql.append('''selectt1.table_nameastable_name,t1.column_nameascolumn_name,t1.column_typeascolumn_type,t1.column_commentascolumn_comment,t2.table_rowsastable_rowsfrominformation_schema.columnsast1,information_schema.`tables`ast2wheret1.table_schema=t2.table_schemaandt1.table_name=t2.table_nameandt1.table_name='{}'andt1.table_schema='test_titanic''''.format(table_name[i]))接下来就是根据SQL列表查询数据,然后继续循环遍历字段。writer=pd.ExcelWriter("table_des.xlsx")#为了导出数据table_col_name=[]row=0forjinrange(len(table_sql)):#循环表SQLtable_col_name.append(sql_inquiry(table_sql[j]))#组成一个查询每张表得到的数据框列表table_col_stat=[]col_sql=[]forsinrange(len(table_col_name[j])):#循环遍历每张表信息的字段col_sql.append('''selectmin({1})asvalue_min,max({1})asvalue_max,sum(casewhen{1}isnotnullthen1end)asnum_classification,sum(casewhen{1}isnullthennumelse0end)asnull_num,sum(num)asrows_numfrom(select{1},count(1)asnumfrom{0}groupby{1})t1'''.format(table_name[j],table_col_name[j].iloc[s,1]))#根据字段的SQL语句查询,并转化为列表col=sql_inquiry(col_sql[s]).iloc[0,:].tolist()#拼接字段名进入列表table_col_stat.append([table_col_name[j].iloc[s,1]]+col)#转换为数据框table_des=pd.DataFrame(table_col_stat,columns=["name","value_min","value_max","num_classification","null_num","rows_num"])#计算字段并将空率显示为百分比".2%"))#合并数据框table_des=pd.merge(table_col_name[j],table_des,how="inner",left_on="column_name",right_on="name")table_des.drop(["table_rows","name"],axis=1,inplace=True)#写入Excel文档table_des.to_excel(writer,startcol=1,startrow=row,index=False)row+=table_des.shape[0]+4#保存文件并计算程序时间writer.save()elapsed=(dt.datetime.now()-start)print("Timeused:",elapsed)print("\a")程序执行完毕,最后你可以快速生成上一篇中的数据探索表,即使表的量级很大,你也可以根据这些表快速了解表结构。其实代码并不复杂,难的是我们需要找到一种有效的方法来解决问题。本文仅供学习,版权归原作者所有。如有侵权,请联系删除。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。