用于在笔记本之间简单、有序、压缩和加密存储文件的IPython魔法
项目描述
IPython数据保险库
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),
- 同时在单元格元数据中提供更多详细信息
- 促进存储在纯文本文件中使用DataFrame
- 允许在执行后跟踪修改后的代码实例
安全性
- 将其视为在意外
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e8f2931e776ccb94b8585548d697b366f37e269a5d1b49dbb6efe47926da8916 |
|
MD5 | abe384472b6fa446d49a88353895fe8f |
|
BLAKE2b-256 | c40fb5d58b3bd79a5ba45726387dc73825af77f876bcf5117ea8223ad5de52e2 |