首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >群quantile_transform

群quantile_transform
EN

Stack Overflow用户
提问于 2018-03-12 16:19:10
回答 2查看 512关注 0票数 1

假设我有一个熊猫表,其中一列是股票代码,另一列是日期,我希望,对于每一个日期,重新分配收益,以遵循统一的分布。现在,sklearn.preprocessing有一个非常好的quantile_transform函数,但是我似乎不能把它塞进熊猫tranformapply功能中,

强制性的例子:

代码语言:javascript
复制
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,那么以下内容可以很好地工作:

代码语言:javascript
复制
zscore = lambda x: (x - x.mean()) / x.std()
df['zscore'] = tsdf.groupby('date')['percent_change'].transform(zscore)

quantile_transform似乎更加顽固。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-12 16:53:03

试试这个:

代码语言:javascript
复制
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-01

quantile_transform()期望2D数组作为输入--这就是我们需要方括号的原因:

代码语言:javascript
复制
df.loc[df['date']==n, ['percent_change']]
#                     ^                ^

它返回一个2D矩阵作为结果,所以我们需要扁平(.ravel())它.

票数 1
EN

Stack Overflow用户

发布于 2019-11-27 09:10:19

循环慢,我有一个更好的方法:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49239919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档