Формирование электронного отчета
При работе с проектами важным этапом является иллюстрация и оформление промежуточных или конечных результатов. Отчет с оформленными результатами помогает лучше анализировать состояние работ, и зачастую является финальным продуктом проекта.
Представление проекта в виде графа жестко закрепляет все этапы вычислительного процесса и помогает структурировать обработку. Но также важным преимуществом графа является возможность формирования электронного отчета автоматически. Результат каждого узла можно оформить в виде отчета, который будет создаваться в процессе расчета и автоматически обновлять его содержимое.
Электронный отчет представляет собой документ, в котором можно написать статическую основу, например в виде текста, а изменяемые данные выводить динамически. Изменяемыми данными могут быть входные параметры, результат работы узла в виде картинок или чисел. Отчет формируется непосредственно в программном модуле и сохраняется в выходной пакет как его переменная. Таким образом он содержит в себе актуальную информацию, относящуюся к обработке конкретного пакета и дает возможность красиво ее выводить с нужным описанием.
Формирование отчета осуществляется через синтаксис Markdown, это достаточно удобный и простой инструмент, позволяющий создавать продвинутые публикации.
Рассмотрим более подробно как этим пользоваться.
Создание и просмотр электронного отчета
Электронный отчет заполняется внутри исполняемого программного модуля, поэтому выберите один интересующий вас узел и в нем программный модуль. В нашем случае он реализован на языке Python. Подключите специальные библиотеки для полноценного оформления отчета: io, base64.
Пример составления электронного отчета:
#!/usr/bin/env python3
import io
import base64
import bfj
import numpy as np
import matplotlib.pyplot as plt
from datetime import date, timedelta
def fig_to_html(fig, width='100%'):
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
data = base64.encodebytes(buf.read()).decode()
return f'<img width="{width}" src="data:image/png;base64,\n{data}">'
# Load everything from input package:
bfj.load_inputs(globals())
# Compute data
data = [[date.today() + timedelta(days=i), 100 * (1 - 0.01 * i**2)] for i in range(1,8)]
report_date = date.today() + timedelta(days=1)
# Prepare plots
fig, ax = plt.subplots(figsize=(8,4))
ax.plot([d for d,p in data],
[p for d,p in data],
'o-', label='P(Fail)')
ax.set_xlabel('Date')
ax.set_ylabel('P')
ax.legend()
fig.tight_layout()
# Create the report
report = f"""
Добрый день, **{name}**,
Рекомендация на завтра, **{report_date}**:
# Сидите уже дома!
## Вероятность неприятности на следующую неделю:
{fig_to_html(fig)}
Дата | Вероятность
-|-
"""
for d,p in data:
report += f'{d} | {p:.02f}\n'
# Save output package:
bfj.save_package(
label="result",
files={"recommendation.md": lambda f: f.write(report.encode())})
Последняя строка означает, что программный модуль в процессе выполнения сохранит электронный отчет как переменную с расширением md в выходной пакет, которая будет содержать созданный отчет.
В приведенном примере электронный отчет содержит переменную name (задается в параметрах), data (вычисляется внутри программного модуля). При изменении переменных они так же будут обновляться автоматически. Для просмотра электронного отчета выберите следующий узел, и нажмите на Node Packages. Выберите пакет, переключитесь на Variables, и найдите переменную с расширением md. После нажатия на эту переменную откроется электронный документ. Вы увидите, что он генерируется каждый раз, когда обрабатывается пакет и передается в следующий узел с выходным пакетом.
Соединение отчета с отчетом
Электронные отчеты хранятся в узлах. Если вам нужно собрать эти отчеты в упорядоченном порядке в одно полотно, то воспользуйтесь "Workspace"ом . Для электронных отчетов существует специальный виджет "Markdown report".
Так как отчеты составляются в Markdown, рассмотрим базовый синтаксис необходимый для составления отчета(более подробно можете узнать перейдя по ссылке):
- для разделения абзацев оставьте между текстами пустую строку;
- для выделения заглавия используйте символ диез # перед словом;
- для переноса строки используйте два пробела после предыдущей строки;
- для разметки списков используйте * ,чтобы сделать вложенные списки используйте четыре пробела перед маркером пункта:
* элемент 1
*вложенный элемент
- чтобы сделать упорядоченный список используйте перед элементом списка любую цифру с точкой:
0. Элемент 1
0. Элемент 2
Результат:
1. Элемент 1
2. Элемент 2
- для выделения слова курсивом заключите слова в одинарные _ _, или * *, для выделения жирным в двойные __ __ или ** **, чтобы был и жирным и курсивом в тройные ___ ___ или *** ***;
- для того, чтобы создать таблицу нужно столбцы закрывать в линии |, для разделения заглавия используется --- ;
- для выравнивания текста внутри таблицы используется :
Пример.
переменная 1 |переменная 2 |переменная 3|
| :--- | :---: | ---: |
|влево | по центру | вправо|
Обязательно разделяйте пробелом линии и двоеточие. Количество линий в каждой строке таблицы должны совпадать;
- для того чтобы вставить формулу используйте $ $. Нужен LaTeX, для корректного отображения формул;
- чтобы вставлять переменные в текст используйте**{variable}** ;
-чтобы вставить рисунок в отчет нужно прописать вызов некоторых библиотеки функции:
для Python библиотеки io, base64 и прописать функцию в коде:
def fig_to_html(fig, width='100%'):
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
data = base64.encodebytes(buf.read()).decode()
return f'<img width="{width}" src="data:image/png;base64,\n{data}">'
она используется для преобразования рисунка в нужную кодировку;
- чтобы вставить рисунок в тексте используйте фигурные скобки {fig_to_html(fig)}, обязательно разделяйте вставку рисунка пустыми строками.
Поздравляем, теперь ваши проекты будут выглядеть ещё более презентабельными!!