Jupyter Notebook: отображение классов с HTML и математикой с использованием метода _repr_html_ - PullRequest
1 голос
/ 16 июня 2020

Я пишу python классов для использования в Jupyter Notebook, которые должны иметь красивые представления. Для этого я определяю _repr_html_ методы (которые могут встраивать графику , сгенерированную на лету matplotlib). Но иногда я хочу включить и математику. Например,

import pandas as pd
import IPython.display as idisp

class FooHtml:
    def __init__(self):
        self.df = pd.DataFrame({'alpha': [1.0, 2, 3], 'beta': [0.1, 0.2, 0.3]})

    def _repr_html_(self):
        math = idisp.Math(r'\alpha = \int f(\tau)\,d\tau')
        return (
            '<h3>FooHtml</h3>'  
            f'{self.df._repr_html_()}<br>\n'
            f'Explanation: {math}, where tau is the time.'
        )

FooHtml()

Этот ввод ячейки будет генерировать следующий вывод:

Jupyter display

Это не показывает математику, хотя display(math) показывает уравнение:

math formula

Невозможность визуализации объясняется тем, что str(math) == '<IPython.core.display ...>' будет интерпретироваться как недопустимый тег HTML. Вопрос в том, как на самом деле визуализировать математику, встроенную в представление HTML. Я нашел ответ, которого нигде не мог найти; который я отправлю в качестве ответа.

Ответы [ 2 ]

0 голосов
/ 04 июля 2020

Это именно та проблема, которая побудила меня создать jupydo c, также используя разметку для унификации графики, форматированного текста и латекса.

С его оборудованием ответ легко:

from jupydoc import Publisher

class FooMarkdown(Publisher):
    def foo(self):
        r"""
        ### FooHTML
        
        {df}
        
        Explanation:
        
        $\alpha = \int f(\tau)\,d\tau$
        
        where $\tau$ is the time.
        """
        df = pd.DataFrame({'alpha': [1.0, 2, 3], 'beta': [0.1, 0.2, 0.3]})
        self.publishme()
FooMarkdown().foo()

Результат:

введите описание изображения здесь

0 голосов
/ 16 июня 2020

Строка HTML, возвращаемая _repr_html_, может содержать математические выражения в формате LaTeX внутри строк $$ ... $$ и $ ... $. Хотя другое форматирование Markdown не анализируется из вывода _repr_html_, фактически анализируется $ -delimited математика:

class FooHtml:
    def __init__(self):
        self.df = pd.DataFrame({'alpha': [1.0, 2, 3], 'beta': [0.1, 0.2, 0.3]})

    def _repr_html_(self):
        math = idisp.Math(r'') 
        return (
            '<h3>FooHtml</h3>'
            f'{self.df._repr_html_()}<br>\n'
            r'Explanation: $$\alpha = \int f(\tau)\,d\tau,$$'
            r'where $\tau$ is the time.'
        )

FooHtml()

Вывод:

Jupyter display

В качестве альтернативы вы можете создать метод _repr_markdown_. Хотя DataFrame._repr_markdown_ не существует, можно встроить таблицу HTML в Markdown:

class FooMarkdown:
    def __init__(self):
        self.df = pd.DataFrame({'alpha': [1.0, 2, 3], 'beta': [0.1, 0.2, 0.3]})

    def _repr_markdown_(self):
        return (
            '### FooMarkDown'
            f'{self.df._repr_html_()}<br>\n'
            r'Explanation: $$\alpha = \int f(\tau)\,d\tau$$ where $\tau$ is the time'
        )


FooMarkdown()

Jupyter display

...