同时对两列应用 Box Cox 变换

Apply Box Cox transformation to two columns simultaneously

我想对两个不同的列应用 Box-Cox 变换。不同之处在于我被要求同时选择最适合两列的 lambda。

scipy.stats.boxcox只接受一维数组。

如何将 Box-Cox 变换应用到满足 lambda_1 = lambda_2 的两列?

Here's my data.

我想转换列 SPEEDCAP

import pandas as pd
from scipy import stats

df = pd.read_csv('https://raw.githubusercontent.com/BenjaminKay/berndt-econometrics/master/data/floppy_ver/CHAP4.DAT/COLE',
                 sep='\t')
stats.boxcox(df[['SPEED','CAP']].values)

ValueError: Data must be 1-dimensional.

听起来您希望 boxcox 将两列视为一个数据集。您可以将它们合并为一个一维数组,应用 boxcox,然后在之后恢复形状,如下所示。

获取二维数组的值:

In [63]: data = df[['SPEED','CAP']].values

将数据传递给boxcox;在传入数据之前使用 .ravel() 方法将 data 展平为一维数组:

In [64]: result1d, lam = stats.boxcox(data.ravel())

In [65]: lam
Out[65]: -0.02063317824310837

重塑 result1d 回到原来的二维形状:

In [66]: result = result1d.reshape(data.shape)

In [67]: result.shape
Out[67]: (91, 2)

In [68]: result[:8]
Out[68]: 
array([[-1.82384013,  7.23194418],
       [-4.09393704,  3.25939313],
       [-3.80017243,  4.39314839],
       [-3.80017243,  4.39314839],
       [-3.80017243,  4.39314839],
       [-3.80017243,  4.39314839],
       [-3.11153324,  5.01897958],
       [-3.11153324,  5.01897958]])