pandas resample dropna 不适用于所有列
pandas resample dropna does not apply for all columns
重采样 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
如果我们对每周累计 returns 的数据重新采样,我们希望在第二个周期中删除 2019-02-13
之后的日期 - 因为列 t2
在该日期之后没有数据。但是t1
的累计returns是基于整个时期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()
分别应用于每一列。这会在重采样结果中引入无效数据点。是否有一种 pythonic 方式只在 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
您可以在对数据重新采样之前删除 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
重采样 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
如果我们对每周累计 returns 的数据重新采样,我们希望在第二个周期中删除 2019-02-13
之后的日期 - 因为列 t2
在该日期之后没有数据。但是t1
的累计returns是基于整个时期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()
分别应用于每一列。这会在重采样结果中引入无效数据点。是否有一种 pythonic 方式只在 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
您可以在对数据重新采样之前删除 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