摘要:NetCDF数据对象,提供分析包之间快速的数据传输。
项目描述
ncdata
Python中的通用NetCDF数据。
提供分析包之间的快速数据交换,并完全控制存储格式。
特别:Ncdata 尽可能高效地交换Xarray和Iris之间的数据
"无损、无需复制和延迟保存"。
这使用户可以自由混合和匹配来自两个项目的操作,获得“两者之最佳”。
import xarray
import ncdata.iris_xarray as nci
import iris.quickplot as qpltds = xarray.open_dataset(filepath)
ds_resample = ds.rolling(time=3).mean()
cubes = nci.cubes_from_xarray(ds_resample)
temp_cube = cubes.extract_cube("air_temperature")
qplt.contourf(temp_cube[0])
内容
动机
主要用途
快速高效地将Xarray和Iris对象之间的数据进行转换。
这使得用户可以在代码中混合匹配这两个包的特性。
例如
from ncdata.iris_xarray import cubes_to_xarray, cubes_from_xarray
# Apply Iris regridder to xarray data
dataset = xarray.open_dataset("file1.nc", chunks="auto")
(cube,) = cubes_from_xarray(dataset)
cube2 = cube.regrid(grid_cube, iris.analysis.PointInCell)
dataset2 = cubes_to_xarray(cube2)
# Apply Xarray statistic to Iris data
cubes = iris.load("file1.nc")
dataset = cubes_to_xarray(cubes)
dataset2 = dataset.group_by("time.dayofyear").argmin()
cubes2 = cubes_from_xarray(dataset2)
- 数据转换相当于使用一个库将数据写入文件,然后用另一个库读取它 ..
- .. 除了实际上没有写入文件
- 直接传输实数(numpy)和延迟(dask)变量数据数组,无需复制或计算
次要用途
精确控制文件格式
Ncdata也可以作为Iris或Xarray文件I/O和数据文件中存储的数据的确切格式之间的传输层。
例如,可以在将文件数据加载到Iris/Xarray之前对其进行调整;或者可以在将Iris/Xarray保存的输出写入文件之前进行调整。
这使用户能够绕过任何包在控制存储方面(如:数据分块;保留属性;缺失值处理;或维度控制)的限制。
例如
from ncdata.xarray import from_xarray
from ncdata.iris import to_iris
from ncdata.netcdf4 import to_nc4, from_nc4
# Rename a dimension in xarray output
dataset = xr.open_dataset("file1.nc")
xr_ncdata = from_xarray(dataset)
dim = xr_ncdata.dimensions.pop("dim0")
dim.name = "newdim"
xr_ncdata.dimensions["newdim"] = dim
for var in xr_ncdata.variables.values():
var.dimensions = ["newdim" if dim == "dim0" else dim for dim in var.dimensions]
to_nc4(ncdata, "file_2a.nc")
# Fix chunking in Iris input
ncdata = from_nc4("file1.nc")
for var in ncdata.variables:
# custom chunking() mimics the file chunks we want
var.chunking = lambda: (100.0e6 if dim == "dim0" else -1 for dim in var.dimensions)
cubes = to_iris(ncdata)
数据处理
Ncdata还可以用于数据提取和修改,类似于CDO和NCO命令行操作员的范围,但没有文件操作。
然而,这种用法目前尚未开发:没有内置的数据一致性检查支持,也没有显然有用的操作(如按维度索引)。这可能会在未来添加,但也是真的,许多这样的操作(如索引)可能最好使用Iris/Xarray来完成。
原则
- Ncdata将NetCDF数据表示为Python对象
- Ncdata对象可以自由操作,不受任何数据文件的限制
- Ncdata变量可以包含实数(numpy)或延迟(Dask)数组
- Ncdata可以无损地转换为和从NetCDF文件转换
- Iris或Xarray对象可以转换为和从ncdata转换,就像它们从和保存到NetCDF文件一样
- 转换 Xarray和Iris基于转换为ncdata,这反过来又相当于文件I/O
- 因此,Iris/Xarray转换相当于从一个包中保存到文件,然后在另一个包中加载该文件
- Ncdata直接与Iris/Xarray交换变量数据,无需复制实数数据或计算延迟数据
- Ncdata使用Dask 'streaming'与文件交换延迟数组,从而允许传输大于内存的数组
代码示例
- 大部分待定
- 针对netCDF4文件I/O的证明概念脚本
- 针对iris-xarray转换的证明概念脚本
API文档
安装
使用conda从conda-forge安装
conda install -c conda-forge ncdata
或使用pip从PyPI安装
pip install ncdata
项目状态
代码稳定性
我们打算遵循PEP 440或(较旧的)SemVer版本控制原则。
次要版本是"v0.1"。
这是一个第一个完整的实现,所有公共API都功能正常。
然而,代码仍然是实验性的,API也不稳定(因此还没有主要版本)。
变更说明
v0.1.1
小的调整+错误修复。
注意:#62和#59是实现预期性能目标的重要修复,即通过Dask传输任意大的数据而不会耗尽内存。
- 阻止非numpy属性值破坏属性打印输出。#63
- 阻止
ncdata.iris.from_iris()
为每个变量消耗全部数据内存。#62 - 提供ncdata组件字典和属性值的便利API。#61
- 在
ncdata.netcdf4.from_nc4()
中使用dask的chunks="auto"
。 #59
v0.1.0
首次发布
Iris和Xarray兼容性
- C.I.测试GitHub PRs和合并,针对Iris和Xarray的最新版本
- 与iris >= v3.7.0兼容
- 参见:自v3.7.0添加支持
已知限制
不支持的功能:未计划
- 不支持用户定义的数据类型
- 这包括复合型和可变长度类型
不支持的功能:计划在未来版本中提供
- 组(尚未完全支持?)
- 文件输出分块控制
已知问题
截至v0.1.1
- 在从iris立方体转换(使用
from_iris
)时,使用unlimited_dims
键目前会导致异常 - 在转换为xarray(使用
to_xarray
)时,数据集编码未重现,特别是“unlimited_dims”控制丢失
参考文献
- Iris问题:https://github.com/SciTools/iris/issues/4994
- 规划演示:https://github.com/SciTools/iris/files/10499677/Xarray-Iris.bridge.proposal.--.NcData.pdf
- 在Iris中的代码实现:https://github.com/pp-mo/iris/pull/75
开发者说明
文档构建
- 对于完整的文档构建,现在只需要简单的
make html
。docs/Makefile
会清除API文档并调用sphinx-apidoc以进行完全重建- 结果可在
docs/_build/html/index.html
中找到
- 上述内容仅用于本地测试(如有需要):我们通过ReadTheDocs提供了自动构建用于发布和PR的功能
发布操作
- 在GitHub上创建发布:这将触发在ReadTheDocs上的新文档版本
- 构建发行版
- 如果需要,获取build
- 运行
python -m build
- 推送到PyPI
- 如果需要,获取twine
- 运行
python -m twine upload --repository testpypi dist/*
- 这会将文件上传到TestPyPI
- 创建一个新的环境,包含测试依赖项
conda create -n ncdtmp python=3.11 iris xarray filelock requests pytest pip
(注意:‘filelock’和‘requests’是iris的测试依赖项) - 使用
pip install --index-url https://test.pypi.org/simple/ ncdata
安装新包并运行测试 - 如果测试检查通过,则删除
--repository testpypi 并重复 #2
- --> 上传到“真实”PyPI
- 重复#4,删除
--index-url
,以检查现在是否可以通过pip install ncdata
找到新版本
- 更新conda以从PyPI获取新版本
- 在ncdata feedstock上创建PR
- 更新
- 合并PR;等待几小时;检查新版本是否出现在
conda search ncdata
项目详情
下载文件
下载适用于您平台的应用程序文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
ncdata-0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 90e0a609c7053205e24b90520ce06568239435ca58b0c7afa1b4129d73ca60ec |
|
MD5 | 949e3e9988c1820bb704bdbc175c9ac3 |
|
BLAKE2b-256 | 7808854ec35a5d1fd5d6c9c67d33a2228be1dfa535fd9dd4f46cc2a9114dc47e |
ncdata-0.1.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b3baf54b6e0f67ee630c8f17823b47a62b1cc2e580b6d5e434b4c87c06f16411 |
|
MD5 | 7413aabd57daaefcc7314b83379c8c0d |
|
BLAKE2b-256 | 4ce6a9805b972e9ffed0b1ef995fac9fda661cf843842bc3a331ebc0ecbb4545 |