Возврат фрейма данных для превосходства через xlwings UDF

Я пытаюсь создать пользовательскую функцию, используя Python, библиотеку Xlwings и Excel.

Цель состоит в том, чтобы использовать функцию, давайте вызовем ret_data_frames, чтобы заполнить не только ячейку A1, но и все необходимые ячейки для возврата всего фрейма данных.

Как на изображениях выше:

введите здесь описание изображения

введите здесь описание изображения

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

import numpy as np
import pandas as pd

def get_data_frame(data):
    dates = pd.date_range(data,periods=6)
    df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))

После этого необходимо создать функцию UDF

import xlwings as xw
from test import get_data_frame

@xw.func
def ret_data_frame(data):
    return get_data_frame(data)

Эта идея не работает, поэтому вопрос:

Можно ли использовать UDF для воспроизведения фреймов данных?

Спасибо


person Thales Marques    schedule 12.09.2017    source источник
comment
Если пользовательская функция вводится как формула массива (например, выберите ячейки A1:D5, затем введите =ret_data_frame() в ячейку A1 и нажмите Ctrl-Shift-Enter, а не просто Enter), то пользовательская функция может вернуть массив (в данном случае 5x4 двух- размерный массив). В любом случае, именно так это работает с VBA - это может работать или не работать с xlwings.   -  person YowE3K    schedule 13.09.2017
comment
Размеры этого фрейма данных являются динамическими. Я думал об использовании формулы массива, но как я могу создать UDF, который вставляет весь фрейм данных? Используя идею массива, я не знаю, каковы размеры фрейма данных.   -  person Thales Marques    schedule 13.09.2017
comment
Без использования формулы массива UDF теоретически может возвращать только одно значение в ячейку, содержащую вызов функции. Теоретически он не может каким-либо другим образом изменить среду Excel. (Теоретически - потому что есть некоторые [довольно опасные] способы обойти это.)   -  person YowE3K    schedule 13.09.2017
comment
Не могли бы вы добавить одно из событий рабочего листа (возможно, Worksheet_SelectionChange или Worksheet_Calculate или Worksheet_BeforeDoubleClick) для вызова вашей функции. Ограничения на обновление только одной ячейки применяются только к пользовательским функциям (т. е. к функциям, вызываемым из ячейки Excel), а не к точно такому же коду, вызываемому из события.   -  person YowE3K    schedule 13.09.2017
comment
Понял. Я думаю, что моя идея не может быть реализована. Вы ответили на мой вопрос. Если хотите, опубликуйте это решение, и я приму ответ.   -  person Thales Marques    schedule 14.09.2017
comment
чтение документации помогает: docs.xlwings.org/en/stable /udfs.html#динамические-массивы-формулы   -  person Felix Zumstein    schedule 14.09.2017


Ответы (2)


Это то, что сработало для меня:

@xw.func
@xw.arg('x', pd.DataFrame, index=False, header=True)
@xw.ret(header=True)
def get_my_df(x):
    return x

И есть разные способы вернуть dataFrame, с помощью этого

@xw.ret(header=True, index=True, expand='table')

вы можете сразу вернуть dataFrame в Excel, без необходимости оборачивать его в формулы массива Excel.

person Alexander Shubert    schedule 22.09.2018

У вас должен быть правильный xlwings reutrn

@xw.ret (индекс = ложь, заголовок = правда, расширение = 'таблица')

декоратор в верхней части вашей функции

@xw.func
@xw.ret(index=False, header=True, expand='table')
def ret_data_frame(data):
    return get_data_frame(data)
person ajaali    schedule 28.03.2018
comment
Привет, я знаю, что это старая тема... в данном случае данные - это имя кадра данных? - person Alex Walton; 17.07.2019
comment
Привет, данные - это просто пример аргумента, это может быть что угодно. можно даже удалить. Пример очень абстрактный. Суть в том, что у вас должен быть тег @xw.ret - person ajaali; 07.08.2019