В Google BigQuery есть еще один интересный набор данных. Специально для разработчиков Python. Он содержит файлы для загрузки данных с сервера pypi. Pypi или Pythion Packaging Index - это репозиторий пакетов Python, откуда загружаются различные библиотеки для разработки на Python. Мы можем проанализировать статистику загрузок, чтобы найти наиболее важные пакеты Python, а также файлы. Я также попытался провести анализ тенденций, используя самый простой из возможных методов. Я оценивал загружаемые пакеты на ежемесячной основе, а затем отслеживал, какой пакет имеет самый большой скачок в рейтинге с января 2021 года по сентябрь 2021 года. Посмотрим, найдется ли вам такой результат одинаково интересным.

Шаг 1

Настроить учетные данные приложения google

Вам потребуется учетная запись разработчика Googles, и выполните действия по созданию ключей и настройке учетных данных. Подробности можно найти здесь:

https://cloud.google.com/bigquery/docs/quickstarts/quickstart-cloud-console
import os 
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] =\
r'/Users/pankaj/PycharmProjects/google/credentianls/travel-planner-196103-ac0eba51cb51.json'

Шаг 2

Создать большой клиент запросов

Мы можем использовать облачную библиотеку Google для взаимодействия с BigQuery

from google.cloud import bigquery
from google.auth.credentials import Credentials
import pandas as pd
client = bigquery.Client()

Шаг 3

Получить результаты запроса

Нам нужно сформировать запрос, который мы можем запустить на платформе Google BigQuery. Я выполняю запрос, который возвращает все записи с 1 января 2021 года по настоящее время для всех загрузок. Я собираюсь использовать счетчик загрузок

query_job = client.query(
    """  
    select year, month, project,  count(1) as proj_count from (
    SELECT  extract(year from timestamp at time zone 'UTC') as year, 
    extract(month from timestamp at time zone 'UTC') as month,
    project, 
    from bigquery-public-data.pypi.file_downloads 
    where timestamp > '2021-01-01'
   )
    group by 
    year, 
    month,
    project
    order by proj_count desc 
    """
)

results = list(query_job.result() )

Затем мы создадим фрейм данных из приведенных выше результатов для анализа данных.

results[:10]
[Row((2021, 8, 'botocore', 189801166), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 2, 'urllib3', 185219115), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 8, 'urllib3', 183198062), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 7, 'urllib3', 181189450), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 3, 'urllib3', 172248655), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 2, 'boto3', 164025271), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 7, 'botocore', 161875662), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 6, 'urllib3', 161547752), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 9, 'botocore', 157741525), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3}),
 Row((2021, 4, 'boto3', 155737735), {'year': 0, 'month': 1, 'project': 2, 'proj_count': 3})]
results[0].keys()
dict_keys(['year', 'month', 'project', 'proj_count'])
results[0].values()
(2021, 8, 'botocore', 189801166)

Приведенный ниже код создает фрейм данных результатов и вычисляет ежемесячный рейтинг пакетов по их количеству загрузок.

df = pd.DataFrame([r.values() for r in results], columns = results[0].keys())
df['month_rank']=df.groupby("month")["proj_count"].rank("dense", ascending=False)
def get_google_bigquery_results(query):
    query_job = client.query(query)
    results = list(query_job.result() ) 
    df = pd.DataFrame([r.values() for r in results], columns = results[0].keys())
    return  df

Как видно из приведенной ниже таблицы, самый популярный проект ежемесячной загрузки - это ботокор за август.

df.head()

Ниже приведены самые популярные загрузки за август.

df[df.month ==8].head(10)

df.shape
(2773824, 4)

Мы создаем список всех пакетов с рейтингом менее 150. Мы также создадим сводную таблицу для значений рейтинга по месяцам и проектам. Мы отбросим все столбцы со значением NA.

project_change = df[df['month_rank']<150].sort_values('month').pivot_table(index='project', 
                                                                           columns ='month', values = 'month_rank')
project_change.head(3)

project_change = project_change.T
proj_changes_nona= project_change.dropna(axis =1)

Теперь посчитаем изменение ранга с первого месяца на последний. Пакет с наибольшим изменением рейтинга можно рассматривать как более популярный, если изменение положительное.

project_rank_change_dict = {column:  list(proj_changes_nona[column]) for column in proj_changes_nona.columns}
jumps = sorted({k: v[0]-v[-1] for k,v in project_rank_change_dict.items()}.items(),
               key = lambda x:x[1], reverse = True)

Ниже приведены пакеты с самым большим положительным скачком в рейтинге.

jumps[:15]
[('kiwisolver', 54.0),
 ('itsdangerous', 51.0),
 ('flask', 50.0),
 ('docker', 49.0),
 ('tabulate', 48.0),
 ('filelock', 47.0),
 ('matplotlib', 38.0),
 ('sqlalchemy', 32.0),
 ('azure-common', 28.0),
 ('werkzeug', 28.0),
 ('soupsieve', 26.0),
 ('virtualenv', 24.0),
 ('regex', 23.0),
 ('azure-core', 22.0),
 ('websocket-client', 22.0)]

Ниже приведены пакеты с самым большим отрицательным скачком в рейтинге.

jumps[-15:]
[('joblib', -25.0),
 ('traitlets', -26.0),
 ('google-api-python-client', -27.0),
 ('pexpect', -28.0),
 ('future', -30.0),
 ('parso', -31.0),
 ('prompt-toolkit', -31.0),
 ('ptyprocess', -32.0),
 ('futures', -34.0),
 ('absl-py', -39.0),
 ('uritemplate', -41.0),
 ('tornado', -45.0),
 ('google-auth-httplib2', -47.0),
 ('lxml', -56.0),
 ('pyopenssl', -65.0)]

Как видно из вышесказанного, изменение рейтинга проекта kiwisolver было самым резким - на 54 пункта. Мы можем проверить это, следуя коду. Как мы видим, в январе рейтинг этого пакета был 145, а в сентябре - 91 место.

project_change['kiwisolver']
month
1    145.0
2    147.0
3    148.0
4    113.0
5    103.0
6    102.0
7    103.0
8     92.0
9     91.0
Name: kiwisolver, dtype: float64

Заключение

Статистика загрузок дает полезные сведения о тенденциях и популярности пакетов и методов разработки программного обеспечения. Одним из преимуществ доступности этих данных на платформе Google Query является то, что мы можем подобрать подходящие SQL-запросы и подключиться через Python, чтобы сделать много полезного анализа.

использованная литература