当我颤抖的手指在按钮上移动时,额头上渗出一滴汗珠。
我不是即将发射核弹的军队总司令,也不是即将将火箭射入太空的Space X指挥官。
我只是一个正在将数据模型变更合并到生产中的商业智能分析师。然而,我想我们的压力水平是相当的。
当然,我在夸张。
但任何在数据行业工作过一段时间的人都知道,对现有模型进行更改有多么紧张。尤其是,如果你曾经发布了一个导致不准确、糟糕数据或错误结论的变更。
在更改数据模型时,避免失去对数据的信任
作为一个数据分析师,没有什么比利益相关者注意到生产中的数据不准确更糟糕的了。
看到他们对你数据的信任丧失,是我最不愿意看到的事情。这就是为什么你可能总是要仔细检查数据,甚至运行自动化测试以确保没有重大错误遗漏。
确保你的数据模型变更正确
但很多时候,你仍然可能会感到焦虑和担心,害怕自己遗漏了什么。
幸运的是,简单的解决方案就是比较数据模型变更中的新旧版本
这是我们采用的许多政策之一,以确保在Infused Insight保持数据质量和准确性的持续高水平,一个帮助使用Infusionsoft的企业通过数据洞察获得更多潜在客户和销售的公司。这个解决方案非常有帮助。
第一次应用这个政策时,我们就注意到数据出现了意料之外的变化。从那时起,它一直证明非常有用。
在理论上,解决方案很简单
在更改模型查询后,分析师应该写下他们预计结果数据将如何变化的假设,例如
“之前为NULL的广告的号召性用语URL现在应该包含一个有效的URL。”
接下来,他们应该对旧查询和新查询的结果进行对比,比较所有列值以及检测所有新和删除的行。
然后,他们检查是否只应用了预期的变更到数据。这似乎是一个非常常见的任务,应该有很多工具(最好是开源的)可以实现这一点。
选择正确的工具来支持你的数据模型变更
但现实情况并不一样。
有几个工具可以做到我想要的一切,并且提供了用户友好的UI,但它们是闭源的,相当昂贵,最重要的是,只在Windows上可用。
我们的最终解决方案是创建一个使用python、pandas和datacompy比较表新旧版本的Jupyter笔记本。你可以用它来与任何由pandas支持的数据库一起使用,甚至可以与CSV文件一起使用。
结果是包含变更总结的.txt文件以及一个SQLite数据库,允许你详细查询所有变更的列和行。
SQLite数据看起来像这样
在截图中,你可以看到一个对rows_with_differences表的查询。这个表包括在两个版本之间找到差异的所有行。
对于确实有变更的列(如cta_link列),你将得到三个列(_match、_df1和_df2),让你看到变更内容并轻松过滤数据。但没有变更的列(如ad_name和ad_status)则没有这些额外的列。
这样你就可以一目了然地看到发生了什么变更,同时也可以将变更数据与该行的其余数据放在一起进行上下文分析。
我已经将代码作为github上的Jupyter笔记本发布,你可以在下面跟随学习。
如何对你的数据模型变更进行相同类型的比较
首先,你需要下载代码并安装python依赖项。
git clone [email protected]:Infused-Insight/sql_data_compare.git
cd sql_data_compare
pip install -r requirements.txt
接下来,你将想要打开data_compare.ipynb文件。你可以使用jupyter服务器打开它……
jupyter notebook data_compare.ipynb
或者你可以下载VSCode并在那里运行它。这是我首选的方法。一旦你打开了jupyter笔记本,你需要调整设置。
该解决方案使用python的SQLAlchemy模块从SQL数据库加载数据,然后使用pandas和datacompy进行比较,最后将结果写入SQLite数据库。
所以第一步是配置SQL数据库设置和SQLAlchemy连接字符串。
在上面的示例中,它配置为连接到MS SQL服务器,但你可以将其更改为SQLAlchemy支持的任何数据库。
您可以参考他们的数据库URL文档以获取更多详细信息。
之后,您可以在第二个jupyter单元中进行比较。
只需调整设置并运行即可。
您将在./comparison/
目录中找到更改后的结果报告和SQLite数据库。
结论:数据模型更改
我希望这个简单的解决方案能帮助您避免错误,并让您有信心在不担心破坏任何东西的情况下改进现有模型。