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

Pri*_*rma 5 python logging transformation pandas pearson-correlation

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

ipj*_*ipj 6

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

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

Run Code Online (Sandbox Code Playgroud)

现在转换后的值位于df_boxcox.

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

import numpy as np
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')
Run Code Online (Sandbox Code Playgroud)

请注意,使用“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]
Run Code Online (Sandbox Code Playgroud)

然后应用计算出的 lambda:

print(pt.transform(data))
Run Code Online (Sandbox Code Playgroud)

结果:

[[-1.60758267]
 [-1.09524803]
 [-0.60974999]
 [-0.16141745]
 [ 0.26331586]
 [ 0.67341476]
 [ 1.07296428]
 [ 1.46430326]]
Run Code Online (Sandbox Code Playgroud)