Python: каков наилучший способ перебора набора данных для передачи значений в dict? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть функция, которая отправляет данные на мой рекламный сервер через Google DFP API.Функция работает, когда мои переменные (order_id, target_placement_id и т. Д.) Имеют жестко запрограммированные данные.

Мои данные поступают из 'ad_data.csv' , где каждый столбец являетсяключ и данные в связанной строке является значением.Я хочу перебрать этот набор данных и передать значения каждой строки в файле csv в правильное значение внутри line_item dict.Ниже мои панды DataFrame.head()

        order_id   targeted_placement_id          campaign
  0   3494982232              5555666677     Ad Campaign 1
  1   8494984434              1112666177     Ad Campaign 2
  3   4494922232              0992666677     Ad Campaign 3
  4   1494984234              9494939499     Ad Campaign 4

Однако внутри цикла for я хочу передать каждую строку 'ad_data.csv'

from googleads import dfp
import pandas as pd

df = pd.read_csv('ad_data.csv')
order_id = df['order'].tolist()
targeted_placement_id = df['placement_id'].tolist()
campaign_name = df['campaign'].tolist() 

def main(client, order_id, targeted_placement_ids, campaign_name):
     line_item_service = client.GetService('LineItemService')

     # Create line item objects.
     line_items = []
     for _ in range(1):
         line_item = {
             'orderId': order_id,
             'name': campaign_name,
             'targeting': {
                 'inventoryTargeting': 
                    {'targetedPlacementIds': targeted_placement_ids},
             }
          }
          line_items.append(line_item)

     line_items = line_item_service.createLineItems(line_items)

     for line_item in line_items:
         print('Target id "%s", in order id "%s", named"%s" was created' 
               %(line_item['targetedPlacementId'], line_item['orderId'], line_item['name']))

if __name__ == '__main__':
    dfp_client = dfp.DfpClient.LoadFromStorage()
    main(dfp_client, order_id, targeted_placement_id, campaign_name)

Если все сделано правильно, line_item должен напечатать:

Target id 5555666677 in order id 3494982232, named Ad Campaign 1 was created 
Target id 1112666177 in order id 8494984434, named Ad Campaign 2 was created 
Target id 0992666677 in order id 4494922232, named Ad Campaign 3 was created
Target id 9494939499 in order id 1494984234, named Ad Campaign 4 was created 

Каков наилучший способ выполнить эту задачу?

1 Ответ

0 голосов
/ 22 мая 2018

Если вы хотите работать с .csv и .json файлами, вы должны использовать pandas lib.

Для чтения файла вы можете использовать read_csv () , он вернет объект pandas DataFrame , которым вы можете манипулировать, а затем, если вы хотите сохранить его как файл .csv, просто используйте to_csv ()

Для доступа к определенной строке или столбцу вы можете использовать loc или iloc

Вы также можете преобразовать Series всписок питонов с tolist ()
например,

DF = pandas.DataFrame.read_csv('filename.csv')
orders = DF['Orders'].tolist()

orders - это список python со значениями из столбца с именем Orders from your.CSV-файл

Редактировать: Как обсуждалось в комментариях, вы должны выяснить, какой инструмент лучше всего подходит для вашей проблемы.Но если вы планируете работать с большим набором данных, я рекомендую вам прочитать об использовании памяти пандами в документах

Интересная статья: сокращение использования памяти пандами для больших наборов данных

Редактировать 2:

Чтобы получить каждый столбец вашего DataFrame в виде списка, вы должны сделать:

orders = DF['order_id'].tolist()
targets = DF['targeted_placement_id'].tolist()
campaigns = DF['campaign'].tolist()
# print(orders, targets, campaigns)

1054 * ValueError , который вы получаете, заключается в том, что вы пытаетесь передать эти списки в качестве значений ключам вашего словаря orderId, name и targetedPlacementIds.Один из способов перебора этих списков - с помощью enumerate(orders) он вернет индекс и порядковый номер каждой позиции.

например,

0   3494982232
1   8494984434
2   4494922232

И затем получитьcampaigns и targets каждого заказа, вы просто передаете списки с индексом заказа, так что ваш цикл будет выглядеть примерно так:

# Create line item objects.
line_items = []
for index, order in enumerate(orders):
    line_item = {
        'orderId': order,
        'name': campaigns[index],
        'targeting': {
            'inventoryTargeting': {
                'targetedPlacementIds': targets[index]
            }
        }
    }
    line_items.append(line_item)
print(line_items)

наконец, ваш line_items будет спискомгде каждая позиция - словарь.

PS:

В вашем цикле печати есть ошибка, вместо line_item['targetedPlacementId'] должно быть line_item['targeting']['inventoryTargeting']['targetedPlacementIds']

Вы также можете проверить, имеет ли ваш DataFrame нулевые значения с помощью:

if DF.isnull().values.any():
        raise Exception('Null values')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...