I am using SciPy\'s boxcox function to perform a Box-Cox transformation on a continuous variable.
from scipy.stats import boxcox
import numpy as np
y = np.random
SciPy has added an inverse Box-Cox transformation.
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.inv_boxcox.html
scipy.special.inv_boxcox scipy.special.inv_boxcox(y, lmbda) =
Compute the inverse of the Box-Cox transformation.
Find x such that:
y = (x**lmbda - 1) / lmbda if lmbda != 0
log(x) if lmbda == 0
Parameters: y : array_like
Data to be transformed.
lmbda : array_like
Power parameter of the Box-Cox transform.
Returns:
x : array
Transformed data.
Notes
New in version 0.16.0.
Example:
from scipy.special import boxcox, inv_boxcox
y = boxcox([1, 4, 10], 2.5)
inv_boxcox(y, 2.5)
output: array([1., 4., 10.])
In order to inverse the boxcox transformation from scipy.stats.boxcox using scipy.special.inv_boxcox you have to identify the lambda which was generated.
First apply the transformation and print the lambda (ie. param).
df[feature_boxcox], param = stats.boxcox(df[feature])
print('Optimal lambda', param)
Then in order to inverse the transformation you input the generated lambda.
inv_boxcox(df[feature_boxcox], param)
Follow the code:
#Function
def invboxcox(y,ld):
if ld == 0:
return(np.exp(y))
else:
return(np.exp(np.log(ld*y+1)/ld))
# Test the code
x=[100]
ld = 0
y = stats.boxcox(x,ld)
print invboxcox(y[0],ld)
Thanks to @Warren Weckesser, I've learned that the current implementation of SciPy does not have a function to reverse a Box-Cox transformation. However, a future SciPy release may have this function. For now, the code I provide in my question may serve others to reverse Box-Cox transformations.