Python - каков процесс создания отчетов в формате PDF с диаграммами из БД?

У меня есть база данных, созданная в результате опроса для оценки университетских профессоров. Мне нужен сценарий 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 - каков процесс создания отчетов в формате PDF с диаграммами из БД?

Какой у меня вопрос?

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

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

Reportlab предлагает надежный пакет для создания PDF-файлов с хорошей документацией: reportlab.com/docs/reportlab-userguide.pdf

rahlf23 15.08.2018 20:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
33
1
70 240
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В моем случае:

  • Подключитесь к Oracle Database и извлеките данные с помощью библиотеки cx_Oracle
  • Используйте Pandas Dataframes для обработки данных
  • Используйте Matplotlib для создания графиков
  • Используйте ExcelWriter и ReportLab для вывода в формате Excel или PDF

Надеюсь это поможет.

Ответ принят как подходящий

Вариантов создания 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:

Expected test.pdf

Обновление (апрель 2020 г.): Я внес изменения в исходный ответ в апреле 2020 года, чтобы заменить использование pandas.DataFrame.ix(), поскольку это устарел. В моем примере я смог заменить его на pandas.DataFrame.iloc, и результат остался таким же, как и раньше.

это можно запустить в Windows?

Nguai al 25.01.2019 07:42

может ли этот пакет точно обрабатывать сложные отчеты?

Nguai al 25.01.2019 08:47

Я использую Windows. Не могу установить fpdf.

Nguai al 25.01.2019 16:42

@Nguai al Вы пробовали python -m pip install fpdf для установки библиотеки fpdf? На сегодняшний день (25 января 2019 г.) этот пример работает в Windows 10 и Python 3.6.5.

patrickjlong1 25.01.2019 17:51

"pip install fpdf" сработал. Однако установка с использованием conda не сработала. Ваш пример работал в Windows. Спасибо.

Nguai al 25.01.2019 19:51

Есть ли способ вставить график напрямую или его нужно сначала сохранить как файл .png?

Zakary Krumlinde 24.03.2020 17:36

@Zakary Krumlinde, используя pyFPDF, вам нужно будет сохранить изображение и добавить в pdf.

patrickjlong1 06.04.2020 05:53

Измените ix на iloc, ix устарела. Например: df ['Вопрос']. Iloc [i] вместо df ['Вопрос']. Ix [i]

dasilvadaniel 09.04.2020 18:45

@dasilvadaniel. Отличный момент. Спасибо, что нашли время оставить комментарий. Я обновил ответ и проверил его.

patrickjlong1 17.04.2020 17:35

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

Oak_3260548 14.08.2020 14:35

Слегка еретический ответ: RMarkdown (в RStudio), с фрагментами кода Python, через reticulate (теперь по умолчанию), который дает вам долгоживущий «сеанс» Python, как в записной книжке Jypiter. Затем документ RMarkdown можно «связать» в PDF, html, Word, html-слайды и даже PowerPoint.

Серьезно, мир R в этой области далеко впереди.

Я согласен с @drz насчет RMarkdown для создания такого отчета. Это явно должно использоваться в академической работе. В любом случае, есть также шить, который действительно прост в использовании и во многих случаях может быть достаточным. Множество преимуществ от fpf:

  • разбивка на страницы управляется
  • доступен синтаксис разметки
  • matplotlib и pandas graph напрямую выводят
  • может генерировать html или pdf

Вот пример @ 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

Результат будет выглядеть так:

stich output in PDF

Спасибо, интересный инструмент! Думаю, ссылка на стежок, о котором вы говорите, такая: pystitch.github.io?

NickO 13.04.2021 19:40

@NickO, да, моя ссылка была неправильной. Обновленный ответ. Спасибо.

Nico7as 16.04.2021 14:22

Другие вопросы по теме