当我的手指颤抖着移到按钮上时,一滴汗水从我的额头流了下来。
我不是即将发射核弹的陆军将军,也不是 Space X 中即将向太空发射火箭的指挥官。
我只是一位商业智能分析师,正在将数据模型更改合并到生产环境中。然而,我猜想我们的压力水平是相当的。
当然,我是在夸大其词。
但是,任何从事数据专业工作足够长时间的人都知道,更改现有模型会带来多大的压力。特别是,如果您曾经发布过导致不准确、错误数据或错误结论的更改。
在进行数据模型更改时,避免失去对数据的信任
作为一名数据分析师,最糟糕的事情莫过于利益相关者注意到生产环境中的数据不准确。
看到他们失去对您的数据的信任,是我最不希望发生在敌人身上的事情。这就是为什么您可能总是仔细检查数据,甚至运行自动化测试,以确保没有潜入重大错误。
确保您的数据模型更改正确
但是,您可能仍然经常感到挥之不去的焦虑和担忧,担心自己遗漏了某些东西。
幸运的是,简单的解决方案是在数据模型更改中比较新旧版本
这是我们在 Infused Insight 采用的众多政策之一,旨在确保始终如一的高质量和准确的数据。Infused Insight 是一家帮助使用 Infusionsoft 的企业通过数据洞察获得更多潜在客户和销售额的公司。事实证明,这个解决方案非常有帮助。
在我们应用此政策的第一次,我们就注意到数据中存在意外更改。此后,它一次又一次地被证明非常有用。
从理论上讲,解决方案很简单
在更改模型的查询后,分析师应写下他们期望结果数据如何更改的假设,例如
“以前为 NULL 的广告号召性用语 URL 现在应包含有效的 URL。”
接下来,他们应该对新旧查询的结果运行比较,该比较会比较所有列值,并检测所有新的和已删除的行。
然后,他们检查是否只有预期的更改应用于数据。看起来这似乎是一项非常常见的任务,并且应该有很多工具(最好是开源工具)可以实现它。
选择正确的工具来支持您的数据模型更改
现实情况看起来有所不同。
有一些工具可以完全满足我的需求并提供用户友好的 UI,但它们是闭源的,相当昂贵,而且最重要的是,仅在 Windows 上可用。
我们的最终解决方案是创建一个 Jupyter 笔记本,该笔记本使用 python、pandas 和 datacompy 来比较表的旧版本和新版本。您可以将其与 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 数据库。
结论:数据模型更改
我希望这个简单的解决方案能帮助您避免错误,并让您有信心改进现有模型,而不用担心破坏某些东西。