当我的颤抖的手指移到按钮上时,一滴汗珠从我的额头流下。
我不是即将发射核弹的陆军上将,也不是 SpaceX 即将把火箭送入太空的指挥官。
我只是一名商业智能分析师,正在将数据模型更改合并到生产环境中。然而,我猜想我们的压力水平不相上下。
当然,我有些夸张了。
但是,任何从事数据专业工作足够长时间的人都知道,对现有模型进行更改是多么令人紧张。特别是,如果您曾发布过导致不准确、错误数据或错误结论的更改。
在进行数据模型更改时避免失去数据信任
作为一名数据分析师,没有什么比利益相关者发现生产环境中的数据不准确更糟糕的了。
看着他们对您的数据失去信任,这是我最不希望发生在我的死对头身上的事情。这就是为什么您可能总是会仔细核对数据,甚至希望运行自动化测试,以确保没有重大错误悄悄溜入。
确保您的数据模型更改是正确的
但很多时候,您可能仍然会感到挥之不去的焦虑,担心自己遗漏了什么。
幸运的是,简单的解决方案是在数据模型更改中比较旧版本和新版本
这是我们在 Infused Insight 采纳的众多政策之一,该公司旨在帮助使用 Infusionsoft 的企业通过数据洞察获得更多潜在客户和销售额。这个解决方案非常有帮助。
我们第一次应用此政策时就发现了数据中意外的更改。自那以后,它一次又一次地证明了其巨大的实用性。
理论上,这个解决方案很简单
在更改模型的查询后,分析师应该写下他们预期结果数据会如何变化的假设,例如:
“之前为空的广告行动号召 URL,现在应该包含有效的 URL。”
接下来,他们应该对旧查询和新查询的结果进行比较,以比较所有列值,并检测所有新增和删除的行。
然后,他们检查是否只将预期更改应用到了数据。这似乎是一项非常常见的任务,并且应该有大量的工具(最好是开源的)可以实现它。
选择正确的工具来支持您的数据模型更改
现实情况却大相径庭。
有一些工具可以完全满足我的需求,并提供了用户友好的界面,但它们是闭源的、相当昂贵,而且最重要的是,它们只适用于 Windows 系统。
我们最终的解决方案是创建一个 Jupyter Notebook,它使用 Python、pandas 和 datacompy 来比较表的旧版本和新版本。您可以将其用于任何支持 pandas 的数据库,甚至 CSV 文件。
结果是一个 .txt 文件,包含更改摘要,以及一个 SQLite 数据库,您可以在其中详细查询所有已更改的列和行。
SQLite 数据如下所示
在截图中,您可以看到对 rows_with_differences 表的查询。此表包含发现两个版本之间存在差异的所有行。
对于确实有更改的列(例如 cta_link 列),您会得到三个列(_match、_df1 和 _df2),它们让您可以看到更改内容并轻松筛选数据。但是,在所有行中都没有更改的列(例如 ad_name 和 ad_status)则没有这些附加列。
通过这种方式,您可以一目了然地看到哪些内容发生了变化,还可以将更改后的数据与该行的其余数据结合起来理解。
我已将代码作为 Jupyter notebook 发布到 GitHub 上,您可以按照以下步骤学习。
如何对您的数据模型更改进行相同类型的比较
首先,您需要下载代码并安装 Python 依赖项。
git clone git@github.com: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 notebook 后,您需要调整设置。
该解决方案使用 Python 的 SQLAlchemy 模块从 SQL 数据库加载数据,然后使用 pandas 和 datacompy 进行比较,最后将结果写入 SQLite 数据库。
因此,第一步是配置 SQL 数据库设置和 SQLAlchemy 连接字符串。
在上面的示例中,它配置为连接到 MS SQL Server,但您可以将其更改为 SQLAlchemy 支持的任何数据库。
您可以参考他们的数据库 URL 文档以获取更多详细信息。
之后,您可以在第二个 Jupyter 单元格中开始比较。
只需调整设置并运行即可。
您将在 ./comparison/ 目录中找到包含更改的结果报告和 SQLite 数据库。
结论:数据模型更改
我希望这个简单的解决方案能帮助您避免错误,并让您有信心改进现有模型,而无需担心破坏任何东西。