跳转到主要内容

用于在笔记本之间简单、有序、压缩和加密存储文件的IPython魔法

项目描述

IPython数据保险库

tests CodeQL MIT License Binder DOI

IPython魔法,用于在笔记本之间简单、有序、压缩和加密存储 & 传输文件。

背景和演示

适合简单工作的正确工具

代码%vault魔法提供了一种可重复的缓存机制,用于在笔记本之间交换变量。该缓存是压缩的、持久的、安全的。

与内置的代码%store魔法不同,变量存储在可见的压缩存档中,因此可以轻松访问以进行手动检查,或供其他工具使用。

使用说明演示

让我们打开保险库(如果尚未创建,它将被创建)

%open_vault -p data/storage.zip

生成一些模拟数据集

from pandas import DataFrame
from random import choice, randint
cities = ['London', 'Delhi', 'Tokyo', 'Lagos', 'Warsaw', 'Chongqing']
salaries = DataFrame([
    {'salary': randint(0, 100), 'city': choice(cities)}
    for i in range(10000)
])

将变量存储在模块中

并将其存储在保险库中

%vault store salaries in datasets

存储工资(None → 40CA7812)于2019年12月8日星期日 11:58

默认情况下会打印出简短描述(包括CRC32哈希和时间戳),但可以通过向%open_vault魔法传递--timestamp False来禁用。更多信息,增强可重复性,存储在单元格元数据中。

从模块中导入变量

现在可以在另一个(或同一个)笔记本中加载存储的DataFrame

%vault import salaries from datasets

导入工资(40CA7812)于2019年12月8日星期日 12:02

通过(可选的)内存优化,我们节省了一些RAM(相比未优化的pd.read_csv()结果为87%)。要跟踪节省了多少MB,请使用--report_memory_gain设置,该设置将在导入后显示内存优化结果,例如

内存使用减少了87.28%,从0.79MB到0.10MB。

将变量导入为其他类型

如果我们已经有了工资变量,我们可以使用as,就像在Python导入系统中一样。

%vault import salaries from datasets as salaries_dataset

使用自定义函数存储或导入

from pandas import read_csv
to_csv = lambda df: df.to_csv()
%vault store salaries in datasets with to_csv as salaries_csv
%vault import salaries_csv from datasets with read_csv

导入任意文件

from pandas import read_excel
%vault import 'cars.xlsx' as cars_dataset with read_excel

更多示例可在Examples.ipynb笔记本中找到,该笔记本可以在浏览器中交互式运行

目标

语法

  • 用简单语言容易理解(尽可能避免缩写),
  • 同时对于Python开发者来说直观,
  • ...但足够不同,以至于不会与Python结构混淆
    • 例如,我们可能有一个%from x import y,但这看起来非常像正常的Python;使用%vault from x import y可以使其足够容易区分
  • 避免使用星号导入,因此不支持
  • 因为如果有多个,导入可能令人困惑

可重复性

  • 促进良好的可重复和可追踪的文件组织
    • 促进存储在纯文本文件中使用DataFrame

      冻结通常是一个简单的解决方案,但它可能在原型设计阶段引起有害的问题(笔记本通常用于此目的):如果您冻结对象,然后更改类定义并尝试再次加载数据,您很可能会严重失败;这就是为什么在这个包中默认选项是纯文本文件(但也支持冻结)!

    • 打印出简短的哈希和可读的日期时间(始终为UTC),
    • 同时在单元格元数据中提供更多详细信息
  • 允许在执行后跟踪修改后的代码实例

安全性

  • 将其视为在意外git add数据文件时最小化损害的工具(即使这些文件最初应该放在其他地方并在.gitignore中),
  • 或者,作为对已匿名数据的额外安全层,
  • 但这个工具不是旨在方便存储高度敏感的数据
  • 您必须设置密码,或显式设置--secure False来移除安全警告

功能概述

存储操作的元数据

每个操作都会打印出涉及文件的日期和时间戳以及CRC32简短校验和。操作的日期和时间以UTC时区和可读格式报告。

可以通过设置-t False--timestamp False来禁用此功能,然而为了可重复性,建议在笔记本中保留此信息可见。

更精确的信息包括SHA256校验和(具有更低的冲突概率)以及完整的日期和时间(用于检测文件写入操作中的潜在竞争条件错误),这些信息都嵌入在单元格的元数据中。您可以通过设置--metadata False来禁用此功能。

确切的命令行也存储在元数据中,这样如果您不小心修改了代码单元而未重新运行代码,可以追踪到更改。

存储

为了强制互操作性,pandas DataFrame 和 Series 对象使用纯文本文件。其他变量存储为 pickle 对象。存储存档在磁盘上的位置默认为当前目录中的 storage.zip,可以使用 %open_vault 魔法进行更改。

%open_vault -p custom_storage.zip

加密

加密不是为了作为高安全机制,而只是作为对已经匿名化数据的额外一层保护。

用于加密存储存档的密码从环境变量中检索,使用在设置期间提供的 encryption_variable 名称。

%open_vault -e ENV_STORAGE_KEY

内存优化

Pandas DataFrames 默认通过将字符串变量转换为(有序)分类列(pandas 与 R 的 factors/levels 相当)进行内存优化。将测试每个字符串列的内存改进,并且只有当它确实减少内存使用时才会应用优化。

为什么是 ZIP 而不是 HDF?

存储存档在概念上类似于分层数据格式(例如 HDF5)对象 - 它包含

  • 文件层次结构,以及
  • 元数据文件

我相信 HDF 可能是未来,但这个未来还没有到来 - 处理 HDF 文件的软件包存在许多问题,以及性能低下和压缩率低,这促使我目前仍然使用简单的 ZIP 格式。

ZIP 是一种流行的文件格式,具有已知的功能和限制 - 文件可以密码加密,而文件列表始终可访问。考虑到项目的代码假定是公开的,而存储区域中的文件假定是加密的,这可以在未经授权的访问情况下提高安全性。

由于假设 ZIP 加密的限制是众所周知的事实,因此希望更容易管理对该软件包提供的安全级别的期望。

安装和需求

先决条件

  • Python 3.6+
  • 7zip (16.02+)(有关 Ubuntu 和 Mac 命令,请参阅 下面

安装

pip3 install data_vault

安装 7zip

您可以使用来自默认存储库的 p7zip 软件包。

Ubuntu

sudo apt-get install -y p7zip-full

Mac

brew install p7zip

Windows

Windows 的安装程序可以从 7-zip 网站 下载。

Windows 不受支持,因为它存在已知问题。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

data_vault-0.4.5.tar.gz (19.0 kB 查看哈希值)

上传

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面