如何在Featuretools中实现加权和变换原语?

时间:2019-06-24 16:30:13

标签: featuretools

我正试图弄清楚如何为Featuretools实现加权和总和。权重应取决于time_since_last之类的

cum_sum(金额)= sum_ {i} exp(-a_ {i})* amount_ {i}

i的滚动期为6个月。...


上面您找到了原始问题。经过一段时间的尝试和错误后,出于我的目的,我想到了以下代码:

使用来自here的实体和关系的数据和初始设置

    def weight_time_until(array, time):
        diff = pd.DatetimeIndex(array) - time
        s = np.floor(diff.days/365/0.5)
        aWidth = 9
        a = math.log(0.1) / ( -(aWidth -1) )

        w = np.exp(-a*s) 

        return w

    WeightTimeUntil = make_trans_primitive(function=weight_time_until,
                                     input_types=[Datetime],
                                     return_type=Numeric,
                                     uses_calc_time=True,
                                     description="Calc weight using time until the cutoff time",
                                     name="weight_time_until")


features, feature_names = ft.dfs(entityset = es, target_entity = 'clients', 
                                 agg_primitives = ['sum'],
                                 trans_primitives = [WeightTimeUntil, MultiplyNumeric]) 

当我在上面进行操作时,我接近想要的功能,但是最后我没有理解正确的功能。所以我有功能

SUM(贷款。WEIGHT_TIME_UNTIL(贷款开始))

但不是

总和(loans.loan_amount *贷款.WEIGHT_TIME_UNTIL(loan_start))

我在这里想念什么?


我进一步尝试了。...

我的猜测是一次类型失误比赛!但“类型”相同。无论如何,我尝试了以下方法:

1)es [“贷款”] .convert_variable_type(“贷款金额”,ft.variable_types.Numeric) 2)贷款[“ loan_amount_”] =贷款[“ loan_amount”] * 1.0

对于(1)以及(2),我都得到了更有前途的功能:

贷款金额* * WEIGHT_TIME_UNTIL(贷款开始)

还有

贷款金额* WEIGHT_TIME_UNTIL(贷款开始)

但仅当我的目标价值=贷款而不是客户时,这才不是我的意图。

1 个答案:

答案 0 :(得分:2)

该原语当前不存在。但是,您可以创建自己的自定义原语来完成此计算。

以下是计算滚动总和的示例,可以使用适当的熊猫或python方法将其更新为加权总和

from featuretools.primitives import TransformPrimitive
from featuretools.variable_types import Numeric

class RollingSum(TransformPrimitive):
    """Calculates the rolling sum.

    Description:
        Given a list of values, return the rolling sum.
    """

    name = "rolling_sum"
    input_types = [Numeric]
    return_type = Numeric
    uses_full_entity = True

    def __init__(self, window=1, min_periods=None):
        self.window = window
        self.min_periods = min_periods

    def get_function(self):
        def rolling_sum(values):
            """method is passed a pandas series"""
            return values.rolling(window=self.window, min_periods=self.min_periods).sum()

        return rolling_sum