У меня есть база данных, созданная в результате опроса для оценки университетских профессоров. Мне нужен сценарий python, который берет информацию из этой базы данных, генерирует графическую таблицу для каждого пользователя, создает графики для каждого пользователя, а затем отображает ее в шаблоне для экспорта в pdf.
Как выглядит база данных?
User Professor_evaluated Category Question Answer
_________________________________________________________________
Mike Professor Criss respect 1 3
Mike Professor Criss respect 2 4
Mike Professor Criss wisdom 3 5
Mike Professor Criss wisdom 4 3
Charles Professor Criss respect 1 3
Charles Professor Criss respect 2 4
Charles Professor Criss wisdom 3 5
Charles Professor Criss wisdom 4 3
Каждому учителю назначено несколько категорий для оценки (уважение, мудрость и т. д.), И, в свою очередь, каждая категория имеет связанные вопросы. Другими словами, у категории есть несколько вопросов. Каждая строка БД - это ответ на вопрос ученика, оценивающего учителя.
Что мне нужно?
Мне нужно создать скрипт для автоматического создания отчетов в формате PDF, который суммирует эту информацию с помощью диаграмм, например диаграммы с общей оценкой каждого учителя, другой диаграммы с оценкой каждого учителя по категориям, другой диаграммы со средним значением каждого ученика, и т. д. Наконец, у каждого учителя был бы отчет. Я хочу такой отчет 
Какой у меня вопрос?
Мой вопрос в том, какие пакеты и модули python мне понадобятся для выполнения этой задачи. И каков будет общий процесс этого. Мне не нужен код, потому что я знаю, что ответ очень общий, но я знаю, как это сделать.
Например: сначала вам нужно обработать информацию с помощью pandas, создать таблицу, которая суммирует информацию, которую вы хотите отобразить, затем построить ее, затем создать шаблон вашего отчета с модулем XYZ, а затем экспортировать его в pdf с модулем XYZ .






