Запровадження
Amplitude як інструмент продуктової аналітики дуже добре зарекомендував себе завдяки нескладному настроюванню подій та гнучкості візуалізацій. І часто виникає потреба налагодити власну модель атрибуції, провести кластеризацію користувачів або побудувати дашборд в іншій BI-системі. Виконати подібну махінацію можливо лише маючи сирі дані про події з Amplitude. Як отримати ці дані з мінімальними знаннями програмування — і буде в цій статті.
Пререквізит
- Проект у Amplitude, в якому вже коректно налаштовані події, і за ними збирається статистика
- Встановлено python (працюю у версії 3.8.3), з яким потенційний читач уже вміє працювати хоча б на базовому рівні
Інструкція
Крок 1. Отримання API-key та secret-key
Щоб вивантажити дані, в першу чергу необхідно отримати API-key та secret-key.
Знайти їх можна, перейшовши наступним шляхом:
- «Manage data» (перебувати у лівій нижній частині екрана)
- Вибираємо потрібний проект, з якого вивантажуватимуться дані, і переходимо до нього
- У меню проекту вибираємо «Project settings»
- Знаходимо рядки API-key та secret-key, копіюємо та зберігаємо їх у надійному місці.
Без прокликування можна перейти за посиланням, яке виглядає так:
analytics.amplitude.com/$$$$$$$/manage/project/******/settings,
де $$$$$$ - логін вашої організації в amplitude, ****** - номер проекту
Крок 2. Перевірка наявності потрібних бібліотек
Хороша новина, що ці бібліотеки майже напевно вже у вас встановлені за замовчуванням або завантажені, але перевірити необхідно. Повний список бібліотек, що використовуються мною на момент написання статті (у дужках вказані версії, де доречно):
- requests (2.10.0)- надсилання запиту через api для отримання даних
- pandas (1.0.1) - читання json, створення dataframe і подальший запис у файл
- zipfile – витягти файли з архіву, отриманого через API
- gzip - розпакування json файлів з .gz
- os — отримання списку файлів із розпакованого архіву
- time - необов'язкова, вимірювання часу роботи скрипту
- tqdm — необов'язкова для зручності спостереження за прогресом обробки файлів.
Крок 3. Написання скрипту завантаження даних
Хінт: повний скрипт завантаження знаходиться в кінці статті, за бажання можна відразу взяти його і звертатися до покрокових пояснень за потреби.
Крок 3.1. Імпорт бібліотек
Виробляємо імпорт усіх бібліотек, перерахованих на другому етапі.
# Импорт библиотек
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
Крок 3.2. Надсилання запиту в Amplitude
Засічемо початок виконання скрипту і запишемо в змінну a.
startdate та enddate відповідають за період для вивантаження даних і вбудовуються в текст відправленого запиту на сервер Amplitude, крім дати можна також вказувати годину, змінюючи значення після 'T' у запиті.
api_key і secret_key відповідають значенням, отриманим першому кроці, з метою безпеки тут вказую випадкові послідовності замість своїх.
a = time.time()
# Параметры начальной и конечной даты
startdate = '20200627'
enddate = '20200628'
api_key = 'kldfg844203rkwekfjs9234'
secret_key = '094tfjdsfmw93mxwfek'
# Отправление запроса в Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. Запрос отправлен')
Крок 3.3. Завантаження архіву з даними
Вигадуємо назву для архіву та записуємо у змінну filename. Для власної зручності я вказую період + вказую, що це дані amplitude. Далі записуємо отриману відповідь від Amplitude до архіву.
# Скачивание архива с данными
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
code.write(response.content)
print('2. Архив с файлами успешно скачан')
Крок 3.4. Виймання файлів у папці на комп'ютері
У справу вступає бібліотека zipfile, яка допоможе здійснити вилучення файлів. У третьому рядку будьте уважні і пропишіть свій шлях, куди вам зручніше витягти.
# Извлечение файлов в папку на компьютере
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. Архив с файлами извлечен и записан в папку ' + filename)
Крок 3.5. Перетворення json
Після вилучення файлів з архіву потрібно перетворити json файли, що знаходяться у форматі .gz і записати їх у dataframe для подальшої роботи.
Звертаю увагу на те, що тут треба знову поміняти шлях на свій, а замість 000000 написати свій номер проекту з Amplitude (або відкрити вручну шлях, куди було вилучено архів, і подивитися назву папки всередині).
По порядку прямування:
Запис директорії в змінну, отримання списку файлів з директорії, створення порожнього датафрейму, time.sleep(1) для коректної роботи tqdm, всередині циклу відкриваємо файли .gz і відразу за допомогою pandas читаємо json і наповнюємо заданий dataframe.
# Преобразование json к обычному табличному формату
directory = 'C:\Users\...\'+filename+'# Преобразование json к обычному табличному формату
directory = 'C:\Users\...\'+filename+'\000000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('Прогресс обработки файлов:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)
print('4. JSON файлы из архива успешно преобразованы и записаны в dataframe')
0000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('Прогресс обработки файлов:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)
print('4. JSON файлы из архива успешно преобразованы и записаны в dataframe')
Крок 3.6. Запис dataframe в excel
Вивантаження у excel тут просто як приклад. У багатьох випадках зручніше працювати з отриманим кадром даних усередині python або скласти дані у сховищі.
Замінити шлях вивантаження даних тут також доведеться на свій.
# Записать полученной таблицы в Excel-файл
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe успешно записан в файл ' + filename)
Крок 3.7. Вважаємо час роботи скрипту
Запис поточного часу в змінну b, розрахунок різниці та кількості хвилин, виведення всього хвилин. Це останній крок.
b = time.time()
diff = b-a
minutes = diff//60
print('Выполнение кода заняло: {:.0f} минут(ы)'.format( minutes))
Висновок
Викликати таблицю і почати з нею можна працювати, викликавши змінну amplitude_dataframe, в яку були записані дані. У ній буде близько 50 стовпців, з яких у 80% випадків ви використовуватимете: event_type - назва івента, event_properties - параметри івента, event_time - час івента, uuid - id клієнта, user_properties - параметри клієнта, варто почати роботу в першу чергу з них . І при порівнянні цифр із власних розрахунків із показниками з дешбордів Amplitude не можна забувати про те, що система використовує власну методологію розрахунку унікальних клієнтів/воронок тощо, і перед цим треба обов'язково ознайомитись із документацією Amplitude.
Дякую за увагу! Тепер ви можете вивантажувати сирі дані про події Amplitude і повноцінно використовувати їх у своїй роботі.
Весь скрипт:
# Импорт библиотек
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
a = time.time()
# Параметры начальной и конечной даты
startdate = '20200627'
enddate = '20200628'
api_key = 'd988fddd7cfc0a8a'
secret_key = 'da05cf1aeb3a361a61'
# Отправление запроса в Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. Запрос отправлен')
# Скачивание архива с данными
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
code.write(response.content)
print('2. Архив с файлами успешно скачан')
# Извлечение файлов в папку на компьютере
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. Архив с файлами извлечен и записан в папку ' + filename)
# Преобразование json к обычному табличному формату
directory = 'C:\Users\...\'+filename+'# Импорт библиотек
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
a = time.time()
# Параметры начальной и конечной даты
startdate = '20200627'
enddate = '20200628'
api_key = 'd988fddd7cfc0a8a'
secret_key = 'da05cf1aeb3a361a61'
# Отправление запроса в Amplitude
response = requests.get('https://amplitude.com/api/2/export?start='+startdate+'T0&end='+enddate+'T0', auth = (api_key, secret_key))
print('1. Запрос отправлен')
# Скачивание архива с данными
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
code.write(response.content)
print('2. Архив с файлами успешно скачан')
# Извлечение файлов в папку на компьютере
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. Архив с файлами извлечен и записан в папку ' + filename)
# Преобразование json к обычному табличному формату
directory = 'C:\Users\...\'+filename+'\000000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('Прогресс обработки файлов:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)
print('4. JSON файлы из архива успешно преобразованы и записаны в dataframe')
# Записать полученной таблицы в Excel-файл
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe успешно записан в файл ' + filename)
b = time.time()
diff = b-a
minutes = diff//60
print('Выполнение кода заняло: {:.0f} минут(ы)'.format( minutes))
0000'
files = os.listdir(directory)
amplitude_dataframe = pd.DataFrame()
print('Прогресс обработки файлов:')
time.sleep(1)
for i in tqdm(files):
with gzip.open(directory + '\' + i) as f:
add = pd.read_json(f, lines = 'True')
amplitude_dataframe = pd.concat([amplitude_dataframe, add])
time.sleep(1)
print('4. JSON файлы из архива успешно преобразованы и записаны в dataframe')
# Записать полученной таблицы в Excel-файл
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe успешно записан в файл ' + filename)
b = time.time()
diff = b-a
minutes = diff//60
print('Выполнение кода заняло: {:.0f} минут(ы)'.format( minutes))
Джерело: habr.com