2014-01-22 9 views
9

Das mathematische Problem, das ich lösen, gibt verschiedene analytische Lösungen in verschiedenen Szenarien, und ich möchte das Ergebnis in einer schönen Tabelle zusammenfassen. IPython Notebook macht die Liste schön: zum Beispiel:Wie Math-Tabelle ordnungsgemäß in IPython Notebook rendern

import sympy 
from pandas import DataFrame 
from sympy import * 
init_printing() 
a, b, c, d = symbols('a b c d') 
t = [[a/b, b/a], [c/d, d/c]] 
t 

enter image description here

Allerdings, wenn ich die Antworten in eine Tabelle mit Datenrahmen zusammenzufassen, kann die Mathematik nicht gerendert werden mehr:

df = DataFrame(t, index=['Situation 1', 'Situation 2'], columns=['Answer1','Answer2']) 
df 

enter image description here

"print df.to_latex()" gibt auch das gleiche Ergebnis. Ich habe auch versucht, „print (Latex (t))“, aber es gibt diese nach in LaTex kompilieren, die in Ordnung ist, aber ich muss noch manuell in eine Tabelle konvertieren:

enter image description here

Wie soll ich DataFrame richtig, um die Mathematik richtig zu rendern? Oder gibt es eine andere Möglichkeit, das Mathergebnis in eine Tabelle in Latex zu exportieren? Vielen Dank!

Update: 01/25/14 Nochmals vielen Dank an @Jakob für die Lösung des Problems. Es funktioniert perfekt für einfache Matrizen, obwohl es immer noch einige kleinere Probleme für kompliziertere mathematische Ausdrücke gibt. Aber ich denke, wie @asmeurer sagte, Perfektion erfordert ein Update in IPython und Pandas.

enter image description here

Update: 01/26/14 Wenn ich das Ergebnis direkt übertragen, das heißt nur die Liste drucken, es funktioniert gut: enter image description here

+0

[Dies] (https://github.com/pydata/pandas/pull/5763) könnte sein, sinnvoll. – TomAugspurger

+0

Danke, @TomAugspurger. Ich änderte einen Wert in ihrem 'df' in 'a/b', aber die endgültige Tabellenausgabe konnte die Mathematik noch nicht gut wiedergeben. – Titanic

+0

Ich denke, das ist ein Duplikat von http://stackoverflow.com/questions/18503351/how-to-geta-a-latex-table-of-ympy-expressions-in-ipython-notebook (SO lässt mich nicht Markieren Sie es als solches, da es im Duplikatsdialog nicht gefunden werden kann.) – asmeurer

Antwort

4

Mathjax ist derzeit nicht in der Lage Tabellen zu machen, damit der offensichtlichste Ansatz (reiner Latex) funktioniert nicht.

Allerdings sollten Sie nach der Empfehlung von @asmeurer eine HTML-Tabelle verwenden und den Zelleninhalt als Latex darstellen. In Ihrem Fall diese leicht durch den folgenden Zwischenschritt erreicht werden kann:

from sympy import latex 
tl = map(lambda tc: '$'+latex(tc)+'$',t) 
df = DataFrame(tl, index=['Situation 1', 'Situation 2'], columns=['Answer']) 
df 

die gibt:
enter image description here


Update:

Bei zweidimensionalen Daten, die einfache Kartenfunktion wird nicht direkt funktionieren.Zur Bewältigung dieser Situation die numpy Form, reshape und Ravel Funktionen verwendet werden könnten, wie:

import numpy as np 
t = [[a/b, b/a],[a*a,b*b]] 
tl=np.reshape(map(lambda tc: '$'+latex(tc)+'$',np.ravel(t)),np.shape(t)) 
df = DataFrame(tl, index=['Situation 1', 'Situation 2'], columns=['Answer 1','Answer 2']) 
df 

Das gibt:
enter image description here


Update 2:

Pandas Ernten Zelleninhalt, wenn die Stringlänge eine bestimmte Anzahl überschreitet. Z.B einen komplizierteren Ausdruck wie

t1 = [a/2+b/2+c/2+d/2] 
tl=np.reshape(map(lambda tc: '$'+latex(tc)+'$',np.ravel(t1)),np.shape(t1)) 
df = DataFrame(tl, index=['Situation 1'], columns=['Answer 1']) 
df 

gibt:
enter image description here

mit diesem Thema einer Pandas Paketoption hat zu bewältigen geändert werden, für Details here sehen. Für den vorliegenden Fall muss die max_colwidth geändert werden. Der Standardwert ist 50, also machen wir es auf 100 ändern:

import pandas as pd 
pd.options.display.max_colwidth=100 
df 

gibt:
enter image description here

+0

Danke, @Jakob. Es funktioniert für das obige Beispiel, aber wenn der Wert mehr als eine Dimension ist, dann gibt es mir den Fehler 'ValueError: Form der übergebenen Werte ist (1, 2), Indizes implizieren (2, 2)'. – Titanic

+0

Nur eine schnelle Schätzung, haben Sie einen zweiten Spaltentitel angegeben? Wenn ich einen zweiten Spaltentitel weglasse, bekomme ich genau diesen Fehler. Oder könnten Sie genauer angeben, welche Art von Daten Sie anzeigen möchten. – Jakob

+0

Um @Jakob: Ich habe den Titel der zweiten Spalte enthalten, siehe den entsprechenden Code: 'columns = ['Answer1', 'Answer2']' '. Die Art der Daten, die ich darzustellen versuche, ist eine Reihe mathematischer Gleichungen (mit SymPy), bei denen es sich um analytische Lösungen aus einem wirtschaftlichen Optimierungsproblem handelt. – Titanic