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

2024-10-02 08:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据方法lambda函数dataframe参数高度类别
1条回答
网友
1楼 · 发布于 2024-10-02 08:21:56

假设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,但我们可以使用PowerTransformerfrom sklearn.preprocessing

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]

然后应用计算的λ:

print(pt.transform(data))

结果:

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

相关问题 更多 >

    热门问题