列表理解与转换

2024-10-04 11:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试通过使用列表理解来转换我使用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

我不太清楚为什么前两行是一样的,然后从那里的数字都是不同的。我是一个新的列表理解,所以我可能错过了一些东西在这里。你知道吗


Tags: the函数in列表fordataratedef
2条回答

您已更改列表组件版本中的逻辑。最初,您的else公式如下所示:

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

但列表理解版本如下:

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

第一个版本访问结果列表的i-1元素,而第二个版本访问输入列表的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

您需要引用列表中先前生成的元素,而列表理解并不适合这种类型的问题。对于只需要一次查看单个元素的操作,它们工作得很好。 This question更详细。你知道吗

在最初的示例中,使用adstock_rate * adstocked_advertising[i-1]。列表理解版本使用adstock_rate * data[i-1],这就是为什么会得到不同的结果。你知道吗

循环的标准对于您的用例来说很好。您可以切换到使用enumerate,因为不鼓励使用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])

相关问题 更多 >