2015-09-29 1 views
0

J'ai créé une classe dans laquelle la donnée livrable principale est stockée dans un attribut sous forme de pandas DataFrame. Je voudrais que le comportement d'affichage par défaut des instances de cette classe soit le même que celui de ce DataFrame. Particulièrement quand dans iPython Notebook.Quelle méthode pandas DataFrame dit à ipython notebook d'afficher en HTML

par exemple:

from pandas import DataFrame 


class TestDFDisplay(): 
    def __init__(self): 
     self.dataframe = DataFrame([[1, 2], [3, 4]]) 


tdf = TestDFDisplay() 

quand je:

tdf.dataframe 

je reçois une version HTML:

0 1 
0 1 2 
1 3 4 

quand je:

tdf 

je reçois:

<__main__.TestDFDisplay instance at 0x000000001A836788> 

Je préfère avoir le même code HTML de:

0 1 
0 1 2 
1 3 4 

Au lieu de cela, je pouvais:

from pandas import DataFrame 


class TestDFDisplay(): 
    def __init__(self): 
     self.dataframe = DataFrame([[1, 2], [3, 4]]) 

    def __getattr__(self, item): 
     try: 
      return object.__getattribute__(self, item) 
     except AttributeError: 
      try: 
       return getattr(self.dataframe, item) 
      except: 
       raise AttributeError 


tdf = TestDFDisplay() 

mais c'est une façon très lourde main de détourner toute tentative d'obtenir un attribut de l'instance de classe pour tenter de l'obtenir à partir du DataFrame. Cela fonctionne, mais je préfère être plus précis et faire un peu comme ce qui suit:

from pandas import DataFrame 


class TestDFDisplay(): 
    def __init__(self): 
     self.dataframe = DataFrame([[1, 2], [3, 4]]) 

    def __repr__(self): 
     return self.dataframe.__repr__() 


tdf = TestDFDisplay() 

Alors, quand je:

tdf 

Je reçois la version texte (qui est la même que celle affichée ici) et non la version HTML que je veux:

0 1 
0 1 2 
1 3 4 

Ce n'est pas grave. Cela signifie simplement que la méthode 'repr' n'était pas la bonne méthode appelée sur le DataFrame pour afficher le code HTML dans iPython Notebook.

Ma question est: Quelle est la bonne méthode que je devrais rediriger sur le DataFrame?

Merci, PiR

Répondre

2

Vous voulez la _repr_html_ C'est ce que IPython/Jupyter looks for lors de l'utilisation du système d'affichage riche (HTML).

Donc, dans votre classe

class TestDFDisplay(): 
    def __init__(self): 
     self.dataframe = DataFrame([[1, 2], [3, 4]]) 

    def _repr_html_(self): 
     return self.dataframe._repr_html_() 

devrait fonctionner.