我一直在尝试通过使用列表理解将一些函数转换为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()
data.tail()
我不太确定为什么前两行是相同的,然后从那里开始数字都是不同的。我是新来的理解者,所以我可能在这里错过了一些东西。
答案 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