Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2017 19:07:02

Dzm
Зарегистрирован: 2017-05-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Привет всем,

Допустим, для конкретики, проводится 2 эксперимента (измерение) над N образцами. Пусть каждый эксперимент при этом имеет 2 режима проведения.

Хочу представить результаты экспериментов в виде:

           |    Эксперимент1      |   Эксперимент2    |
образец    | режим1    | режим2   |  режим1 | режим2  |
обр 1      | 305       |    327   |  412    |   433   |
обр 2      | 307       |    320   |  410    |   430   |
 .....................................................
обр N      | 304       |    321   |  404    |   425   |

Основную трудность вызывает вывод сложной шапки у таблицы. Удивительно, что поиск решения этой, элементарной задачи результатов не дал. Пробовал пакеты plotly и pretty table, но создавать в них много-строчные или объединенные заголовки (или объединять ячейки) если как-то можно, то не просто, у меня не получилось разобраться.

Подскажите инструмент с которым можно вывести такую таблицу. Никогда бы не подумал, что столь простая и насущная задача вызовет такую боль…

Заранее благодарю всех откликнувшихся

Офлайн

#2 Май 12, 2017 21:01:52

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Не думаю, что тут нужен инструмент. Если разрядность известна, то можно пользоваться возможностями функции format. Ну и вообще. Лучше пишите результаты сразу с csv или xlsx.

Офлайн

#3 Май 13, 2017 04:49:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Dzm
Основную трудность вызывает вывод сложной шапки у таблицы.
Вообще, когда тебе надо такое сделать (что-то большое, сложное и запутанное), нужно применить метод декомпозиции. Ты должен взять это большое и задать вопрос “из каких самых больших структур это состоит?”, потом берёшь каждую из полученных структур и делаешь с ней то же самое, пока не дойдёшь до самых мельчайших элементов. И вот после этого ты уже видишь, что тебе надо написать.

Как сделать эту таблицу:
1. Задаём вопрос для разбиения на максимальные структуры
- Из каких самых больших структур это состоит?
- Из заголовка таблицы и тела таблицы.
2. Задаём вопрос для разбиения на максимальные структуры первой полученной структуры (заголовка таблицы)
- Из каких самых больших структур это состоит?
- Из двух разных строк: строки экспериментов и строки режимов.
2.1. Задаём вопрос для разбиения на максимальные структуры первой полученной подструктуры (строки экспериментов заголовка таблицы)
- Из каких самых больших структур это состоит?
- Из колонок: пустой, с именем эксперимента, с именем эксперимента.
2.2. Задаём вопрос для разбиения на максимальные структуры второй полученной подструктуры (строки режимов заголовка таблицы)
- Из каких самых больших структур это состоит?
- Из колонок: с образцом, с режимом, с режимом, с режимом, с режимом.
3. Задаём вопрос для разбиения на максимальные структуры второй полученной структуры (тела таблицы)
- Из каких самых больших структур это состоит?
- Из строк.
3.1. Задаём вопрос для разбиения на максимальные структуры полученной подструктуры (строки тела таблицы)
- Из каких самых больших структур это состоит?
- Из колонок: с именем, с результатом эксперимента, с результатом эксперимента, с результатом эксперимента, с результатом эксперимента.

Вот теперь ты выполнил декомпозицию и тебе нужно сделать свою функцию для каждого уровня декомпозиции.

вывести_таблицу()
вывести_заголовок_таблицы()
вывести_первый_ряд_заголовка()
вывести_пустую_колонку
вывести_колонку_с_именем1
вывести_колонку_с_именем2
вывести_второй_ряд_заголовка()
вывести_колонку_с_именем
вывести_колонку_с_режимом1
вывести_колонку_с_режимом2
вывести_колонку_с_режимом1
вывести_колонку_с_режимом2
вывести_тело_таблицы()
цикл для каждого набора значений
вывести_ряд_значений()
вывести_колонку_с_именем
вывести_колонку_с_результатом1
вывести_колонку_с_результатом2
вывести_колонку_с_результатом3
вывести_колонку_с_результатом4
конец цикла