В моем случае:
Надеюсь это поможет.
Вариантов создания pdf на python очень много. Некоторые из этих параметров - ReportLab, pydf2, pdfdocument и FPDF.
Библиотеку FPDF довольно сложно использовать, и именно ее я использовал в этом примере. Документацию FPDF можно найти в здесь.
Возможно, также полезно подумать о том, какие модули Python вы можете использовать для создания графиков и таблиц. В моем примере я использую matplotlib (ссылка на документы), и я также использую Pandas для создания фрейма данных с помощью pandas.dataframe().
Ниже я опубликовал довольно длинный, но полностью воспроизводимый пример с использованием pandas, matplotlib и fpdf. Данные являются подмножеством того, что OP предоставил в вопросе. Я просматриваю фрейм данных в моем примере, чтобы создать таблицу, но есть альтернативные и, возможно, более эффективные способы сделать это.
import pandas as pd
import matplotlib
from pylab import title, figure, xlabel, ylabel, xticks, bar, legend, axis, savefig
from fpdf import FPDF
df = pd.DataFrame()
df['Question'] = ["Q1", "Q2", "Q3", "Q4"]
df['Charles'] = [3, 4, 5, 3]
df['Mike'] = [3, 3, 4, 4]
title("Professor Criss's Ratings by Users")
xlabel('Question Number')
ylabel('Score')
c = [2.0, 4.0, 6.0, 8.0]
m = [x - 0.5 for x in c]
xticks(c, df['Question'])
bar(m, df['Mike'], width=0.5, color = "#91eb87", label = "Mike")
bar(c, df['Charles'], width=0.5, color = "#eb879c", label = "Charles")
legend()
axis([0, 10, 0, 8])
savefig('barchart.png')
pdf = FPDF()
pdf.add_page()
pdf.set_xy(0, 0)
pdf.set_font('arial', 'B', 12)
pdf.cell(60)
pdf.cell(75, 10, "A Tabular and Graphical Report of Professor Criss's Ratings by Users Charles and Mike", 0, 2, 'C')
pdf.cell(90, 10, " ", 0, 2, 'C')
pdf.cell(-40)
pdf.cell(50, 10, 'Question', 1, 0, 'C')
pdf.cell(40, 10, 'Charles', 1, 0, 'C')
pdf.cell(40, 10, 'Mike', 1, 2, 'C')
pdf.cell(-90)
pdf.set_font('arial', '', 12)
for i in range(0, len(df)):
pdf.cell(50, 10, '%s' % (df['Question'].iloc[i]), 1, 0, 'C')
pdf.cell(40, 10, '%s' % (str(df.Mike.iloc[i])), 1, 0, 'C')
pdf.cell(40, 10, '%s' % (str(df.Charles.iloc[i])), 1, 2, 'C')
pdf.cell(-90)
pdf.cell(90, 10, " ", 0, 2, 'C')
pdf.cell(-30)
pdf.image('barchart.png', x = None, y = None, w = 0, h = 0, type = '', link = '')
pdf.output('test.pdf', 'F')
Ожидается test.pdf:
Обновление (апрель 2020 г.): Я внес изменения в исходный ответ в апреле 2020 года, чтобы заменить использование pandas.DataFrame.ix(), поскольку это устарел. В моем примере я смог заменить его на pandas.DataFrame.iloc, и результат остался таким же, как и раньше.
это можно запустить в Windows?
может ли этот пакет точно обрабатывать сложные отчеты?
Я использую Windows. Не могу установить fpdf.
@Nguai al Вы пробовали python -m pip install fpdf для установки библиотеки fpdf? На сегодняшний день (25 января 2019 г.) этот пример работает в Windows 10 и Python 3.6.5.
"pip install fpdf" сработал. Однако установка с использованием conda не сработала. Ваш пример работал в Windows. Спасибо.
Есть ли способ вставить график напрямую или его нужно сначала сохранить как файл .png?
@Zakary Krumlinde, используя pyFPDF, вам нужно будет сохранить изображение и добавить в pdf.
Измените ix на iloc, ix устарела. Например: df ['Вопрос']. Iloc [i] вместо df ['Вопрос']. Ix [i]
@dasilvadaniel. Отличный момент. Спасибо, что нашли время оставить комментарий. Я обновил ответ и проверил его.
Хочу отметить, что эта библиотека на самом деле не способна создавать таблицы, как это показано на примере. Таблица здесь представлена в виде набора фреймов, каждая из которых представляет собой ячейку. Кроме того, нет никакого управления потоком, поэтому без ручной упаковки и ручного изменения размера таблица и содержимое вообще не взаимодействуют друг с другом. Это может быть хорошим инструментом для некоторых целей, но может стать препятствием для многих.
Слегка еретический ответ: RMarkdown (в RStudio), с фрагментами кода Python, через reticulate (теперь по умолчанию), который дает вам долгоживущий «сеанс» Python, как в записной книжке Jypiter. Затем документ RMarkdown можно «связать» в PDF, html, Word, html-слайды и даже PowerPoint.
Серьезно, мир R в этой области далеко впереди.
Я согласен с @drz насчет RMarkdown для создания такого отчета. Это явно должно использоваться в академической работе. В любом случае, есть также шить, который действительно прост в использовании и во многих случаях может быть достаточным. Множество преимуществ от fpf:
Вот пример @ patrickjlong1 в stitch:
# Stich is simple and great
## Usefull markup language
You can use markdown syntax, such as **bold**, _italic_, ~~Strikethrough~~
## display dataframes
Direct output from python will be nicelly output.
```{python, echo=False}
import pandas as pd
df = pd.DataFrame()
df['Question'] = ["Q1", "Q2", "Q3", "Q4"]
df['Charles'] = [3, 4, 5, 3]
df['Mike'] = [3, 3, 4, 4]
df = df.set_index('Question')
df.style
df
```
## display graphics
Direct matplotlib output, without rendering to file.
```{python, echo=False}
#%matplotlib inline
df.plot.bar(title = "Professor Criss's Ratings by Users")
None
```
## Symbolic expressions
You may also want to work with sympy :
```{python, echo=False}
import sympy
sympy.init_printing()
x=sympy.symbol.Symbol('x')
sympy.integrate(sympy.sqrt(1/sympy.sin(x**2)))
```
После установки PDF-файл создается с помощью:
stitch test2.stich -o output.pdf
Результат будет выглядеть так:
Спасибо, интересный инструмент! Думаю, ссылка на стежок, о котором вы говорите, такая: pystitch.github.io?
@NickO, да, моя ссылка была неправильной. Обновленный ответ. Спасибо.
Reportlab предлагает надежный пакет для создания PDF-файлов с хорошей документацией: reportlab.com/docs/reportlab-userguide.pdf