Comments 22
Продолжаем двигать R в массы! :)
Ставьте лайки, подписывайтесь на наш канал.
Кроме шуток. Подход оказался неожиданно простой. Сделать всё, что мы и так делаем, а потом перелопатить это в олдскульный вордовский документ.
Кстати, пакет ReporteRs оказался столь могучим, что может даже взять за осову документа не пустую страницу, а файл-шаблон. Т.е. всякие корпоративные шапочки и т.д.
Область применения может быть самая нестандартная. От вышеописанных отчётов к контрактам, до шаблонов заявления на отпуск. Плохо что ли? Человек залогинился куда-то, считались его данные, вбил даты отпуска, а ему готовый документ сформировался. И это не какой-то космос и высшая математика. Это несколько бесхитростных строчек в коде и общее понимание процесса.
Комментаторам в стиле "А что у вас до сих пор текстовые документы гуляют в организации?" предлагаю сразу обращаться в лигу сексуальных реформ. Да, гуляют и ещё крайне долго будут гулять :)
Учите R.
Только одна небольшая ремарка: R всё-таки не «какой-нибудь простой скриптовый язык».
Он требует очень серьёзного изучения и принятия его синтаксической парадигмы.
И иногда даже несколько другой парадигмы для хороших пакетов (tidyverse).
Говорю не абстрактно — сам сейчас его изучаю в полный рост, потому что чувствую какая там мощь.
Здесь (в R) очень много функциональщины в хорошем смысле этого слова.
Питон — язык, изначально разрабатываемый для удобства, в нём приятно именно писать скрипты.
А в R всё-таки достаточно осталось из его научного прошлого — у учёных немного другой взгляд даже на именование стандартных вещей в программировании.
Если бы не Hadley Wickham, в R по-прежнему было бы «странно» работать программистам, пришедшим с других языков.
Очевидно, что после подобного репорта и опытной эксплуатации (месяц-другой), желание оптимизировать ФОТ из теоретической плоскости перейдет в практическую.
Вообще не очевидно. В смысле все очень сильно зависит от руководства. Лет 8 назад, придя на новую работу (с IT, правда, связанную слабо), получил в число своих обязанностей подготовку и составление ежемесячных отчетов (порядка 7-8) по подконтрольным, скажем так, организациям. Ушедшая на повышение коллега убивала на них порядка 2-3 недель в месяц, делая, естественно, все вручную. По сути на этом месте занимались вот этими отчетами и иногда другой работой. На автоматизацию ушло 3 месяца, из которых 2 дня — на написание скриптов и остальное время — на стандартизацию представляемых нам отчетов. Через три месяца процесс сбора и обработки всех данных занимал минут 15, включая выгрузку всего этого хлама с электронной почты. Так вот, к отчетам, созданным «компьютером» руководство отнеслось крайне скептически и (несмотря на то, что скрипты проверяли все, что только можно, и ошибки-пропуски были сведены на нет) попросило меня уделить этому больше внимания (т.е. делать вручную). Итог был прекрасен — я долгое время делал отчеты 15 минут в месяц, а остальное время занимался своими делами, чем вызывал наидичайший баттхерт у коллег. При сдаче, правда, обязательно говорил, что все проверил лично, с калькулятором, да.
Естественно, что вопрос можно рассматривать в разных плоскостях. И не всегда красивое технологическое решение принимается наверху.
Другое дело, что в конкретном случае есть еще важный внешний KPI — сокращение ФОТ. И его надо исполнять невзирая на растущий объем задач. И в этом случае звезды сходятся никак не на стороне любителей ручного труда.
С позволения администрации, выложу парочку ссылок:
— бесплатный онлайн самоучитель — http://pythontutor.ru/
— библиотеки — https://github.com/vinta/awesome-python
— очень крутая либа для работы с Экселем в лайв режиме — https://www.xlwings.org/
RStudio Online learning
Антон, в тексте я привел ссылки на пакет ReporteR.
А про сам R подробно было написано в предыдущих публикациях, можно поглядеть в них.
Там же написано, почему R, а не Python. По совокупности возможностей. Python — прекрасный язык, но 10 лет попыток прикрутить его для полноценной работы с данными каждый раз натыкались на массовое применение изоленты. А еще дилемма Python 2 или 3. Она вроде бы как закончилась недавно, но для меня это уже слишком поздно, поскольку я нашел ответы на все возникающие вопросы в рамках экосистемы R.
2. Есть ли такой пакет ReporteRs для Python?
Отвечу в обратном порядке.
- По поводу Python не скажу.
- По поводу кода — загрузка данных и вычисления SLA слишком специфичны и индивидуальны, чтобы тут приводить. А формирование самого файла ниже (полная форма закомменчена, а сокращённая через пайпы внизу)
################################################################## Формируем шапку документа
# # Создаём болванчик ворд документа
# doc <- docx()
# # Название документа. Жирненькое, сдвинутое в центр.
# doc <- addParagraph(doc,
# pot(doc_title, format = textBold()),
# par.properties = parProperties(text.align = 'center'))
#
# # Добавляем параграф с текстом про даты, затем со статичным текстом
# doc <- addParagraph(doc, dates_text)
# doc <- addParagraph(doc, my_text)
#
#
# # Добавляем содержание
# doc <- addTitle(doc, "Содержание")
# doc <- addTOC(doc)
# doc <- addPageBreak(doc) # Перенос на следующую страницу
#
#
# ######################################### Первый блок данных
# # делаем заголовок первого уровня
# doc <- addTitle(doc, value = "Устранение ТТ")
#
#
# ######################################### Формируем таблицу
# doc <- addFlexTable(doc, MyFTable)
#
# ########################################### Итого для таблицы ##########################
# doc <- addParagraph(doc, pot(total_text, format = textBold()))
# doc <- addPageBreak(doc) # Разрыв страницы
#
#
# ########################################## Второй блок данных
# # делаем заголовок первого уровня
# doc <- addTitle(doc, value = "Проведённые плановые работы")
########################### Сокращённая форма записи
doc <- docx() %>%
addParagraph(pot(doc_title, format = textBold()),
par.properties = parProperties(text.align = 'center')) %>%
addParagraph(dates_text) %>%
addParagraph(my_text) %>%
addTitle("Содержание") %>%
addTOC() %>%
addPageBreak() %>%
addTitle("Устранение ТТ") %>%
addFlexTable(MyFTable) %>%
addParagraph(pot(total_text, format = textBold())) %>%
addPageBreak() %>%
addTitle("Проведённые плановые работы")
doc_title, dates_text, my_text , total_text — текст, который формируется заранее (оглавление, описание ГК и другие формальные части отчёта)
MyFTable — заготовленная заранее таблица, сформированная из обычного датафрейма data. Формирование показано ниже
MyFTable <- data %>%
vanilla.table %>%
setZebraStyle(odd = '#eeeeee', even = 'white')
После того, как сформировали переменную doc, которая и содержит нужный нам документ — надо его как-то вывести Пользователю. Мы это сделали через DownloadHandler и опубликовали через Shiny Server.
Формируем элемент, содержащий нужный нам файл и генерим имя для этого файла
# Формируем элемент, выгружающий нужный нам документ
output$downloadData <- downloadHandler(
filename = function() {
paste("отчёт-такой-то-", Sys.Date(), ".docx", sep="")
},
content = function(file) {
writeDoc(doc, file) # Функция для сохранения файла в docx формате
}
)
В удобное нам место вставляем кнопку для выгрузки этих данных
downloadButton("downloadData", "Сформировать отчёт в формате docx", class = "btn-primary")
Также мы ещё вывели те же самые данные для Пользователя через библиотеку DT, чтобы он мог заранее увидеть, что будет в его отчёте. Но это тема отдельной интересной статьи :)
Не совсем понятен вопрос. Если про правила расчета, то там месячный sla с различными пороговыми значениями, а композитная величина потом преобразуется в штрафной коэффициент.
прошу прощения, упустил картинку. Там указан SLA по тикету, а есть еще композитный SLA по услугам, включенным в рамочный контракт. По тикетам случаи бывают, но, как обычно миллион гибких уровней трансформируется в 3: "все бросили и побежали", "покурю и начну заниматься", "посмотрим завтра".
Отвечу, как всё у нас.
SLA подразумевает просто время устранения. В данном контракте особенность предмета контракта, что там почти весь SLA "Высокий".
Но сути это особенно не меняет. Берётся время начала работы, время окончания, вычитаются какие-то задержки со стороны Заказчика (если они имеются), сравнивается со значением SLA (вошло не вошло).
За кадром остался момент итогового отчёта. Помимо SLA каждого отдельного тикета — есть ещё общий SLA, который прописан, как "Общее время, на которое суммарно просрочены все тикеты". Оно для разных уровней SLA тоже разное. Но оно тоже считается не сложно. Потом в итоговый отчёт идёт помимо таблицы, что на скриншоте в статье, общая таблица.
Если есть более конкретные вопросы — пишите. Попробуем посмотреть на досуге.
«До чего дошел прогRесс». Замена «умственного» труда механическим процессом на базе R