Как разделить/уточнить измерение в наборе данных xarray?Python

Программы на Python
Ответить
Anonymous
 Как разделить/уточнить измерение в наборе данных xarray?

Сообщение Anonymous »

Резюме. У меня есть набор данных, который собран таким образом, что изначально размеры недоступны. Я хотел бы взять, по сути, большой блок недифференцированных данных, и добавить к нему измерения, чтобы его можно было запрашивать, разбивать на подмножества и т. д. В этом суть следующего вопроса.

У меня есть набор данных xarray:

Код: Выделить всё

Dimensions:  (chain: 1, draw: 2000, rows: 24000)
Coordinates:
* chain    (chain) int64 0
* draw     (draw) int64 0 1 2 3 4 5 6 7 ... 1993 1994 1995 1996 1997 1998 1999
* rows     (rows) int64 0 1 2 3 4 5 6 ... 23994 23995 23996 23997 23998 23999
Data variables:
obs      (chain, draw, rows) float64 4.304 3.985 4.612 ... 6.343 5.538 6.475
Attributes:
created_at:                 2019-12-27T17:16:13.847972
inference_library:          pymc3
inference_library_version:  3.8
Измерение строк здесь соответствует ряду подразмерностей, которые мне нужно восстановить в данных. В частности, 24 000 строк соответствуют 100 выборкам из 240 условий (эти 100 выборок находятся в смежных блоках). Эти условия представляют собой комбинации ворот, входа, среды роста и od.

Я хотел бы в итоге получится что-то вроде этого:

Код: Выделить всё

Dimensions:  (chain: 1, draw: 2000, gate: 1, input: 4, growth_medium: 3, sample: 100, rows: 24000)
Coordinates:
* chain    (chain) int64 0
* draw     (draw) int64 0 1 2 3 4 5 6 7 ... 1993 1994 1995 1996 1997 1998 1999
* rows     *MultiIndex*
* gate     (gate) int64 'AND'
* input    (input) int64 '00', '01', '10', '11'
* growth_medium (growth_medium) 'standard', 'rich', 'slow'
* sample   (sample) int64 0 1 2 3 4 5 6 7 ... 95 96 97 98 99
Data variables:
obs      (chain, draw, gate, input, growth_medium, samples) float64 4.304 3.985 4.612 ... 6.343 5.538 6.475
Attributes:
created_at:                 2019-12-27T17:16:13.847972
inference_library:          pymc3
inference_library_version:  3.8
У меня есть фрейм данных pandas, в котором указаны значения ворот, входа и среды роста. Каждая строка дает набор значений ворот, входа и среды роста. и индекс, указывающий, где (в строках) появляется соответствующий набор из 100 образцов. Цель состоит в том, чтобы этот фрейм данных служил руководством для маркировки набора данных.

Я просмотрел документацию xarray «Изменение и реорганизация данных», но не вижу как объединить эти операции, чтобы сделать то, что мне нужно. Я подозреваю, что мне нужно каким-то образом объединить их с GroupBy, но я не понимаю, как это сделать. Спасибо!

Позже: У меня есть решение этой проблемы, но оно настолько отвратительно, что я надеюсь, что кто-нибудь объяснит, насколько я ошибаюсь. , и какой более элегантный подход возможен.

Итак, сначала я извлек все данные из исходного набора данных в необработанную numpy-форму:

Код: Выделить всё

foo = qm.idata.posterior_predictive['obs'].squeeze('chain').values.T
foo.shape # (24000, 2000)
Затем я изменил его по мере необходимости:

Код: Выделить всё

bar = np.reshape(foo, (240, 100, 2000))
Это дает мне примерно ту форму, которую я хочу: существует 240 различных экспериментальных условий, каждый из которых имеет 100 вариантов, и для каждого из этих вариантов у меня есть 2000 образцов Монте-Карло в мой набор данных.

Теперь я извлекаю информацию о 240 экспериментальных условиях из Pandas DataFrame:

Код: Выделить всё

import pandas as pd
# qdf is the original dataframe with the experimental conditions and some
# extraneous information in other columns
new_df = qdf[['gate', 'input', 'output', 'media', 'od_lb', 'od_ub', 'temperature']]
idx = pd.MultiIndex.from_frame(new_df)
Наконец, я заново собрал DataArray из массива numpy и MultiIndex pandas:

Код: Выделить всё

xr.DataArray(bar, name='obs', dims=['regions', 'conditions', 'draws'],
coords={'regions': idx, 'conditions': range(100), 'draws': range(2000)})
Полученный массив данных имеет такие координаты, как я и хотел:

Код: Выделить всё

Coordinates:
* regions      (regions) MultiIndex
- gate         (regions) object 'AND' 'AND' 'AND' 'AND' ... 'AND' 'AND' 'AND'
- input        (regions) object '00' '10' '10' '10' ... '01' '01' '11' '11'
- output       (regions) object '0' '0' '0' '0' '0' ... '0' '0' '0' '1' '1'
- media        (regions) object 'standard_media' ...  'high_osm_media_five_percent'
- od_lb        (regions) float64 0.0 0.001 0.001 ... 0.0001 0.0051 0.0051
- od_ub        (regions) float64 0.0001 0.0051 0.0051 2.0 ... 0.0003 2.0 2.0
- temperature  (regions) int64 30 30 37 30 37 30 37 ... 37 30 37 30 37 30 37
* conditions   (conditions) int64 0 1 2 3 4 5 6 7 ... 92 93 94 95 96 97 98 99
* draws        (draws) int64 0 1 2 3 4 5 6 ... 1994 1995 1996 1997 1998 1999
Однако это было довольно ужасно, и кажется неправильным, что мне пришлось пробиваться через все красивые уровни абстракции xarray, чтобы добраться до этой точки. Тем более, что это не кажется чем-то необычным в научном рабочем процессе: получение относительно необработанного набора данных вместе с электронной таблицей метаданных, которые необходимо объединить с данными. Так что же я делаю не так? Какое решение более элегантное?

Подробнее здесь: https://stackoverflow.com/questions/595 ... ay-dataset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»