ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… 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