повторная выборка панд не распространяется на все столбцы - PullRequest
0 голосов
/ 15 февраля 2019

При повторной выборке DataFrame, dropna() кажется работающим по столбцам, что сделало бы измерения неточными.

Для приведенных ниже данных:

In [1]: np.random.seed(117)

In [2]: data = pd.DataFrame(
   ...:     np.concatenate((np.random.rand(17), np.full(3, np.nan))).reshape(2, 10).transpose(),
   ...:     index=pd.bdate_range(start='2019-02-04', end='2019-02-15'),
   ...:     columns=['t1', 't2'],
   ...: ).mul(.01).add(1).cumprod().mul(100)

In [3]: data
Out[3]:
               t1     t2
2019-02-04 100.45 100.68
2019-02-05 100.75 101.65
2019-02-06 100.98 102.48
2019-02-07 101.88 103.40
2019-02-08 102.07 104.17
2019-02-11 103.02 104.93
2019-02-12 103.07 105.09
2019-02-13 103.85    NaN
2019-02-14 103.94    NaN
2019-02-15 104.09    NaN

Если мы повторим выборку данных дляеженедельные накопительные доходы, мы хотим отбросить даты после 2019-02-13 во 2-м периоде - потому что столбец t2 не имеет данных после этой даты.Но накопленная доходность для t1 основана на весь период 1.03:

In [4]: data.resample('7D').apply(lambda vv: vv.dropna().pct_change().sum()).mul(100)
Out[4]:
             t1   t2
2019-02-04 1.60 3.43
2019-02-11 1.03 0.15

Причина проблемы заключается в том, что dropna() применяется к каждому столбцу в отдельности.Это вводит недопустимую точку данных в результат повторной выборки.Есть ли питонный способ использовать данные только во время 2019-02-11 и 2019-02-12, т. Е. Желаемый вывод должен быть:

In [5]: ???
Out[5]:
             t1   t2
2019-02-04 1.60 3.43
2019-02-11 0.05 0.15

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете удалить nan перед повторной выборкой данных:

data.loc[data.isna().sum(axis=1) == 0, :].resample('7D').apply(lambda vv: vv.pct_change().sum()).mul(100)

Результат выглядит следующим образом:

                  t1        t2
date                          
2019-02-04  1.604703  3.422393
2019-02-11  0.048534  0.152483
...