Рубрики
Без рубрики

Экспорт панд -данных DataFrames в Google Sheets

В недавнем проекте мне нужно было поделиться результатами, полученными из некоторого анализа данных с пандами в … Помечено Python, Pandas, Data Science, Google Sheets.

В недавнем проекте мне нужно было поделиться результатами, полученными из некоторого анализа данных с Панды В формате CSV в Google Sheets. Первым подходом, который я попробовал, был использование Gsheets Что довольно приятно, но у него есть недостатки:

  • Его аутентификация опирается на oauth2client который был устарел.
  • Это import_csv Метод всегда заменяет всю электронную таблицу, и мне нужно было иметь несколько внутренних листов, которые учитывали разные переменные одинаковых данных.

Итак, я решил придумать свое решение. Перво -наперво, вам нужно настроить новый проект на Google Cloud Console И создайте учетные данные, убедитесь, что они имеют учетную запись Service Type, которая позволит сервер к серверу. После создания учетных данных скачать как Json и переместить его в папку проекта.

Затем перейдите в консоль Библиотека API И включите как API листов, так и API Drive, позже необходимо поделиться созданием электронной таблицы.

Находясь в папке проектов, мы добавим следующие зависимости в наш файл требований:

google-api-python-client
google-auth
pandas
numpy

И установите их запуск:

$ pip install -r requirements.txt

Теперь, когда наша установка готова, мы можем аутентифицировать наш проект с помощью следующего кода:

credentials = service_account.Credentials.from_service_account_file(
    "./path/to/credentials.json"
)

scopes = credentials.with_scopes(
    [
        "https://www.googleapis.com/auth/spreadsheets",
        "https://www.googleapis.com/auth/drive",
    ]
)

URL -адреса для областей можно найти Здесь Анкет

Первое, что нам нужно, – это способ создать электронную таблицу из DataFrames Pandas, поэтому мы можем определить функцию, которая получает два параметра, заголовок электронной таблицы и список DataFrames:

def create_sheet(title, data):
    sheets_service = build("sheets", "v4", credentials=credentials)
    sheets = sheets_service.spreadsheets()

    # Body of create method with a Spreadsheet(https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet) instance
    create_body = {"properties": {"title": f"{title} {date.today()}"},
                   "sheets": list(map(lambda d: {"properties": {"title": d.get("title")}}, data))}
    res = sheets.create(body=create_body).execute()
    spreadsheet_id = res.get("spreadsheetId")

    # Transform the DataFrame into a matrix of the columns and values
    def df_to_sheet(df):
        df_columns = [np.array(df.columns)]
        df_values = df.values.tolist()
        df_to_sheet = np.concatenate((df_columns, df_values)).tolist()
        return df_to_sheet

    update_body = {
        "valueInputOption": "RAW",
        "data": list(map(lambda d: {"range": d.get("title"), "values": df_to_sheet(d.get("df"))}, data))
    }

    sheets.values().batchUpdate(spreadsheetId=spreadsheet_id, body=update_body).execute()

    return res

Вышеуказанная функция может быть названа следующей:

data = [
    {
        "title": "Tab/Sheet Title",
        "df": pd.DataFrame({})
    }
]
res = create_sheet("Title", data=data)

С res быть экземпляр электронной таблицы Анкет

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

def share_spreadsheet(spreadsheet_id, options, notify=False):
    drive_service = build("drive", "v3", credentials=credentials)

    res = (
        drive_service.permissions()
        .create(
            fileId=spreadsheet_id,
            body=options,
            sendNotificationEmail=notify,
        )
        .execute()
    )

    return res

Все возможные значения для аргумента параметров можно найти на Drive API документация . Вы можете поделиться им с конкретным пользователем или предоставить доступ к каждой учетной записи в соответствии с определенным доменом.

Мы можем определить основную функцию, которая объединяет как создание, так и обмен сценариями, и возвращает URL -адрес электронной таблицы.

def create_and_share_spreadsheet(title, data, permissions):
    sheet = create_sheet(title, data)
    share_spreadsheet(sheet.get("spreadsheetId"), options=permissions.get(
        "info"), notify=permissions.get("notify"))

    return sheet.get("spreadsheetUrl")

Вуаля, все это, собранное в файле, можно найти в этом суть . Там еще много места для улучшения, поэтому он может получить некоторые обновления, которые будут отличаться от фрагментов этого поста.

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

Оригинал: “https://dev.to/olarclara/exporting-pandas-dataframes-to-google-sheets-33e8”