Pandas DataFrames в reportlab

У меня есть DataFrame, и я хочу вывести его в pdf. В настоящее время я пытаюсь использовать для этого ReportLab, но, похоже, это не сработает. Я получаю ошибку здесь:

        mytable = Table(make_pivot_table(data, pivot_cols, column_order, 'criterion'))

make_pivot_table просто возвращает сводную таблицу, используя функцию pandas pivot_table. Ошибка, которую я получаю,

ValueError: <Table@0x13D7D0F8 unknown rows x unknown cols>... invalid data type

Мои вопросы:

  1. Есть ли способ заставить reportlab работать с DataFrames?
  2. Если нет, то какой пакет я могу использовать для той же цели?

person Charles Dillon    schedule 09.07.2013    source источник
comment
Значит, проблема не в сводной таблице? Но это класс Table, что это? Можете ли вы привести простой пример DataFrame, который демонстрирует такое поведение (работает ли это для df = pd.DataFrame([[1, 2], [3, 4]])?)   -  person Andy Hayden    schedule 09.07.2013
comment
Извините, да, это связано с DataFrame, а не с pivot_table. Это не работает для вашего примера.   -  person Charles Dillon    schedule 09.07.2013
comment
Возможно, имеет смысл использовать этот пример вместо этого (было бы полезно, если бы мы могли воссоздать ошибку)... что такое переменные pivot_cols и column_order?   -  person Andy Hayden    schedule 09.07.2013
comment
Ваш пример воссоздает ту же ошибку. Я думаю, что просто таблица не будет принимать DataFrame. Я знаю, что make_pivot_table возвращает просто DataFrame. В документации Table говорится, что он может принимать все, что можно преобразовать в строку, что, как я думал, было чем угодно. Он принимает массивы numpy, поэтому я предположил, что он также будет использовать DataFrames. оказывается не   -  person Charles Dillon    schedule 09.07.2013
comment
Возможно, добавьте тикет в их систему отслеживания ошибок и/или отправьте электронное письмо по их списку рассылки. На данный момент, возможно, вы могли бы использовать df.values.   -  person Andy Hayden    schedule 09.07.2013
comment
У меня была аналогичная проблема. Вывод сгенерированных объектов pandas и matplotlib в pdf. В конце концов, я решил написать его сам и решил использовать латекс в качестве движка PDF. Latex отлично справляется практически со всеми задачами форматирования. Пришлось переписать код, чтобы получить кадр данных pandas (метод to_latex довольно ограничен). Конкретными проблемами, с которыми мне пришлось столкнуться, были многостраничные фреймы данных pandas для латекса, а также работа с мультииндексированными фреймами данных, входящими в латекс. Я относительно новичок в кодировании, поэтому у меня довольно неэлегантный код. Если вам интересно, я буду рад поделиться своим кодом.   -  person Joop    schedule 09.07.2013
comment
Мне очень интересно, было бы здорово! К сожалению, я пропустил этот комментарий до сих пор, поэтому мне понадобилась неделя, чтобы ответить.   -  person Charles Dillon    schedule 16.07.2013


Ответы (1)


Py

Привет,

Мне также нужно распечатать в формате .pdf некоторые Pandas DataFrame для организации отчетов. Я попробовал ReportLab напрямую с df и получил «AttributeError: объект DataFrame не имеет атрибута 'split'». Я попытался с df.values ​​() и получил «TypeError: объект« numpy.ndarray »не вызывается».

Когда я был близок к тому, чтобы отказаться от идеи построить отчет в формате .pdf, я попробовал str (df), и у меня был некоторый результат в формате .pdf :-) ... Код выглядит так:

import pandas as pd
from reportlab.pdfgen import canvas
PATH_OUT = "C:\\"
def pdf_df(c, testo, x, y):
    c.drawAlignedString(x,y, testo)
df = pd.DataFrame({'a':[3,4,5], 'b':[6,7,6],'c':[9,10,11]})
print df, type(df)
print''
df1 = (df['a'].groupby([df['b'], df['a']])).sum()
print df1, type(df1)
print ''
c = canvas.Canvas(PATH_OUT + 'out.pdf')
pdf_df (c, str(df), 300, 500)
pdf_df (c, str(df1), 300, 480)
c.showPage()
c.save()  

Что вы думаете ? Может ли это иметь смысл или может быть какой-то «умный» способ?

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

Фабио

=====

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

Это основано на сетках ReportLab, они работают со списками. Таким образом, код преобразует DF в список, который затем обрабатывается как сетка ReportLab :-)

Вот:

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import *
from reportlab.lib import colors
import pandas as pd
import random

PATH_OUT = "C:\\"

elements = []
styles = getSampleStyleSheet()
doc = SimpleDocTemplate(PATH_OUT + 'Report_File.pdf')
elements.append(Paragraph("Report Title", styles['Title']))

data = [[random.random() for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist()

ts = [('ALIGN', (1,1), (-1,-1), 'CENTER'),
     ('LINEABOVE', (0,0), (-1,0), 1, colors.purple),
     ('LINEBELOW', (0,0), (-1,0), 1, colors.purple),
     ('FONT', (0,0), (-1,0), 'Times-Bold'),
     ('LINEABOVE', (0,-1), (-1,-1), 1, colors.purple),
     ('LINEBELOW', (0,-1), (-1,-1), 0.5, colors.purple, 1, None, None, 4,1),
     ('LINEBELOW', (0,-1), (-1,-1), 1, colors.red),
     ('FONT', (0,-1), (-1,-1), 'Times-Bold'),
     ('BACKGROUND',(1,1),(-2,-2),colors.green),
     ('TEXTCOLOR',(0,0),(1,-1),colors.red)]

table = Table(lista, style=ts)
elements.append(table)

doc.build(elements)

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

До свидания, Фабио.

person Fabio Pomi    schedule 15.07.2013
comment
Спасибо за Ваш ответ! Однако это не кажется очень хорошим способом обработки вещей, особенно для больших таблиц разного размера. Тем не менее, спасибо за вашу помощь. - person Charles Dillon; 16.07.2013
comment
Да :-( .. Я полностью согласен .. но до сих пор я не был достаточно хорош, чтобы найти что-то лучше .. Я новичок в этом, и я надеялся получить какое-то предложение о том, как обрабатывать DataFrames в ReportLab . .. об ожидающем элементе, касающемся переноса строки, я получил неплохой результат с помощью str(df).splitlines() в цикле for для рисования холста. Автор, Фабио. - person Fabio Pomi; 16.07.2013
comment
Работает отлично. Спасибо - person renny; 29.08.2019