В 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, чтобы сделать много полезного анализа.