假设我有一个熊猫表,其中一列是股票代码,另一列是日期,我希望,对于每一个日期,重新分配收益,以遵循统一的分布。现在,sklearn.preprocessing有一个非常好的quantile_transform函数,但是我似乎不能把它塞进熊猫tranform或apply功能中,
强制性的例子:
date ticker volume percent_change
2018-01-01 A 10000 0.01
2018-01-01 AA 15000 0.002
2018-01-01 AAPL 20000 -0.01
2018-01-01 FB 10000 0.05
2018-01-02 A 10000 -0.01
2018-01-02 AA 15000 0.03
2018-01-02 AAPL 20000 -0.02
2018-01-02 FB 10000 -0.01如果我想将每天返回的数据正常化为zscore,那么以下内容可以很好地工作:
zscore = lambda x: (x - x.mean()) / x.std()
df['zscore'] = tsdf.groupby('date')['percent_change'].transform(zscore)但quantile_transform似乎更加顽固。
发布于 2018-03-12 16:53:03
试试这个:
In [216]: for n,g in df.groupby('date'):
...: df.loc[df['date']==n, 'zscore'] = \
quantile_transform(df.loc[df['date']==n, ['percent_change']]).ravel()
In [217]: df
Out[217]:
date ticker volume percent_change zscore
0 2018-01-01 A 10000 0.010 6.666667e-01
1 2018-01-01 AA 15000 0.002 3.333333e-01
2 2018-01-01 AAPL 20000 -0.010 1.000000e-07
3 2018-01-01 FB 10000 0.050 9.999999e-01
4 2018-01-02 A 10000 -0.010 5.005005e-01
5 2018-01-02 AA 15000 0.030 9.999999e-01
6 2018-01-02 AAPL 20000 -0.020 1.000000e-07
7 2018-01-02 FB 10000 -0.010 5.235235e-01quantile_transform()期望2D数组作为输入--这就是我们需要方括号的原因:
df.loc[df['date']==n, ['percent_change']]
# ^ ^它返回一个2D矩阵作为结果,所以我们需要扁平(.ravel())它.
发布于 2019-11-27 09:10:19
循环慢,我有一个更好的方法:
from sklearn.preprocessing import QuantileTransformer
qt = QuantileTransformer(n_quantiles=100, random_state=0)
lam = lambda x: qt.fit_transform(x.values.reshape(-1, 1)).ravel()
df['result'] = df.groupby('date')['percent_change'].transform(lam)https://stackoverflow.com/questions/49239919
复制相似问题