Как читать и записывать данные из/в таблицу Quip, используя Quip Python API

Мастерство чтения и записи данных в таблицу Quip с помощью Quip Python API

Мы аналитики часто просим предоставить решение, которое позволит конечному пользователю внести свои входные данные, которые затем могут быть использованы как переопределения/дополнительный контекст в конечном аналитическом решении.

Фото: Крис Рид на Unsplash

Давайте рассмотрим пример приложения электронной коммерции. В системе есть логика, по которой поставщик помещается в черный список при получении 100 отрицательных отзывов от клиентов. Однако могут возникнуть ситуации, когда отрицательный рейтинг был вызван проблемой с использованием приложения или проблемами с доставкой/возвратом. Чтобы сохранить справедливость, поставщику предоставляется возможность оспорить включение в черный список каждые полгода. В целях этой статьи предположим, что утверждение/отклонение записано в офлайн-таблице.

Все новые обращения о снятии черного списка, созданные за неделю, экспортируются в таблицу и отправляются команде для рассмотрения. Команда просматривает данные и утверждает или отклоняет их. Затем данные отправляются для обновления в системе. Это еженедельное мероприятие.

Теперь эти данные, требующие ручного вмешательства, необходимо добавить в систему. Существуют различные способы это сделать. Пользователи могут загружать свои данные в хранилище S3, которое затем можно запланировать для чтения в базу данных. Или мы можем использовать Quip, чтобы все пользователи могли обновлять одну и ту же таблицу в режиме реального времени, и это можно будет загрузить в базу данных с фиксированной периодичностью.

Quip – это совместное программное обеспечение, которое позволяет нескольким людям редактировать документы, таблицы на ходу, позволяя им использовать любого конечного клиента – рабочий стол/мобильное устройство.

В этой статье я покажу вам, как я автоматизировал таблицу Quip для чтения данных, введенных пользователями, загрузки их в таблицу базы данных, а затем записи новых данных в эту же таблицу Quip. В качестве базы данных для этого упражнения я буду использовать Redshift.

Эту задачу можно разделить на две отдельные части. Первая – чтение данных из таблицы Quip и сохранение их в таблице базы данных. Вторая – мы будем производить некоторые манипуляции с данными или проверки по этим данным и объединять их с предварительно существующими данными в базе данных, а затем записывать измененные данные в уже существующую таблицу Quip. Рассмотрим эти два случая отдельно, чтобы если вы хотите только прочитать или только записать, эта статья поможет вам в этом. Рассмотрим первую часть.

Часть 1 – Чтение данных из таблицы Quip и запись их в таблицу базы данных.

Шаг 1: Получение токена доступа для подключения к Quip с использованием API Quip.

Нам нужно сгенерировать токен доступа, который предоставит доступ к API нашей персональной учетной записи Quip. Чтобы сгенерировать персональный токен доступа, посетите эту страницу: https://quip.com/dev/token. Если у вас есть учетная запись Quip с включенной корпоративной одностраничной авторизацией (SSO), то URL будет немного отличаться, например, так: https://quip-corporate.com/dev/token

После нажатия на кнопку “Get Personal Access Token” выше вы получите токен, который мы будем использовать в последующих разделах для доступа к таблице Quip с помощью API.

Шаг 2: Импорт библиотек

Давайте сначала импортируем необходимые библиотеки. Для этой части мы в основном будем использовать библиотеки quipclient и pandas_redshift.

import quipclient as quipimport pandas as pdimport numpy as npimport pandas_redshift as primport boto3from datetime import datetime as dtimport psycopg2import warningswarnings.filterwarnings('ignore')import socket

Шаг 3: Подключение к Quip с использованием идентификатора токена

API QuipClient требуется базовый URL, идентификатор потока и токен доступа для доступа к любому файлу. Базовый URL – это URL сервера Quip, с которого вы пытаетесь считать (или записать) файл. В случае корпоративных учетных записей обычно в URL будет указано название корпорации. Идентификатор потока – это уникальный идентификатор для всех файлов на сервере Quip. Это алфавитно-цифровое значение после базового URL целевого файла, в данном случае электронной таблицы.

Если URL файла выглядит следующим образом – https://platform.quip-XXXXXXXXX.com/abcdefgh1234/, то базовый URL будет – https://platform.quip-XXXXXXXXX.com, и идентификатор потока будет – abcdefgh1234.

Токен доступа – это тот, который мы только что сгенерировали на шаге 1.

Теперь, используя API QuipClient, мы подключаемся к URL с помощью токена доступа и идентификатора потока.

##################################### # объявление переменных Quip #####################################baseurl = 'https://platform.quip-XXXXXXXXX.com'access_token = "************************************************************************" thread_id = 'abcdefgh1234'########################################### подключение к Quip##########################################client = quip.QuipClient(access_token = access_token, base_url=baseurl)rawdictionary = client.get_thread(thread_id)

Шаг 4: Чтение данных из Quip в фрейм данных

Выход rawdictionary из Шага 3 выше возвращает список HTML-файлов. Функция read_html библиотеки Pandas поможет прочитать HTML-часть в фрейм данных dfs. Таким образом, dfs – это список фреймов данных. Каждый фрейм данных в этом списке содержит данные из каждой вкладки электронной таблицы Quip. В этом примере рассматриваются только данные из последней вкладки. Поэтому использован индекс -1, чтобы получить последний фрейм данных в raw_df.

