我一直在尝试通过使用列表理解来转换我使用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()
我不太清楚为什么前两行是一样的,然后从那里的数字都是不同的。我是一个新的列表理解,所以我可能错过了一些东西在这里。你知道吗
您已更改列表组件版本中的逻辑。最初,您的
else
公式如下所示:但列表理解版本如下:
第一个版本访问结果列表的
i-1
元素,而第二个版本访问输入列表的i-1
元素。你知道吗index == 0
在列表的开头只有一次为真。为什么不消除条件:您需要引用列表中先前生成的元素,而列表理解并不适合这种类型的问题。对于只需要一次查看单个元素的操作,它们工作得很好。 This question更详细。你知道吗
在最初的示例中,使用
adstock_rate * adstocked_advertising[i-1]
。列表理解版本使用adstock_rate * data[i-1]
,这就是为什么会得到不同的结果。你知道吗循环的标准对于您的用例来说很好。您可以切换到使用enumerate,因为不鼓励使用
for i in range(len(data))
。你知道吗相关问题 更多 >
编程相关推荐