Всё, дальше по этому псевдокоду пишешь уже реальный код. То есть тебе нужно написать шесть функций.

  
>>> def print_table(data):
...     print_header()
...     print_body(data)
... 
>>> def print_header():
...     print_header_line1()
...     print_header_line2()
... 
>>> def print_header_line1():
...     print('header line 1')
... 
>>> def print_header_line2():
...     print('header line 2')
... 
>>> def print_body(data):
...     for row in data:
...         print_body_line(row)
... 
>>> def print_body_line(row):
...     print('body line', row)
... 
>>> 
>>> print_table([['name1', 'a1', 'b1'], ['name2', 'a2', 'b2']])
header line 1
header line 2
body line ['name1', 'a1', 'b1']
body line ['name2', 'a2', 'b2']
>>>



Отредактировано py.user.next (Май 13, 2017 05:15:48)

Офлайн

#4 Май 13, 2017 08:42:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Dzm
Удивительно, что поиск решения этой, элементарной задачи результатов не дал
Ничего удивительного. Таким фуфлом лет 20 уже никто не занимается, со времен господства фортрана.
Таблицу в таком виде программно будет неудобно читать. А глазками лучше читать нормальную графику в html/pdf/dvi/ps формате. И программно сделать ее гораздо проще чем текстовую таблицу.
Мы например используем mako + latex Если больше нравится более простой текст и нужно менее вычурное оформление то sphinx.

Первый же пример на мако http://www.makotemplates.org/

 a="""
<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
    border: 1px solid black;
}
</style>
</head>
<body>
<table>
    % for row in rows:
        ${makerow(row)}
    % endfor
</table>
<%def name="makerow(row)">
    <tr>
    % for name in row:
        <td>${name}</td>\
    % endfor
    </tr>
</%def>
</body>
</html>"""
from mako.template import Temlate
rows = [[v for v in range(0,10)] for row in range(0,10)
tpl =Template(a)
print(a.render(rows=rows))
Объединение ячеек в html делается так; <th colspan=“2”>заголовок</th>



Отредактировано doza_and (Май 13, 2017 09:05:46)

Офлайн

#5 Май 14, 2017 11:56:38

Dzm
Зарегистрирован: 2017-05-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Всем спасибо еще раз за комментарии.
Уточню вопрос, т.к. оказалось это важно: моя таблица является только визуализацией данных для отчета - ворд/гугл док. Если это будет просто красивая графика - это именно то что надо, желательно только что бы не требовало большой дополнительно писанины.

=doza_and
А глазками лучше читать нормальную графику в html/pdf/dvi/ps формате.
Можно чуть по подробней какие пакеты еще можно посмотреть/почитать для графического представления таблиц. Сорри, пробежался по указанной ссылке, но не понял что такое mako. Если это и есть решение то буду изучать со всей внимательностью


Я попробовал pandas dataframe - там вывод моей таблицы по сути в 2 строчки. Только пара моментов - 1 - очень простой дизайн у таблицы; 2- ощущение что я стреляю из “пушки по комару”

Офлайн

#6 Май 14, 2017 17:15:23

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Dzm
Если это и есть решение
Решить задачу можно множеством способов. Это один из них.
Dzm
какие пакеты еще можно посмотреть
Для данного подхода больше никакие пакеты не нужны.
Dzm
но не понял что такое mako
Это просто библиотека чуток расширяющая функции форматирования текста.
Все что надо знать в этом случае html+mako. По идее можете и без мако обойтись. Просто длиннее будет.
На выходе получите html.

На мой взгляд doc/docx будет сделать на порядок сложнее по затратам времени.
google docs я не знаю как сделать.



Офлайн

#7 Май 14, 2017 22:03:47

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Тогда проще всего глянуть в XlsxWriter. И потом результат его работы запихнуть в google docs. Там же можно легко строить и диаграммы / графики. Причем это не требует практически никаких усилий.

Отредактировано 4kpt_V (Май 14, 2017 22:04:47)

Офлайн

#8 Май 14, 2017 22:41:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

4kpt_V
Тогда проще всего глянуть в XlsxWriter
:) Я практически умею экселом пользоваться. Интересно там реально можно сложные заголовки сделать? Не раскрасить а реально объединить ячейки. Никогда такого не видел. будет прикольно если
4kpt_V
это не требует практически никаких усилий.
:):):)



Офлайн

#9 Май 14, 2017 22:43:20

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

doza_and
Дядька, да. Можно и объединять и даже фильтры добавлять. Короче очень много можно. Пользуюсь постоянно. Даже отчеты строю исключительно им.

Офлайн

#10 Май 14, 2017 22:44:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вывод в форме таблицы со сложным заголовком

Спасибо за инфу! горячий тебе привет из нашего далеко! Наверное мотосезон уже открыл? Я то открыл, только вот дождь со снегом часто мешают.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version