Ievads
Amplitude kā produkta analīzes rīks ir pierādījis sevi labi, pateicoties vienkāršai notikumu iestatīšanai un elastīgām vizualizācijām. Bieži vien rodas vajadzība izveidot savu atribūcijas modeli, veikt lietotāju klasterizāciju vai izveidot informācijas paneli citā BI sistēmā. To iespējams izdarīt tikai, ja ir neapstrādāti dati par notikumiem no Amplitude. Par to, kā iegūt šos datus ar minimālām programmēšanas zināšanām - šajā rakstā.
Prasības
- Projekts Amplitude, kurā jau ir pareizi iestatīti notikumi un pēc tiem tiek vākti statistika
- Uzstādīts python (strādāju ar versiju 3.8.3), ar kuru potenciālais lasītājs jau spēj strādāt vismaz pamata līmenī
Norādījums
Sol 1. API-key un secret-key iegūšana
Lai eksportētu datus, vispirms ir jāiegūst API-key un secret-key.
Tos var atrast, ejot pa sekojošu ceļu:
- «Manage data» (atrodas ekrāna kreisajā apakšējā daļā)
- Izvēlamies vajadzīgo projektu, no kura tiks eksportēti dati, un pārejam uz to
- Atvērtajā projekta izvēlnē izvēlamies «Project settings»
- Atrodam API-key un secret-key rindas, kopējam un glabājam tās drošā vietā.
Bez noklikšķināšanas varam doties uz saiti, kas vispārīgā veidā izskatās šādi:
analytics.amplitude.com/$$$$$$$/manage/project/*******/settings,
kur $$$$$$$ ir jūsu organizācijas lietotājvārds Amplitude, ****** — projekta numurs
Sol 2. Nepieciešamo bibliotēku pārbaude
Laba ziņa ir tā, ka šīs bibliotēkas praktiski noteikti jau ir instalētas noklusējuma ietvaros vai lejupielādētas, bet jāpārbauda. Pilns bibliotēku saraksts, ko izmantoju raksta rakstīšanas laikā (iekaldā versija norādīta, kur tas ir atbilstoši):
- requests (2.10.0) - pieprasījuma nosūtīšana caur api, lai iegūtu datus
- pandas (1.0.1) - json lasīšana, datu rāda izveide un turpmākā rakstīšana failā
- zipfile - failu izvilkšana no arhīva, kas iegūts caur API
- gzip - json failu izpakot no .gz
- os - failu saraksta iegūšana no izpakotā arhīva
- time - opcional, laika mērīšana skripta darbībai
- tqdm - opcional, ērtai failu apstrādes progresa novērošanai
Sol 3. Datu ielādēšanas skripta rakstīšana
Padoms: pilns ielādes skripts ir raksta beigās, pēc vēlēšanās to var ņemt uzreiz un pievērsties soli pa solim paskaidrojumiem pēc vajadzības.
Sol 3.1. Bibliotēku importēšana
Importējam visas bibliotēkas, kas minētas otrajā solī.
# Импорт библиотек
import requests
import pandas as pd
import zipfile
import gzip
import os
import time
import tqdm
from tqdm import tqdm
3.2. solis. Pieprasījuma nosūtīšana uz Amplitude
Mērīsim skripta izpildes sākumu un ierakstīsim mainīgajā a.
startdate un enddate nosaka datu eksportēšanas periodu un tiek iekļauti nosūtītā pieprasījuma tekstā uz servera Amplitude, papildus datumam var norādīt arī stundu, mainot vērtību pēc 'T' pieprasījumā.
api_key un secret_key atbilst pirmajā solī iegūtajām vērtībām, drošības nolūkos šeit norādu nejaušas secības vietā savām.
a = time.time()
# Sākuma un beigu datuma parametri
startdate = '20200627'
enddate = '20200628'
api_key = 'kldfg844203rkwekfjs9234'
secret_key = '094tfjdsfmw93mxwfek'
# Pieprasījuma nosūtīšana uz Amplitude
response = requests.get('https://amplitude.com/api/2/export?start=' + startdate + 'T0&end=' + enddate + 'T0', auth = (api_key, secret_key))
print('1. Pieprasījums nosūtīts')
3.3. solis. Arhīva lejupielāde ar datiem
Izdomājam arhīva nosaukumu un ierakstām mainīgajā filename. Savām ērtībām norādu periodu + norādu, ka tie ir Amplitude dati. Tāpat ierakstām saņemto atbildi no Amplitude arhīvā.
# Скачивание архива с данными
filename = 'period_since'+startdate+'to'+enddate+'_amplitude_data'
with open(filename + '.zip', "wb") as code:
code.write(response.content)
print('2. Архив с файлами успешно скачан')
3.4. solis. Failu izvilkšana datorā
Te ir iesaistīta zipfile bibliotēka, kas palīdzēs izvilkt failus. Trešajā rindā esiet uzmanīgi un norādiet savu ceļu, kur ērtāk būtu veikt izvilkšanu.
# Извлечение файлов в папку на компьютере
z = zipfile.ZipFile(filename + '.zip', 'r')
z.extractall(path = 'C:\Users\...\'+filename)
print('3. Архив с файлами извлечен и записан в папку ' + filename)
3.5. solis. json pārvēršana
Pēc failu izvilkšanas no arhīva nepieciešams pārvērst json failus, kas ir .gz formātā, un ierakstīt tos dataframe turpmākai darbībai.
Uzmanību, šeit atkal ir jāmaina ceļš uz savu, un vietā 000000 jāieraksta sava projekta numurs no Amplitude (vai manuāli atvērt ceļu, kur tika izvilkts arhīvs, un paskatīties mape nosaukumā iekšā).
Pēc secības:
Ierakstām direktoriju mainīgajā, iegūstam failu sarakstu no direktorijas, izveidojam tukšu dataframe, time.sleep(1) lai precīzi darbotos tqdm, ciklā atveram .gz failus un uzreiz ar pandas lasām json un piepildām noteikto 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')
3.6. solis. Dataframe ierakstīšana excel
Eksportēšana uz excel šeit ir tikai piemērs. Daudzos gadījumos ērtāk ir strādāt ar iegūto datu kadru iekš python vai uzkrāt datus krātuvē.
Ceļš datu eksportēšanai šeit arī ir jāmaina uz savu.
# Записать полученной таблицы в Excel-файл
amplitude_dataframe.to_excel('C:\Users\...\'+filename+'.xlsx',index=False)
print('5. Dataframe успешно записан в файл ' + filename)
3.7. solis. Mērām skripta izpildes laiku
Ierakstām pašreizējo laiku mainīgajā b, aprēķinam atšķirību un minūšu skaitu, izvadām kopējo minūšu skaitu. Tas ir pēdējais solis.
b = time.time()
diff = b-a
minutes = diff//60
print('Koda izpilde aizņēma: {:.0f} minūtes(ēs)'.format(minutes))
Secinājums
Lai izsauktu tabulu un sāktu ar to strādāt, var izsaukt mainīgo amplitude_dataframe, kurā ir saglabāti dati. Tajā būs apmēram 50 kolonnas, no kurām 80% gadījumu jums būs jāizmanto: event_type — notikuma nosaukums, event_properties — notikuma parametri, event_time — notikuma laiks, uuid — klienta ID, user_properties — klienta parametri, ar tiem vispirms vajadzētu sākt darbu. Salīdzinot skaitļus no pašiem aprēķiniem ar rādītājiem no Amplitude paneliem, nedrīkst aizmirst, ka sistēma izmanto savu unikālo klientu/funnel aprēķināšanas metodoloģiju utt., un pirms tam noteikti vajadzētu iepazīties ar Amplitude dokumentāciju.
Paldies par uzmanību! Tagad jūs varat eksportēt neapstrādātos notikumu datus uz Amplitude un pilnvērtīgi tos izmantot savā darbā.
Viss skripts:
# Импорт библиотек
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))
Avots: habr.com
