Я пытался перенести некоторые из моих данных более высокого измерения из pandas в xarray с устаревшими панелями pandas. Я хотел бы использовать функцию diff в xarray, но ее параметры и выходные данные не совпадают с pandas.
Версия pandas: "DataFrame.diff (self, period = 1, axis = 0 ) »позволяет мне установить количество периодов, чтобы смещать для вычисления разницы. ie period = 2
Версия xarray "DataArray.diff (self, dim: Hashable, n: int = 1, label: Hashable = 'upper')" имеет только параметр n. Сколько раз значения различаются.
Импорт и пример DataFrame:
import numpy as np
import pandas as pd
import xarray as xr
data = np.random.randint(0, 9,(5,3))
date = pd.date_range('2000-01-01', periods=5)
cols = ['A','B','C']
df = pd.DataFrame(data, index=date, columns=cols)
print(df)
A B C
2000-01-01 6 4 4
2000-01-02 1 1 5
2000-01-03 5 6 5
2000-01-04 5 8 4
2000-01-05 6 8 0
И соответствующий DataArray:
da = xr.DataArray(df, dims = ['date', 'col'])
print(da)
<xarray.DataArray (date: 5, col: 3)>
array([[6, 4, 4],
[1, 1, 5],
[5, 6, 5],
[5, 8, 4],
[6, 8, 0]])
Coordinates:
* date (date) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-05
* col (col) object 'A' 'B' 'C'
Разница в DataFrame, как и ожидалось, и желательно выход с периодами = 1:
print(df.diff(periods=1))
A B C
2000-01-01 NaN NaN NaN
2000-01-02 -5.0 -3.0 1.0
2000-01-03 4.0 5.0 0.0
2000-01-04 0.0 2.0 -1.0
2000-01-05 1.0 0.0 -4.0
Аналогичен выходу DataArray для n = 1:
print(da.diff('date', n=1))
<xarray.DataArray (date: 4, col: 3)>
array([[-5, -3, 1],
[ 4, 5, 0],
[ 0, 2, -1],
[ 1, 0, -4]])
Coordinates:
* date (date) datetime64[ns] 2000-01-02 2000-01-03 2000-01-04 2000-01-05
* col (col) object 'A' 'B' 'C'
Но отличается, если периоды или n> 1:
print(df.diff(periods=2))
A B C
2000-01-01 NaN NaN NaN
2000-01-02 NaN NaN NaN
2000-01-03 -1.0 2.0 1.0
2000-01-04 4.0 7.0 -1.0
2000-01-05 1.0 2.0 -5.0
против
print(da.diff('date',n=2))
<xarray.DataArray (date: 3, col: 3)>
array([[ 9, 8, -1],
[-4, -3, -1],
[ 1, -2, -3]])
Coordinates:
* date (date) datetime64[ns] 2000-01-03 2000-01-04 2000-01-05
* col (col) object 'A' 'B' 'C'
Я могу сделать обходной обход, чтобы получить желаемый результат и тот же ответ, что и DataFrame.diff:
print (da - da.shift(date=2))
<xarray.DataArray (date: 5, col: 3)>
array([[nan, nan, nan],
[nan, nan, nan],
[-1., 2., 1.],
[ 4., 7., -1.],
[ 1., 2., -5.]])
Coordinates:
* date (date) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-05
* col (col) object 'A' 'B' 'C'
Но я хочу использовать вместо этого xarray.diff (), если это возможно. Любые советы или объяснения приветствуются.