Отримання даних Amplitude через API

Запровадження

Amplitude як інструмент продуктової аналітики дуже добре зарекомендував себе завдяки нескладному настроюванню подій та гнучкості візуалізацій. І часто виникає потреба налагодити власну модель атрибуції, провести кластеризацію користувачів або побудувати дашборд в іншій BI-системі. Виконати подібну махінацію можливо лише маючи сирі дані про події з Amplitude. Як отримати ці дані з мінімальними знаннями програмування — і буде в цій статті.

Пререквізит

  1. Проект у Amplitude, в якому вже коректно налаштовані події, і за ними збирається статистика
  2. Встановлено python (працюю у версії 3.8.3), з яким потенційний читач уже вміє працювати хоча б на базовому рівні

Інструкція

Крок 1. Отримання API-key та secret-key

Щоб вивантажити дані, в першу чергу необхідно отримати API-key та secret-key.

Знайти їх можна, перейшовши наступним шляхом:

  1. «Manage data» (перебувати у лівій нижній частині екрана)
  2. Вибираємо потрібний проект, з якого вивантажуватимуться дані, і переходимо до нього
  3. У меню проекту вибираємо «Project settings»
  4. Знаходимо рядки API-key та secret-key, копіюємо та зберігаємо їх у надійному місці.

Без прокликування можна перейти за посиланням, яке виглядає так:
analytics.amplitude.com/$$$$$$$/manage/project/******/settings,
де $$$$$$ - логін вашої організації в amplitude, ****** - номер проекту

Крок 2. Перевірка наявності потрібних бібліотек

Хороша новина, що ці бібліотеки майже напевно вже у вас встановлені за замовчуванням або завантажені, але перевірити необхідно. Повний список бібліотек, що використовуються мною на момент написання статті (у дужках вказані версії, де доречно):

  1. requests (2.10.0)- надсилання запиту через api для отримання даних
  2. pandas (1.0.1) - читання json, створення dataframe і подальший запис у файл
  3. zipfile – витягти файли з архіву, отриманого через API
  4. gzip - розпакування json файлів з .gz
  5. os — отримання списку файлів із розпакованого архіву
  6. time - необов'язкова, вимірювання часу роботи скрипту
  7. 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

Додати коментар або відгук