如何计算 lambda 以对 500 列的整个数据框使用 scipy.special.boxcox1p 函数?

Posted

技术标签:

【中文标题】如何计算 lambda 以对 500 列的整个数据框使用 scipy.special.boxcox1p 函数?【英文标题】:How do I calculate lambda to use scipy.special.boxcox1p function for my entire dataframe of 500 columns? 【发布时间】:2020-11-16 05:15:53 【问题描述】:

我有一个数据框,每行的总销售额约为 500 个产品类别。所以我的数据框中有 500 列。我正在尝试找到与我的另一个数据框列相关的最高类别。 所以我将为此使用皮尔逊相关方法。 但是所有类别的总销售额是高度偏斜的数据,所有类别列的偏度级别都在 10 到 40 之间。所以我想用 boxcox 转换记录转换这个销售数据。 因为,我的销售数据也有 0 值,所以我想使用 boxcox1p 函数。 有人可以帮我吗,我如何计算 boxcox1p 函数的 lambda,因为它是这个函数的强制参数? 另外,这是我的问题陈述找到高度相关类别的正确方法吗?

【问题讨论】:

【参考方案1】:

假设 df 是您的数据框,其中包含许多包含数值的列,并且 box-cox 转换的 lambda 参数等于 0.25,则:

from scipy.special import boxcox1p
df_boxcox = df.apply(lambda x: boxcox1p(x,0.25))

现在转换后的值位于df_boxcox

不幸的是,没有内置方法来查找 boxcox1p 的 lambda,但我们可以使用 sklearn.preprocessing 中的 PowerTransformer 代替:

import numpy as np
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')

使用注释方法“yeo-johnson”是因为它适用于正值和负值。方法 'box-cox' 将引发错误:ValueError: The Box-Cox transformation can only be applied to strictly positive data

data = pd.DataFrame('x':[-2,-1,0,1,2,3,4,5]) #just sample data to explain
pt.fit(data)
print(pt.lambdas_)
[0.89691707]

然后应用计算的 lambda:

print(pt.transform(data))

结果:

[[-1.60758267]
 [-1.09524803]
 [-0.60974999]
 [-0.16141745]
 [ 0.26331586]
 [ 0.67341476]
 [ 1.07296428]
 [ 1.46430326]]

【讨论】:

但是,你是怎么计算出 0.25 的? 我已经更新了答案。 PowerTransformer 似乎可以胜任。

以上是关于如何计算 lambda 以对 500 列的整个数据框使用 scipy.special.boxcox1p 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个功能应用于dask数据帧的多个块?

华为Atlas 500智能小站如何使能边缘计算?

为啥当我实现以 2^20 为底的基数排序以对大小为 500 万的数组进行排序时,该程序会陷入无限循环?

pandas生成新的累加数据列pandas生成新的累加数据列(数据列中包含NaN的情况)pandas计算整个dataframe的所有数据列的累加

加速 Django 数据库函数以对缺失值进行地理插值

如何设置专用 GPU 以对 CUDA 内核进行基准测试?