Установите значения, используя индекс имени в xarray

Я пытаюсь сделать кроссовер MA, который я сделал на панелях панд, используя xarray.

Данные, которые я использую:

<xarray.Dataset>
Dimensions:          (DATE: 3355, DN_NAME: 22670)
Coordinates:
  * DATE             (DATE) datetime64[ns] 2004-05-18 2004-05-19 2004-05-21 ...
  * DN_NAME          (DN_NAME) object '17836' '1TIME' '4SIGHT' 'A-V-I' ...
Data variables:
    Unnamed: 0       (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    EXCHANGE         (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    CODE             (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    DNSECTOR         (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    EXCHANGE_SECTOR  (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    OPEN             (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    HIGH             (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    LOW              (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    CLOSE            (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    VOLUME           (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    OI               (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    DY               (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    EY               (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    VALUE            (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    DEALS            (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    BID              (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    OFFER            (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    CURRENCY         (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    ISSUED_SHARES    (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    FULL_NAME        (DATE, DN_NAME) object nan nan nan nan nan nan nan nan ...
    MA1              (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    MA2              (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    MA3              (DATE, DN_NAME) float64 nan nan nan nan nan nan nan nan ...
    MACROSS          int64 0

Код, который работал с панелями pandas:

share_data['MACROSS'] = 0
#share_data['MACROSS'][(share_data['MA1'] <= share_data['MA2']) & 
(share_data['MA1'].shift(1) > share_data['MA2'].shift(1))] = -1

Теперь я попробовал следующее в xarray после преобразования панели в xarray:

ds['MACROSS'] = 0
ds['MACROSS'].sel(MA1 <= ds['MA2'], ds['MA1'].shift(1) > 
ds['MA2'].shift(1)) = 1

Со следующей ошибкой кажется, что я не могу использовать индексацию sel для установки значений:

File "<ipython-input-50-af02cd233ed5>", line 17
     ds['MACROSS'].sel(ds['MA1'] > ds['MA2'], ds['MA1'].shift(1) <= 
     ds['MA2'].shift(1)) = 1

^
SyntaxError: can't assign to function call

Любая идея, как выбрать это подмножество в xarray, а затем установить значение по назначению?

Спасибо!


person svp    schedule 12.01.2018    source источник


Ответы (1)


В документации Xarray есть раздел присвоение значений с индексированием и специально предоставляет это предупреждение:

Не пытайтесь присваивать значения при использовании любого из методов индексации isel или sel.

Вместо этого вам нужно будет использовать объекты xarray для индексации. Что-то вроде этого:

date_inds = ...some subset of dates with DATE dimension...
name_inds = ...some subset of names with DN_NAME dimension...

ds['MACROSS'][date_inds, name_inds] = 1
person jhamman    schedule 14.01.2018
comment
Это не сработало для меня. Я получаю сообщение об ошибке о том, что мой индекс даты нельзя использовать, поскольку он не имеет целочисленного типа dtype: python invalid indexer array, does not have integer dtype: array(['2014-10-07T00:00:00.000000000', '2014-10-18T00:00:00.000000000', - person bravery; 20.03.2021