У меня есть база данных, созданная опросом для оценки университетских профессоров. Я хочу сценарий 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 (ссылка на docs), и я также использую Pandas для создания pandas.dataframe()
с помощью pandas.dataframe()
.
Я опубликовал довольно длинный, но полностью воспроизводимый пример ниже, используя pandas, matplotlib и fpdf. Данные являются подмножеством того, что предоставил ОП в вопросе. Я прохожу через dataframe в моем примере, чтобы создать таблицу, но есть альтернативные и, возможно, более эффективные способы сделать это.
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 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 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'].ix[i]), 1, 0, 'C')
pdf.cell(40, 10, '%s' % (str(df.Mike.ix[i])), 1, 0, 'C')
pdf.cell(40, 10, '%s' % (str(df.Charles.ix[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')
Ожидаемый тест.pdf:
В моем случае:
Надеюсь это поможет.