我编写了几个python函数来对数据集中的连续变量进行Power转换。第一个函数基本上查找每列的数据类型,并返回数据类型的dict以及相应的列名作为值。
第二个函数现在获取数据类型和列名称的数据,并获取输入数据集,并使用代码中编写的幂转换函数对每个连续特征('float64')进行幂转换。
它在python中运行良好。这是代码:
# Then pass the same dataset to varTransformation function by also passing the returned data type dict.
def featuresDtypes(model_data1):
"""This function takes a dataframe and gives a dict of column
data types
"""
g = model_data1.columns.to_series().groupby(model_data1.dtypes).groups
var_types={k.name: v for k, v in g.items()}
return var_types
def varTransformation(model_data1,var_types):
"""This function takes in a list of continuous feature names
and transforms it using Box-Cox transformation
list--> df
(list of feature names)---> returns a transformed pandas dataframe
"""
var_transform_mapping={}
model_data_transformed=copy.deepcopy(model_data1)
continuous_var=var_types['float64']
for x in continuous_var:
# Anchoring the data at 1 as Box-Cox takes more than 0 as the value
model_data_transformed[x]=(model_data_transformed[x]-(model_data_transformed[x].min()-1))
lmbda,ppc=sp.stats.boxcox_normplot(model_data_transformed[x], -20, 20, plot=ax)
lmax_pearsonr = sp.stats.boxcox_normmax(model_data_transformed[x])
lamda_ppc=lmbda[ppc.argsort()[::-1][0]]
#Rounding the lambda value
if 0.3<=np.abs(lamda_ppc)-int(np.abs(lamda_ppc))<=0.59 :
lamda_ppc=cmp(lamda_ppc,0)*(int(np.abs(lamda_ppc))+0.5)
else:
lamda_ppc=cmp(lamda_ppc,0)*(np.around(np.abs(lamda_ppc)))
# Getting the box - cox tranformation using the lambda value
model_data_transformed[x]= sp.stats.boxcox(model_data_transformed[x],lamda_ppc)
var_transform_mapping[x]=lamda_ppc
return model_data_transformed,var_transform_mapping
现在我想在PL / Python中为Postgresql实现它。
基本上我正在寻找以下内容:
CREATE OR REPLACE FUNCTION Powertransform(dataset table)
RETURNS table AS
$$
<Python code here (as used above) for powertransformation>
$$ LANGUAGE 'plpythonu';
在这个PL / Python中,我们可以使用信息模式代码来获取postgres表中每列的数据类型。所以我们不需要上面写的第一个python函数,它以python格式执行相同的操作。 Pl / Python代码的其余部分类似于查看列是否属于连续类型,然后使用PL / Python对其进行转换。
最终返回的表我需要一个修改/转换的变量表,以及用python函数中所示的正确转换值转换的列名称的dict或映射。
任何帮助?