[PYTHON] Transférer les données vers une autre page (onglet) avec streamlit

1. Premier

Les résultats de l'analyse des données peuvent être rapidement visualisés sous forme d'application Web streamlit. C'est amusant car il existe différents échantillons sur le site officiel. Celui que j'ai vu récemment a été utilisé par huggingface pour Afficher les ensembles de données publiés.

J'utilise streamlit très facilement, mais lorsque je passe à une autre page (onglet) avec un bouton radio comme la page ci-dessous, toutes les variables et les dataframes disparaissent. Lorsque je télécharge des données sur la page «Données d'entrée» et que je vais sur la page «Traitement des données», je ne peux pas me référer aux données que j'ai téléchargées et placées dans le dataframe.

image.png

Page de téléchargement de données → page de traitement des données → page de visualisation des données, etc. J'avais des problèmes lorsque je voulais traiter des données sur plusieurs pages. Si vous essayez de le compléter en une seule page, il sera très long verticalement en raison des spécifications actuelles de streamlit.

2. Résumé

C'était bien de se promener sur Internet et de relayer en utilisant la session à la fin, alors je vais l'écrire. Partie du foie ↓

<détails>

partie session </ summary>

class _SessionState:

    def __init__(self, session, hash_funcs):
        """Initialize SessionState instance."""
        self.__dict__["_state"] = {
            "data": {},
            "hash": None,
            "hasher": _CodeHasher(hash_funcs),
            "is_rerun": False,
            "session": session,
        }

    def __call__(self, **kwargs):
        """Initialize state data once."""
        for item, value in kwargs.items():
            if item not in self._state["data"]:
                self._state["data"][item] = value

    def __getitem__(self, item):
        """Return a saved state value, None if item is undefined."""
        return self._state["data"].get(item, None)
        
    def __getattr__(self, item):
        """Return a saved state value, None if item is undefined."""
        return self._state["data"].get(item, None)

    def __setitem__(self, item, value):
        """Set state value."""
        self._state["data"][item] = value

    def __setattr__(self, item, value):
        """Set state value."""
        self._state["data"][item] = value
    
    def clear(self):
        """Clear session state and request a rerun."""
        self._state["data"].clear()
        self._state["session"].request_rerun()
    
    def sync(self):
        """Rerun the app with all state values up to date from the beginning to fix rollbacks."""

        # Ensure to rerun only once to avoid infinite loops
        # caused by a constantly changing state value at each run.
        #
        # Example: state.value += 1
        if self._state["is_rerun"]:
            self._state["is_rerun"] = False
        
        elif self._state["hash"] is not None:
            if self._state["hash"] != self._state["hasher"].to_bytes(self._state["data"], None):
                self._state["is_rerun"] = True
                self._state["session"].request_rerun()

        self._state["hash"] = self._state["hasher"].to_bytes(self._state["data"], None)


def _get_session():
    session_id = get_report_ctx().session_id
    session_info = Server.get_current()._get_session_info(session_id)

    if session_info is None:
        raise RuntimeError("Couldn't get your Streamlit Session object.")
    
    return session_info.session


def _get_state(hash_funcs=None):
    session = _get_session()

    if not hasattr(session, "_custom_session_state"):
        session._custom_session_state = _SessionState(session, hash_funcs)

    return session._custom_session_state


3. 3. Exemple spécifique

Si vous mettez ce qui précède dans le code,

def main():
    state = _get_state()
    pages = {
        "Des données d'entrée":in_page,
        "Traitement de l'information":tran_page,
        "Visualisation de données":out_page
    }

    #st.sidebar.title(":floppy_disk: Page states")
    page = st.sidebar.radio("Sélection de page", tuple(pages.keys()))

    # Display the selected page with the session state
    pages[page](state)

    # Mandatory to avoid rollbacks with widgets, must be called at the end of your app
    state.sync()

Créer une page principale avec Vous pouvez connecter la page que vous souhaitez livrer et la page que vous souhaitez accepter avec l'état. ~~. Bien sûr, j'ai également pu passer le dataframe.

def in_page(state):
    ~~~
    
    #Indiquez la variable que vous souhaitez transmettre.~~Mettre dans
    state.dataframe1 = dataframe1
    state.var1 = var1

def tran_page(state):
    #La variable que vous souhaitez accepter~~=state.~~Accepter à.
    dataframe1 = state.dataframe1
    var1 = state.var1
    ~~~

def out_page(state):
    ~~~

#Enfin principal()Et exécutez.
main()

4. Référence

Recommended Posts

Transférer les données vers une autre page (onglet) avec streamlit
Comment augmenter les données avec PyTorch
Convertir des données Excel en JSON avec python
Envoyer des données à l'API DRF avec Vue.js
Convertissez des données FX 1 minute en données 5 minutes avec Python
Essayez de convertir en données ordonnées avec les pandas
décalage du consommateur kafka-copy vers un autre avec python
Comment lire les données de problème avec Paiza
Comment créer des exemples de données CSV avec hypothèse
Essayez d'agréger les données de musique doujin avec des pandas
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
J'ai essayé de sauvegarder les données avec discorde
Enregistrez les données pour flasher avec la carte Nucleo STM32
J'ai essayé d'obtenir des données CloudWatch avec Python
Comment récupérer des données de courses de chevaux avec Beautiful Soup
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
Je veux recommencer avec Migrate de Django
Extraire des données d'une page Web avec Python
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS