将Python函数转换为PL / Python函数

时间:2016-03-05 00:36:44

标签: python postgresql numpy

我编写了几个python函数来对数据集中的连续变量进行Power转换。第一个函数基本上查找每列的数据类型,并返回数据类型的dict以及相应的列名作为值。

第二个函数现在获取数据类型和列名称的数据,并获取输入数据集,并使用代码中编写的幂转换函数对每个连续特征('float64')进行幂转换。

它在python中运行良好。这是代码:

首先将数据集传递给featuresDtypes函数,以将变量的数据类型作为dict。

# 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或映射。

任何帮助?

0 个答案:

没有答案