Как нормализовать по безразмерной координате?

#python #python-xarray

Вопрос:

Я нахожусь в xarray и пытаюсь нормализоваться с помощью группы координат, а не транслировать координату в качестве нового измерения в результате.

Ниже приведен небольшой пример

 import pandas as pd
import xarray as xr

import json

jsondata = '{"colour":{"0":"blue","1":"pink","2":"green","3":"blue","4":"pink","5":"green","6":"blue","7":"pink","8":"green","9":"blue","10":"pink","11":"green","12":"blue","13":"pink","14":"green","15":"blue","16":"pink","17":"green","18":"blue","19":"pink","20":"green","21":"blue","22":"pink","23":"green"},"level1":{"0":1,"1":1,"2":1,"3":2,"4":2,"5":2,"6":3,"7":3,"8":3,"9":4,"10":4,"11":4,"12":5,"13":5,"14":5,"15":6,"16":6,"17":6,"18":7,"19":7,"20":7,"21":8,"22":8,"23":8},"Value1":{"0":68,"1":63,"2":76,"3":37,"4":48,"5":26,"6":41,"7":50,"8":32,"9":42,"10":34,"11":14,"12":56,"13":30,"14":16,"15":92,"16":38,"17":68,"18":0,"19":78,"20":3,"21":62,"22":10,"23":12},"Value2":{"0":33,"1":13,"2":28,"3":92,"4":1,"5":1,"6":84,"7":85,"8":32,"9":44,"10":59,"11":59,"12":26,"13":85,"14":6,"15":73,"16":40,"17":48,"18":60,"19":51,"20":97,"21":29,"22":77,"23":45}}'
jsondata2 ='{"1":1,"2":1,"3":2,"4":3,"5":3,"6":4,"7":4,"8":5}'
df = pd.DataFrame(json.loads(jsondata))
ds = df.set_index(['colour','level1']).to_xarray()

level2_map = pd.Series(json.loads(jsondata2))
level2_map.index = level2_map.index.astype(int)

ds = ds.assign_coords(level2=("level1", level2_map))
df['level2'] = df.level1.map(level2_map)
df = df.set_index(['colour','level1','level2'])
 

Как я могу нормализовать Value1 и Value2 превысить их сумму на level2 ?

В панд я могу сделать:

 (df / df.groupby(level=[0,2]).sum())
 

В xarray я не могу сгруппировать сразу два столбца(отдельная проблема), поэтому, даже если я рассчитаю его индивидуально для каждого из первых значений измерения, я, похоже, не смогу вернуть набор данных, который не транслирует/не расширяет level2 в новое измерение. т. Е.

 out = {}
for col in ['blue', 'pink', 'green']:
    out[col] = ds.sel(colour=col) / ds.sel(colour=col).groupby('level2').sum('level1')
ds_result = xr.concat(out.values(), "colour")
 

каждая из переменных в out и ds_result теперь имеет форму (3, 8, 5), т. е. расширена, чтобы включить уровень 2 в качестве нового измерения. В то время как я хочу, чтобы он оставался (3, 8) и выполнял вычисления, как в примере с пандами.