########################################### очистка данных и создание фрейм данных##########################################dfs=pd.read_html(rawdictionary['html'])raw_df = dfs[-1]raw_df.columns=raw_df.iloc[0] #Сделать первую строку заголовком столбцарaw_df=raw_df.iloc[1:,1:] #После предыдущего шага первые две строки становятся дубликатом. Удалите первую строку.raw_df=raw_df.replace('\u200b', np.nan) #Замена пустых ячеек на nan

Шаг 5: Подключение к базе данных для записи данных в таблицу

Для доступа к экземпляру Redshift нам понадобится ссылка на конечную точку в Redshift. Например, экземпляры выглядят так:

datawarehouse.some_chars_here.region_name.redshift.amazonaws.com.

Мы подключаемся к базе данных и записываем фрейм данных (созданный на шаге 4) в новую или существующую таблицу. Функция pandas_to_redshift позволяет добавить данные в существующую таблицу или заменить их полностью. Обратите внимание, что если вы выберете append = False, таблица будет удаляться и пересоздаваться каждый раз при выполнении этой операции. Если вы хотите сохранить типы данных или длину символов определенных столбцов или разрешения пользователей при перезаписи данных, лучше очистить таблицу перед выполнением этой операции. Вы можете очистить таблицу, выполнив прямую команду TRUNCATE. SQLAlchemy и psycopg2 – это более простые варианты для этого. После очистки таблицы вы можете выполнить операцию с append = True. Я обычно использую append=True для таблиц типа 2, где я должен сохранять исторические данные.

#### Очистка Таблицы ############################################### Подключение к базе данных##########################################user1="пользователь"pswd1="пароль"connection_db=psycopg2.connect(dbname = 'test_db',                              host='test_host.com',                              port= '1234',                              user= user1,                              password= pswd1)########################################### Соединение установлено##########################################df = pd.read_sql_query("""Select distinct from test_tableorder by 1 asc""",connection_db)result = df.to_markdown(index=False)cur = connection_db.cursor()cur.execute('TRUNCATE TABLE test_table')

#### Запись в таблицу ############################################### Подключение к Redshift и S3##########################################pr.connect_to_redshift(dbname = 'db',                        host = 'server.com',                        port = 1234,                        user = 'user',                        password = 'password')pr.connect_to_s3(aws_access_key_id = '*************',                aws_secret_access_key = '*************************',                bucket = 'test',                subdirectory = 'subtest')########################################### Запись фрейма данных в S3, а затем в Redshift##########################################pr.pandas_to_redshift(data_frame = raw_df,                        redshift_table_name = 'test_table',append = True,                        region = 'xxxxxxx')

Это завершает первую часть, где вы считываете данные из таблицы Quip и записываете их в таблицу Redshift. Теперь давайте рассмотрим вторую часть.

Часть 2: Запись данных в существующую таблицу Quip.

Для этой части первые три шага остаются теми же, что и в Части 1. Так что, пожалуйста, следуйте шагам 1, 2 и 3, описанным выше. Мы начнем с ШАГА 4.

Шаг 4: Подключение к базе данных для чтения данных

Мы будем использовать psycopg2 для подключения к экземпляру Redshift и чтения данных из таблицы Redshift, которые необходимо записать в таблицу Quip. Здесь я преобразую фрейм данных в markdown, чтобы получить чистую таблицу, которая также является предварительным условием библиотеки QuipClient.

########################################### Подключение к базе данных##########################################user1="пользователь"pswd1="пароль"connection_db=psycopg2.connect(dbname = 'test_db',                              host='test_host.com',                              port= '1234',                              user= user1,                              password= pswd1)########################################### Соединение установлено##########################################df = pd.read_sql_query("""Выбрать distinct из test_tableorder by 1 asc""",connection_db)result = df.to_markdown(index=False) 

Шаг 5: Запись данных в файл Quip

Для записи данных в таблицу Quip, вы можете использовать функцию edit_document из библиотеки QuipClient. Эта функция имеет несколько параметров. Формат может быть либо HTML, либо markdown. По умолчанию используется HTML, и поэтому мы преобразовали фрейм данных в markdown на Шаге 4. Вам нужно указать section_id и location, чтобы указать, где вы хотите добавить данные — добавить, предварительно добавить, после/до определенного раздела и т.д. В этом конкретном сценарии я хотел просто добавить данные на новую вкладку существующей таблицы. Вы можете узнать больше об этом здесь.

Иногда операция выполняется, но скрипт все равно не работает из-за задержки в ответе API. Блок обработки ошибок try-except предназначен для перехвата ошибок времени ожидания.

########################################### Вставка данных в Quip##########################################  try:  client.edit_document(thread_id=thread_id,                      content = result,                    format='markdown',                    operation=client.APPEND)  print("База данных Test обновлена.")except socket.timeout:  print("Ошибка Обработана!")

И мы завершили!

Надеюсь, вы найдете эту статью полезной. Пожалуйста, не стесняйтесь обращаться, если у вас есть дополнительные вопросы.

Спасибо за чтение!

До следующего раза…