Pobieranie danych z Amplitude za pośrednictwem API

Wprowadzenie

Amplitude jako narzędzie analityki produktowej sprawdził się doskonale dzięki prostemu konfigurowaniu zdarzeń i elastyczności wizualizacji. Często pojawia się potrzeba stworzenia własnego modelu atrybucji, przeprowadzenia klasteryzacji użytkowników lub zbudowania dashboardu w innym systemie BI. Taką operację można wykonać tylko mając surowe dane o zdarzeniach z Amplitude. O tym, jak uzyskać te dane przy minimalnych umiejętnościach programistycznych, będzie w tym artykule.

Wymagania wstępne

  1. Projekt w Amplitude, w którym zdarzenia są już prawidłowo skonfigurowane i statystyki są zbierane
  2. Zainstalowany Python (pracuję w wersji 3.8.3), z którym potencjalny czytelnik już umie pracować przynajmniej na podstawowym poziomie

Instrukcja

Krok 1. Uzyskanie API-key i secret-key

Aby wyeksportować dane, najpierw musisz uzyskać API-key i secret-key.

Można je znaleźć, przechodząc według następującej ścieżki:

  1. „Zarządzaj danymi” (znajduje się w lewym dolnym rogu ekranu)
  2. Wybieramy odpowiedni projekt, z którego będą eksportowane dane, i przechodzimy do niego
  3. W otwartym menu projektu wybieramy „Ustawienia projektu”
  4. Znajdujemy wiersze API-key i secret-key, kopiujemy je i przechowujemy w bezpiecznym miejscu.

Bez klikania można przejść pod link, który w ogólnym widoku wygląda tak:
analytics.amplitude.com/$$$$$$$/manage/project/*******/settings,
gdzie $$$$$$$ — to login Twojej organizacji w Amplitude, ****** — numer projektu

Krok 2. Sprawdzenie obecności potrzebnych bibliotek

Dobrą wiadomością jest to, że te biblioteki są prawdopodobnie już zainstalowane domyślnie lub pobrane, ale należy to sprawdzić. Pełna lista bibliotek, których używam w momencie pisania artykułu (w nawiasach podano wersje, gdzie to odpowiednie):

  1. requests (2.10.0) - wysyłanie zapytań przez API w celu uzyskania danych
  2. pandas (1.0.1) — czytanie JSON, tworzenie DataFrame i późniejsze zapisywanie do pliku
  3. zipfile — wydobycie plików z archiwum uzyskanego przez API
  4. gzip — dekompresja plików JSON z .gz
  5. os — uzyskanie listy plików z rozpakowanego archiwum
  6. time — opcjonalne, mierzenie czasu działania skryptu
  7. tqdm — opcjonalne, dla wygody obserwacji postępu przetwarzania plików

Krok 3. Pisanie skryptu do ładowania danych

Wskazówka: pełny skrypt ładowania znajduje się na końcu artykułu, w razie potrzeby można go od razu wziąć i zwrócić się do krokowych wyjaśnień w razie potrzeby.

Krok 3.1. Importowanie bibliotek

Importujemy wszystkie biblioteki wymienione w drugim kroku.

# Импорт библиотек
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm

Krok 3.2. Wysyłanie zapytania do Amplitude

Dokonamy pomiaru początku wykonywania skryptu i zapiszemy w zmiennej a.

startdate i enddate odpowiadają za okres eksportu danych i wbudowane są w tekst wysłanego zapytania do serwer Amplitude, oprócz daty można również podać godzinę, zmieniając wartość po 'T' w zapytaniu.

api_key i secret_key odpowiadają wartościom uzyskanym w pierwszym kroku, dla bezpieczeństwa tutaj podaję losowe ciągi zamiast swoich.

a = time.time()
# Parametry początkowej i końcowej daty
startdate = '20200627'
enddate = '20200628'

api_key = 'kldfg844203rkwekfjs9234'
secret_key = '094tfjdsfmw93mxwfek'
# Wysyłanie zapytania do Amplitude
response = requests.get('https://amplitude.com/api/2/export?start=' + startdate + 'T0&end=' + enddate + 'T0', auth=(api_key, secret_key))
print('1. Zapytanie zostało wysłane')

Krok 3.3. Pobieranie archiwum z danymi

Wymyślamy nazwę dla archiwum i zapisujemy ją w zmiennej filename. Dla własnej wygody podaję okres + zaznaczam, że to dane Amplitude. Następnie zapisujemy otrzoną odpowiedź od Amplitude w archiwum.

# Скачивание архива с данными
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
    code.write(response.content)
print('2. Архив с файлами успешно скачан')  

Krok 3.4. Ekstrakcja plików na komputerze

W akcję wkracza biblioteka zipfile, która pomoże w realizacji ekstrakcji plików. W trzeciej linii bądź ostrożny i wpisz swoją ścieżkę, gdzie wygodniej będzie przeprowadzić ekstrakcję.

# Извлечение файлов в папку на компьютере
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. Архив с файлами извлечен и записан в папку ' + filename)

Krok 3.5. Przekształcanie json

Po ekstrakcji plików z archiwum należy przekształcić pliki json, które są w formacie .gz i zapisać je w dataframe do dalszej obróbki.

Zwracam uwagę, że tutaj należy ponownie zmienić ścieżkę na swoją, a zamiast 000000 wpisać swój numer projektu w Amplitude (lub ręcznie otworzyć ścieżkę, gdzie zextractowano archiwum, i sprawdzić nazwę folderu wewnątrz).

W kolejności:

Zapiszanie katalogu w zmiennej, uzyskiwanie listy plików z katalogu, tworzenie pustego dataframe, time.sleep(1) dla poprawnej pracy tqdm, w pętli otwieramy pliki .gz i od razu przy pomocy pandas odczytujemy json i zapełniamy dany dataframe.

# Преобразование 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')

Krok 3.6. Zapis dataframe do excel

Eksport do excela tutaj jest po prostu przykładem. W wielu przypadkach wygodniej jest pracować z uzyskanym ramką danych w Pythonie lub przechować dane w magazynie.

Zamienić ścieżkę eksportu danych tutaj również trzeba będzie na swoją.

# Записать полученной таблицы в Excel-файл
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe успешно записан в файл ' + filename)

Krok 3.7. Mierzymy czas pracy skryptu

Zapisujemy aktualny czas w zmiennej b, obliczamy różnicę i liczbę minut, wyświetlamy sumę minut. To jest ostatni krok.

b = time.time()
diff = b-a
minutes = diff//60
print('Czas wykonania kodu wyniósł: {:.0f} minut(ę)'.format(minutes))

Podsumowanie

Aby wywołać tabelę i zacząć z nią pracować, należy użyć zmiennej amplitude_dataframe, w której zapisane są dane. Będzie ona zawierać około 50 kolumn, z których w 80% przypadków użyjesz: event_type — nazwa zdarzenia, event_properties — parametry zdarzenia, event_time — czas zdarzenia, uuid — id klienta, user_properties — parametry klienta; warto zacząć pracę przede wszystkim od nich. Przy porównywaniu danych z własnych obliczeń z danymi z pulpitów Amplitude nie można zapominać, że system stosuje własną metodologię obliczania unikalnych klientów/lejkow itp., dlatego koniecznie należy zapoznać się z dokumentacją Amplitude.

Dziękujemy za uwagę! Teraz możesz eksportować surowe dane o zdarzeniach w Amplitude i w pełni je wykorzystywać w swojej pracy.

Cały skrypt:

# Импорт библиотек
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))

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster