Panda Dataframes als HTML "schön" anzeigen

Django, Flask, Bottle, WSGI, CGI…
Antworten
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

Hallo,

Ich benötige etwas Hilfe zur Selbsthilfe. Ich verliere mich in dem Wust an Möglichkeiten.

Ich habe folgendes Problem:

Ich möchte jeden Tag einen Bericht erstellen, der sowohl Diagramme als auch Tabellen beinhaltet. Als Datenquelle benutze ich Panda DataFrames. Mittlerweile bin ich soweit gekommen diverse Diagramme zu erzeugen und diese als .png zu speichern. Ich stosse auf grosse Probleme, wenn es darum geht nun Tabellen schön formatiert auszugeben. Die Darstellung über HTML scheint mir dazu geeignet. Meine bisherige Recherchen ergeben eine Vielzahl möglicher Wege, wobei ich nicht beurteilen kann was denn nun für mich geeignet wäre.


Kann mir hierzu jemand an Hand meiner Vorstellungen einen Ansatz aufzeigen welche Methode mich zum Ziel führen könnte? Der Report ist jeden Tag derselbe (Diagramme/Tabellen), es ändern sich nur die Zahlen. Es bietet sich daher wohl an in irgendeiner Form Templates zu nutzen. Geduld habe ich, möchte mich aber zumindest in das richtige Thema einfuchsen ;-)
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SautaRoc: Was ist denn ”schön”? Du könntest Dir in der Tat irgendein Templatesystem nehmen, zum Beispiel Jinja2, und irgendein CSS-Rahmenwerk, zum Beispiel Bootstrap, und daraus wahrscheinlich relativ fix etwas ansehbares zusammenbasteln.

Edit: Nur falls das nicht schon bekannt ist: `DataFrame`-Objekte haben eine `to_html()`-Methode die HTML-Quelltext für eine <table> liefert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

Danke für den Tipp,

ich habe in der Tat bereits den Dataframe mit to_html als Htmldatei gespeichert.
ich bin auch schon einen Schritt weiter, nämlich zusätzlich CSS zu nutzen:

CSS Datei:

Code: Alles auswählen

/* includes alternating gray and white with on-hover color */

.mystyle {
    font-size: 11pt; 
    font-family: Arial;
    border-collapse: collapse; 
    border: 1px solid silver;

}

.mystyle td, th {
    padding: 5px;
}

.mystyle tr:nth-child(even) {
    background: #E0E0E0;
}

.mystyle tr:hover {
    background: silver;
    cursor: pointer;
}
dann mache ich aus meinem DataFrame 'ueberhang' die html Datei:

Code: Alles auswählen

pd.set_option('colheader_justify', 'center')   # FOR TABLE <th>

html_string = '''
<html>
  <head><title>HTML Pandas Dataframe with CSS</title></head>
  <link rel="stylesheet" type="text/css" href="df_style.css"/>
  <body>
    {table}
  </body>
</html>.
'''

# OUTPUT AN HTML FILE
with open('myhtml.html', 'w') as f:
    f.write(html_string.format(table=ueberhang.to_html(classes='mystyle',index = False).replace('<th>','<th style = "background-color: red">')))
Jetzt würde ich noch gerne ein paar zusätzliche Styelemente unterbringen wie z.B negative Zahlen in rot. Um das zu tun plane ich die html Datei nochmals einzulesen und über Stringoperationen bestimmte Styleelemente hinzuzufügen. Um negative Zahlen zu suchen, könnte man beispielsweise nach '<td>-' suchen und das dann mit einer Styleangabe ersetzen.

Das müsste gehen, die Frage ist, ob das nicht viel zu kompliziert gedacht ist?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

HTML ist kein einfacher Text sondern ein strukturiertes Format. Ich finde da ja schon das `replace()` was Du da hast ziemlich grenzwertig. Warum hast Du das nicht über das CSS gelöst?

Wenn man mehr braucht als `to_html()` liefert, würde ich das dann eher weglassen und die Tabelle selbst erstellen/formatieren, zum Beispiel über Jinja2, statt da am Ende das HTML noch mal zu parsen und zu verändern.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Negative Zahlen in rot wird sogar in der Doku zur betreffenden Methode mitsamt Codebeispiel genannt. Vielleicht da mal einen genaueren Blick reinwerfen. ;-)
Antworten