前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【重磅来袭】在Power BI 中使用Python(4)——PQ数据导出&写回SQL

【重磅来袭】在Power BI 中使用Python(4)——PQ数据导出&写回SQL

作者头像
陈学谦
发布2020-04-14 15:28:53
4.1K0
发布2020-04-14 15:28:53
举报
文章被收录于专栏:学谦数据运营

各位小伙伴们,大家好,我是学谦,咱们又见面了。

《在Power BI 中使用Python》系列的前三篇文章我们分别讲解了:

如何在Power BI中使用Python来获取数据:

【强强联合】在Power BI 中使用Python(1)

如何在Power BI中使用Python进行数据清洗:

【强强联合】在Power BI 中使用Python(2)

如何在Power BI中使用Python进行可视化呈现:

【强强联合】在Power BI 中使用Python(3)数据可视化

今天我们继续讲解第四篇——PQ数据导出与写回SQL

众所周知,Power BI对于数据的输出是有一定限制的,至少有以下两点:

1.可视化对象导出CSV格式限制3万行数据,这对于数据量动辄上百万甚至上亿的表来说是不可接受的;

2.而一直广为诟病的powerquery数据困难的问题更是一时半会也得不到解决。

那应该怎么办呢?

第一个问题,推荐使用DAX Studio,轻松导出十万、百万条记录;

第二个问题,没有现成的工具可以直接解决,但是结合本系列第二篇的内容,我们是否可以想到如何用Python将powerquery中的表输出为excel甚至实现数据回写到SQL中呢?

这就是我们今天要学习的内容:

我们在第二讲中说过:

Python的处理结果以Dataframe形式输出,M将Dataframe自动转换为Table格式。M将其Table类型的数据传递给Python,Python会自动将Table转换为Dataframe。

M将其Table类型的数据传递给Python,Python会自动将Table转换为Dataframe。那么Python中Dataframe如何输出呢?

想必了解pandas库的战友们已经想到答案了。

只要一行简单的代码:

代码语言:javascript
复制
= Python.Execute("# 'dataset' 保留此脚本的输入数据#(lf)dataset.to_excel(r""C:\Users\金石教育\Desktop\abc.xlsx"")",[dataset=源])

简单吧!

运行一下:

OK啦!

关键是:

只有一行代码!

只要一行代码!

只需一行代码!

重要的事情强调三遍!

多年来powerquery广为人们诟病的——数据清洗后无法导出结果的问题就这么被一行代码轻松地解决,美滋滋。

好了,既然知道了如何导出excel文件,那么各位,写回MySQL数据库的操作是否可以举一反三自行解决呢?

我们直接看下图的神操作:

看到了吗,mysql数据库中本来是一张空表,我们在powerquery中运行了一段Python代码后,表中有了数据。

关键代码解释:

代码语言:javascript
复制
db = pymysql.connect("localhost","用户名","密码","nc" )
#连接数据库
query = 'insert into `全球疫情_country`(id,displayName,areas,totalConfirmed,totalDeaths,totalRecovered,lastUpdated,lat,long,parentId)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
#键入数据

for r in range(len(dataset)):
    #按行获取数据
    id0=dataset.iat[r,0]
    displayName=dataset.iat[r,1]
    areas=dataset.iat[r,2]
    ……  
    values = (id0,displayName,areas,totalConfirmed,totalDeaths,totalRecovered,lastUpdated,lat,long,parentId)
    cursor.execute(query, values)

cursor.close()
db.commit()
db.close()
#提交数据并关闭数据库

获取完整源代码,请关注本公众号【学谦数据运营】,回复关键字“powerbi-python-mysql”

代码没什么难度,用的是Python的一个常用库:pymysql,将dataset中的数据按行导入MySQL中。

但是有一个大BUG一点小问题:

因为全球只有200左右个国家和地区,country层面的数据应该只有200左右。但是,我习惯性地瞥了一眼MySQL右下角,发现:

难道最近的国际局势变化这么大,已经有567个国家和地区了?不可能吧。抓紧查询一下,发现果然有问题:

全球每一个国家和地区的数据都显示了三次,567/3=189,这还差不多。

而且清空表后再刷新运行,就会发现有的时候是2次,有的时候5次,这意思就是Python代码运行了多次,造成了数据重复,这背后的原因我们无从得知。这样可不行啊,总不能每次使用的时候先去重吧,不太现实,如果有时候疏忽了就麻烦了,那该怎么办呢?

这个问题先一放,我们来看另一个问题:

每个国家的每日数据我们只保留一次,即便powerquery每次刷新只向MySQL数据库写入一次,但我们也不能保证编写模型的时候只刷新一次吧,因为一旦人工刷新多次,造成的结果和上面被动造成的结果一致,所以,只要我们解决了人工刷新造成数据重复的问题,查询刷新时被动写入多次的问题也就顺带解决了。

我们看一下数据,有一列“lastupdated”,是时间格式,也就是查询的时间,由于我们只关心日期数据,因此只取出日期就可以。所以只要每次写回MySQL之前,先判断一下数据库中是否已经存在当日的数据,如果有,就先删除,再将新的数据写入,这样就达到我们的目的了。

添加以下代码:

代码语言:javascript
复制
#添加一列日期
dataset.insert(loc=10,column="updateday",value=dataset["lastUpdated"].str[0:10])

#获取日期
today_date=dataset.iat[0,10]

#删除当日的已有数据
query_delete='DELETE FROM `全球疫情_country` WHERE updateday='+today_date

运行一下代码:

MySQL数据库的表中初始有378条数据(因为包含了3月27日和3月28日两天的数据,共189个国家和地区的数据),运行代码后,仍然是378条,之前已有的3月28日的数据被删除,然后添加了刚刚查询到的最新数据。

完美解决!

好了,写回MySQL数据库的全部操作和遇到的问题与解决措施到这里就讲解完毕了。你学会了吗?

写这篇文章的时候不知道怎么的,远程计算机的MySQL数据库总是出问题,导致我这边文章前前后后写了五六个小时。

本节内容细节的点特别多,大家一定要自己动手操作几遍,后续我会逐步安排相关的视频讲解,大家请注意关注公众号,跟上队伍。


以下仍然是下期预告环节:

下一篇我们将继续介绍一个重磅功能——数据条件触发预警并邮件通知

说到数据预警,微软自家的Flow可以设置预警条件并发送邮件,这是原生功能,有兴趣的朋友可以去了解。


感谢您对【学谦数据运营】公众号的关注、支持与厚爱,如果本文对您有用,请不要吝惜您的点赞、转发和点亮在看,有任何问题欢迎大家在留言区询问,谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档