列出理解和转换数据

时间:2018-11-20 19:16:01

标签: python list-comprehension

我一直在尝试通过使用列表理解将一些函数转换为for循环。这是该函数的第一个版本

def adstocked_advertising(data, adstock_rate):
    '''
    Transforming data with applying Adstock transformations
    data - > The dataframe that is being used to create Adstock variables
    adstock_rate -> The rate at of the adstock

    ex. data['Channel_Adstock'] = adstocked_advertising(data['Channel'], 0.5)
    '''
    adstocked_advertising = []
    for i in range(len(data)):
        if i == 0: 
            adstocked_advertising.append(data[i])
        else:
            adstocked_advertising.append(data[i] + adstock_rate * adstocked_advertising[i-1])            
    return adstocked_advertising

我想将其转换为此,

def adstocked_advertising_list(data, adstock_rate):
    adstocked_advertising = [data[i] if i == 0 else data[i] + adstock_rate * data[i-1] for i in range(len(data))]

    return adstocked_advertising

但是,运行两个函数后查看df时,我得到两个不同的值。

data['TV_adstock'] = adstocked_advertising_list(data['TV'], 0.5)
data['TV_adstock_2'] = adstocked_advertising(data['TV'], 0.5)

这里是输出

data.head()

enter image description here

data.tail()

enter image description here

我不太确定为什么前两行是相同的,然后从那里开始数字都是不同的。我是新来的理解者,所以我可能在这里错过了一些东西。

2 个答案:

答案 0 :(得分:2)

您需要引用列表中先前生成的元素,并且列表理解不太适合此类问题。它们适用于只需要一次查看单个元素的操作。  This question更加详细。

在最初的示例中,您使用adstock_rate * adstocked_advertising[i-1]。列表理解版本使用adstock_rate * data[i-1],这就是为什么您获得不同结果的原因。

一个标准的循环对于您的用例来说很好用。不鼓励使用for i in range(len(data)),因此您可以切换到使用枚举。

if data:
    res = [data[0]]
for index, item in enumerate(data[1:]):
        results.append(item + rate * data[index-1])

答案 1 :(得分:1)

您已经更改了列表comp版本中的逻辑。最初,您的else公式如下:

data[i] + adstock_rate * adstocked_advertising[i-1]

但是列表理解版本如下:

data[i] + adstock_rate * data[i-1]

第一个版本访问结果列表的第i-1个元素,而第二个版本访问 input 的第i-1个元素列表。

index == 0在列表的开头仅一次为真。为什么不消除条件:

def adstocked_advertising(data, adstock_rate):
    if data:
        res = [data[0]]

        for i in range(1, len(data)):
            res.append(data[i] + adstock_rate * res[i-1])

        return res