обработка данных в одной строке на пользователя с python - PullRequest
1 голос
/ 12 марта 2019

Я собираю пользовательские данные из csv-файлов, созданных в пользовательских отчетах Google Analytics, и некоторые пользовательские атрибуты имеют несколько значений для пользователей.Моя цель здесь - собрать пользовательские данные и поместить все соответствующие данные, относящиеся к одному пользователю, в один ряд.

Пример:

users = [
  { id:1, name: 'user1'},
  { id:2, name: 'user2'},
  { id:3, name: 'user3'}
 ]

 products_purchased = [
  {id:1 , product_purchased: 'sardines'},
  {id:1, product_purchased: 'shoes'},
  {id:2 , product_purchased: 'fish'},
  {id:2, product_purchased: 'chicken'},
  {id:3 , product_purchased: 'eggs'},
  {id:3, product_purchased: 'chicken'},
]

Я пытаюсь переупорядочить данные для машинного обучения следующим образом:

users = [
  { id:1, name: 'user1', product_purchased-1: 'sardines',
    product_purchased-2: 'shoes'},
  { id:2, name: 'user2', product_purchased-1:'fish',
    product_purchased-2: 'chicken' },
  { id:3, name: 'user3', product_purchased-1: 'eggs', 
    product_purchased-2: 'chicken'}
 ]

ниже приведен мой код Python:

import csv


processed = []
columns = ['id', 'username', 'country','city','region','event-1','event-2','event-3',
'event-4', 'event-5','event-6','event-7','event-8','event-9','event-10','product-1',
'product-2','product-3','product-4','product-5','product-6','product-7','product-8',
'product-9','product-10','page-1','page-2','page-3','page-4','page-5','Sessions with Event',
'Total Events','Adding a product on to the cart (Goal 4 Conversion Rate)',
'Adding a product on to the cart (Goal 4 Completions)']
i = 0
#columns =[] 'ID', 'WP Username' , country, city, region, event action 1 (10 actions), products (multiple), 'Sessions with Event',Total Events, Adding a product on to the cart (Goal 4 Conversion Rate),
# Adding a product on to the cart (Goal 4 Completions)

# Completed the main dimentions of the GA data
# getting details per unique user
with open('users.csv') as users_data:
    user_dict = csv.DictReader(users_data)
    users = list(user_dict)

    for user in users:
        processed.append({
            'id': user['ID'],
            'username': user['WordPress_Username'],
            'country':user['Country'],
            'city':user['City'],
            'region':user['Region']
        })

with open('events.csv') as events_data:
    events_dict = csv.DictReader(events_data)
    events = list(events_dict)

    for p in processed:
        for event in events:
            i += 1
            if p['id'] == event['ID']:
                p['event-' + str(i)] = event['Event Action']
            else:
                i = 0

with open('products.csv') as products_data:
    products_dict = csv.DictReader(products_data)
    products = list(products_dict)

    for p in processed:
        for product in products:
            i += 1
            if p['id'] == product['ID']:
                p['product-' + str(i)] = product['Product ID']
            else:
                i = 0

with open('pages.csv') as page_visited:
    pages_dict = csv.DictReader(page_visited)
    pages = list(pages_dict)

    for p in processed:
        for page in pages:
            i +=1
            if p['id'] == page['ID']:
                 p['page-' + str(i)] = page['Page']
            else:
                i = 0


for p in processed:
    for user in users:
        p['Sessions with Event'] = user['Sessions with Event']
        p['Total Events'] = user['Total Events']
        p['Adding a product on to the cart (Goal 4 Conversion Rate)'] = user['Adding a product on to the cart (Goal 4 Conversion Rate)']
        p['Adding a product on to the cart (Goal 4 Completions)'] = user[ 'Adding a product on to the cart (Goal 4 Completions)']
    for event in events:
        if p['id'] == event['ID']:
            p['Sessions'] = event['Sessions']
    for page in pages:
        if p['id'] == page['ID']:
            p['id'] = page['Pages / Session']



try:
    with open('data.csv', 'w') as data:
        writer = csv.DictWriter(data, fieldnames=columns)
        writer.writeheader()
    for p in processed:
        writer.writerow(p)
except IOError:
    print("I/O error") 

Я хотел бы знать, что не так с моим кодом или альтернативой, которая может также выполнить то, что я ищу.Я пробовал Google Data Studio раньше, и, похоже, в GA есть варианты, которые позволяют мне это делать.

Я намерен позже использовать scikit Learn для кластеризации данных, поэтому я форматирую данные для создания фрейма данных pandas.

Из любопытства: можно ли использовать сводные таблицы для создания фреймов данных?и будет ли этот формат работать для scikit learn?

ОБНОВЛЕНИЕ: Я исправил проблему с скобками в строке события ['Sessions'].Но сейчас я получаю следующую ошибку:

  File "data_processing.py", line 87, in <module>
    writer.writerow(p)
  File "/usr/lib/python2.7/csv.py", line 152, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
ValueError: I/O operation on closed file

1 Ответ

0 голосов
/ 12 марта 2019

Я хотел бы поблагодарить всех, кто ответил на мой вопрос! большое спасибо @xbello и @ G.Anderson. Как они оба указали, проблема была в том, что я заключил скобку в строку 75 ("[event ['Sessions']") и не сделал правильный отступ в финале с оператором open.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...