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



我有一个数据框架,每行的总销售额约为500个产品类别。所以我的数据框架中有500列。我正试图找到与我的另一个数据帧列相关度最高的类别。所以我将使用皮尔逊相关方法。但所有类别的总销售额都是高度偏斜的数据,所有类别列的偏斜程度从10到40不等。所以我想使用boxcox转换来对这个销售数据进行日志转换。由于我的销售数据也有0个值,我想使用boxcox1p函数。有人能帮我吗,我如何计算boxcox1p函数的lambda,因为它是这个函数的强制参数?此外,这是我的问题陈述找到高度相关类别的正确方法吗?

假设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]]

相关内容

  • 没有找到相关文章

最新更新