понимание списка и преобразование данных - PullRequest
0 голосов
/ 20 ноября 2018

Я пытался преобразовать некоторые из моих функций, где я использую цикл 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 голосов
/ 20 ноября 2018

Вам необходимо обратиться к ранее сгенерированному элементу в списке, и понимание списка не очень подходит для этого типа проблемы.Они хорошо работают для операций, которые должны рассматривать только один элемент одновременно. Этот вопрос более детально описан.

В исходном примере вы используете 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])
0 голосов
/ 20 ноября 2018

Вы изменили свою логику в версии списка компов.Изначально ваша else формула выглядела так:

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

Но версия для понимания списка выглядит так:

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

Первая версия обращается к i-1 -ому элементу result list, в то время как вторая версия обращается к i-1 th элементу input list.

index == 0 имеет значение true только один раз в начале списка.Почему бы не устранить условное:

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
...