如何将pd.Series转换为dask-backed的xr.DataArray?

时间:2019-05-31 13:34:18

标签: python-xarray

我有pd.Series作为pd.MultiIndex的数据:

  • 1–8维度(索引级别)
  • 沿每个维度
  • 1–500个标签
  • 这些标签的笛卡尔积中
  • 〜5–20百万个元素,但是
  • 未满1%。

我想将这些数据转换为xr.DataArray

以下是一些示例代码,该代码生成了一个{377}(其中可能包含73,984,365个元素)的377个元素,仅占0.00051%。

pd.Series

不可能先from itertools import zip_longest import numpy as np import pandas as pd # Dimensions and their lengths dims = 'abcdef' sizes = [1, 5, 21, 21, 89, 377] # Names like f_000 … f_376 along each dimension coords = [] for d, N in zip(dims, sizes): coords.append([f'{d}_{i:03d}' for i in range(N)]) def make_values(): """Make a DataFrame containing each label in *coords* at least once.""" values = list(zip_longest(*coords, np.random.rand(max(sizes)))) result = pd.DataFrame(values, columns=list(dims) + ['value']) \ .ffill() \ .set_index(list(dims)) return result data = make_values() ,然后再xr.DataArray.from_series(data),因为创建步骤(内部使用.chunk(…))会创建完整的笛卡尔积,并产生xr.Dataset.from_dataframe()

我尝试过:

  1. 使用MemoryError预分配内存-但这会生成一个只读对象,而我无法从xr.DataArray(dask.array.full(fill_value=None, shape=sizes), …)为其分配值。
  2. 写入文件,有点像:

    data

    ...但这会引发异常。

除了以import xarray as xr store = pd.HDFStore('temp.h5') store.put('foo', data) xr.open_dataset('temp.h5', chunks={}) # or with engine='h5netcdf' 可以识别的一种格式手动创建文件之外,有什么方法可以做到?

0 个答案:

没有答案