recherche
Maisondéveloppement back-endTutoriel PythonEssayez l'analyse de données en langage naturel avec Streamlit dans Snowflake (SiS)

Introduction

Snowflake a publié une fonctionnalité d'assistant LLM appelée Snowflake Copilot en tant que fonctionnalité de prévisualisation. Avec Snowflake Copilot, vous pouvez analyser les données des tableaux en langage naturel.

D'autre part, Streamlit in Snowflake (SiS) vous permet d'intégrer facilement l'IA générative et d'accéder en toute sécurité aux données des tables. Cela m’a fait réfléchir : pourrions-nous créer un outil d’analyse de données en langage naturel plus proactif ? J'ai donc développé une application capable d'analyser et de visualiser des données en utilisant le langage naturel.

Remarque : cet article représente mes opinions personnelles et non celles de Snowflake.

Présentation des fonctionnalités

Objectifs

  • Utilisable par les utilisateurs professionnels peu familiers avec SQL
  • Possibilité de sélectionner une base de données/schéma/table via des opérations de souris pour l'analyse
  • Capable d'analyser des requêtes en langage naturel très ambiguës

Captures d'écran réelles (extraits)

Ce qui suit sont des extraits des résultats d'analyse utilisant Cortex LLM (snowflake-arctic).

Try natural language data analysis with Streamlit in Snowflake (SiS)

Try natural language data analysis with Streamlit in Snowflake (SiS)

Try natural language data analysis with Streamlit in Snowflake (SiS)

Remarque : Nous avons utilisé cet ensemble de données sur la qualité du vin.

Liste des fonctionnalités

  • Sélectionnez Cortex LLM pour l'analyse
  • Choisissez DB/schéma/table pour analyse
  • Afficher les informations sur la colonne et les exemples de données de la table sélectionnée
  • Analyse utilisant la saisie en langage naturel des utilisateurs
    • Génération SQL automatique pour analyse
    • Exécution automatique du SQL généré
    • Affichage des résultats d'exécution des requêtes SQL
    • Informations sur les données fournies par Cortex LLM
  • Visualisation des données
    • Sélection et affichage de graphiques appropriés par Cortex LLM
    • Interprétation finale des données par Cortex LLM

Conditions de fonctionnement

  • Compte Snowflake avec accès à Cortex LLM
  • snowflake-ml-python 1.1.2 ou version ultérieure

Précautions

  • Soyez prudent lorsque vous utilisez de grands ensembles de données, car aucune limite de données n'est définie.
    • Le traitement des grands ensembles de résultats issus des requêtes SQL générées peut prendre du temps
    • Des ensembles de résultats volumineux peuvent provoquer des erreurs de limite de jetons LLM

Code source

from snowflake.snowpark.context import get_active_session
import streamlit as st
from snowflake.cortex import Complete as CompleteText
import snowflake.snowpark.functions as F
import pandas as pd
import numpy as np
import json
import plotly.express as px

# Get current session
session = get_active_session()

# Application title
st.title("Natural Language Data Analysis App")

# Cortex LLM settings
st.sidebar.title("Cortex LLM Settings")
lang_model = st.sidebar.radio("Select the language model you want to use", 
                              ("snowflake-arctic", "reka-flash", "reka-core", 
                               "mistral-large2", "mistral-large", "mixtral-8x7b", "mistral-7b", 
                               "llama3.1-405b", "llama3.1-70b", "llama3.1-8b", 
                               "llama3-70b", "llama3-8b", "llama2-70b-chat", 
                               "jamba-instruct", "gemma-7b")
)

# Function to escape column names
def escape_column_name(name):
    return f'"{name}"'

# Function to get table information
def get_table_info(database, schema, table):
    # Get column information
    columns = session.sql(f"DESCRIBE TABLE {database}.{schema}.{table}").collect()

    # Create DataFrame
    column_df = pd.DataFrame(columns)

    # Get row count
    row_count = session.sql(f"SELECT COUNT(*) as count FROM {database}.{schema}.{table}").collect()[0]['COUNT']

    # Get sample data
    sample_data = session.sql(f"SELECT * FROM {database}.{schema}.{table} LIMIT 5").collect()
    sample_df = pd.DataFrame(sample_data)

    return column_df, row_count, sample_df

# Data analysis function
def analyze(df, query):
    st.subheader("Result Analysis")

    # Display basic statistical information
    st.subheader("Basic Statistics")
    st.write(df.describe())

    # Use AI for data analysis
    analysis_prompt = f"""
    Based on the following dataframe and original question, please perform data analysis.
    Concisely explain in English the insights, trends, and anomalies derived from the data.
    If possible, please also mention the following points:
    1. Data distribution and characteristics
    2. Presence of abnormal values or outliers
    3. Correlations between columns (if there are multiple numeric columns)
    4. Time-series trends (if there is date or time data)
    5. Category-specific features (if data can be divided by categories)

    Dataframe:
    {df.to_string()}

    Original question:
    {query}
    """

    analysis = CompleteText(lang_model, analysis_prompt)
    st.write(analysis)

# Data visualization function
def smart_data_visualization(df):
    st.subheader("Smart Data Visualization")

    if df.empty:
        st.warning("The dataframe is empty. There is no data to visualize.")
        return

    # Request AI for graph suggestion
    columns_info = "\n".join([f"{col} - type: {df[col].dtype}" for col in df.columns])
    sample_data = df.head().to_string()

    visualization_prompt = f"""
    Analyze the information of the following dataframe and suggest the most appropriate graph type and the columns to use for its x-axis and y-axis.
    Consider the characteristics of the data to ensure a meaningful visualization.

    Column information:
    {columns_info}

    Sample data:
    {sample_data}

    Please provide only the following JSON data format as your response:
    {{
        "graph_type": "One of: scatter plot, bar chart, line chart, histogram, box plot",
        "x_axis": "Column name to use for x-axis",
        "y_axis": "Column name to use for y-axis (if applicable)",
        "explanation": "Brief explanation of the selection reason"
    }}
    """

    ai_suggestion = CompleteText(lang_model, visualization_prompt)

    try:
        suggestion = json.loads(ai_suggestion)
        graph_type = suggestion['graph_type']
        x_axis = suggestion['x_axis']
        y_axis = suggestion.get('y_axis')  # y-axis might not be needed in some cases
        explanation = suggestion['explanation']

        st.write(f"AI recommended graph: {graph_type}")
        st.write(f"Selection reason: {explanation}")

        if graph_type == "scatter plot":
            fig = px.scatter(df, x=x_axis, y=y_axis, title=f"{x_axis} vs {y_axis}")
        elif graph_type == "bar chart":
            fig = px.bar(df, x=x_axis, y=y_axis, title=f"{y_axis} by {x_axis}")
        elif graph_type == "line chart":
            fig = px.line(df, x=x_axis, y=y_axis, title=f"{y_axis} over {x_axis}")
        elif graph_type == "histogram":
            fig = px.histogram(df, x=x_axis, title=f"Distribution of {x_axis}")
        elif graph_type == "box plot":
            fig = px.box(df, x=x_axis, y=y_axis, title=f"Distribution of {y_axis} by {x_axis}")
        else:
            st.warning(f"Unsupported graph type: {graph_type}")
            return

        st.plotly_chart(fig)

    except json.JSONDecodeError:
        st.error("Failed to parse AI suggestion. Please try again.")
    except KeyError as e:
        st.error(f"AI suggestion is missing necessary information: {str(e)}")
    except Exception as e:
        st.error(f"An error occurred while creating the graph: {str(e)}")

    # AI interpretation of visualization
    visualization_interpretation_prompt = f"""
    Based on the following dataset and created graph, please provide a detailed interpretation of the data trends and characteristics in English.
    Point out possible insights, patterns, anomalies, or areas that require additional analysis.

    Dataset information:
    Columns: {', '.join(df.columns)}
    Number of rows: {len(df)}

    Created graph:
    Type: {graph_type}
    X-axis: {x_axis}
    Y-axis: {y_axis if y_axis else 'None'}
    """

    ai_interpretation = CompleteText(lang_model, visualization_interpretation_prompt)
    st.subheader("AI Interpretation of the Graph")
    st.write(ai_interpretation)

# Function to handle cases where AI response is not just SQL query
def clean_sql_query(query):
    # Remove leading and trailing whitespace
    query = query.strip()
    # If not starting with SQL keywords, remove everything up to the first SELECT
    if not query.upper().startswith(('SELECT')):
        keywords = ['SELECT']
        for keyword in keywords:
            if keyword in query.upper():
                query = query[query.upper().index(keyword):]
                break
    return query

# Function for natural language querying of DB
def data_analysis_and_natural_language_query():
    # Database selection
    databases = session.sql("SHOW DATABASES").collect()
    database_names = [row['name'] for row in databases]
    selected_database = st.selectbox("Select a database", database_names)

    if selected_database:
        # Schema selection
        schemas = session.sql(f"SHOW SCHEMAS IN DATABASE {selected_database}").collect()
        schema_names = [row['name'] for row in schemas]
        selected_schema = st.selectbox("Select a schema", schema_names)

        if selected_schema:
            # Table selection
            tables = session.sql(f"SHOW TABLES IN {selected_database}.{selected_schema}").collect()
            table_names = [row['name'] for row in tables]
            selected_table = st.selectbox("Select a table", table_names)

            if selected_table:
                # Get table information
                column_df, row_count, sample_df = get_table_info(selected_database, selected_schema, selected_table)

                st.subheader("Table Information")
                st.write(f"Table name: `{selected_database}.{selected_schema}.{selected_table}`")
                st.write(f"Total rows: **{row_count:,}**")

                st.subheader("Column Information")
                st.dataframe(column_df)

                st.subheader("Sample Data (showing only 5 rows)")
                st.dataframe(sample_df)

                # Stringify table information (for AI)
                table_info = f"""
                Table name: {selected_database}.{selected_schema}.{selected_table}
                Total rows: {row_count}

                Column information:
                {column_df.to_string(index=False)}
                Sample data:
                {sample_df.to_string(index=False)}
                """

                # Natural language input from user
                user_query = st.text_area("Enter what you want to know about the selected table")

                if st.button("Start Analysis"):
                    if user_query:
                        # Use AI to generate SQL
                        prompt = f"""
                        Based on the following table information and question, please generate an appropriate SQL query.
                        Return only the generated SQL query without any additional response.

                        Table information:
                        {table_info}

                        Question: {user_query}

                        Notes:
                        - Follow Snowflake SQL syntax.
                        - Use aggregate functions to keep the query result size manageable.
                        - Use {selected_database}.{selected_schema}.{selected_table} as the table name.
                        """

                        generated_sql = CompleteText(lang_model, prompt)
                        generated_sql = clean_sql_query(generated_sql)
                        st.subheader("Generated SQL:")
                        st.code(generated_sql, language='sql')

                        try:
                            # Execute the generated SQL
                            result = session.sql(generated_sql).collect()
                            df = pd.DataFrame(result)

                            st.subheader("Query Result:")
                            st.dataframe(df)

                            # Analyze results
                            analyze(df, user_query)

                            # Smart data visualization
                            smart_data_visualization(df)

                        except Exception as e:
                            st.error(f"An error occurred while executing the query: {str(e)}")
                    else:
                        st.warning("Please enter a question.")

# Execution part
data_analysis_and_natural_language_query()

Conclusion

La possibilité d'analyser facilement les données des tables en langage naturel sans connaissances en SQL ou Python pourrait élargir considérablement la portée de l'utilisation des données dans les entreprises pour les utilisateurs professionnels. En ajoutant des fonctionnalités telles que la jonction de plusieurs tableaux ou l'augmentation de la variété des graphiques de visualisation, des analyses encore plus complexes peuvent être effectuées. J'encourage tout le monde à essayer de mettre en œuvre la démocratisation de l'analyse des données à l'aide de Streamlit dans Snowflake.

Annonces

Snowflake Quoi de neuf Mises à jour sur X

Je partage les nouveautés de Snowflake sur X. N'hésitez pas à suivre si vous êtes intéressé !

Version anglaise

Snowflake Quoi de neuf Bot (version anglaise)
https://x.com/snow_new_en

Version japonaise

Snowflake Quoi de neuf Bot (version japonaise)
https://x.com/snow_new_jp

Historique des modifications

(20240914) Message initial

Article japonais original

https://zenn.dev/tsubasa_tech/articles/2608c820294860

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Manière correcte d'utiliser pip avec l'image Python OpenShift UBI8Manière correcte d'utiliser pip avec l'image Python OpenShift UBI8Oct 13, 2025 pm 12:12 PM

Cet article vise à résoudre le problème selon lequel la commande pip est introuvable lors de la création d'une image Docker à l'aide de l'image Python OpenShift UBI8. En analysant le message d'erreur et en combinant les caractéristiques de l'image, une solution claire est fournie, qui consiste à appeler pip en utilisant le chemin complet de l'interpréteur Python, et les raisons possibles sont expliquées.

Extrapolation par interpolation spline bidimensionnelle à l'aide de RBFInterpolatorExtrapolation par interpolation spline bidimensionnelle à l'aide de RBFInterpolatorOct 13, 2025 am 11:57 AM

Cet article décrit comment utiliser la classe RBFInterpolator de la bibliothèque scipy.interpolate pour effectuer une interpolation spline 2D et extrapoler au-delà de la plage des données d'origine. Les étapes spécifiques de préparation des données, de formation du modèle et d'extrapolation sont démontrées en détail à travers un exemple de code, et les avantages de l'utilisation de RBFInterpolator par rapport à Rbf et aux données de grille sont soulignés.

Analyse des erreurs de chaîne d'instruction Python print() et de concaténation de nombres et meilleures pratiquesAnalyse des erreurs de chaîne d'instruction Python print() et de concaténation de nombres et meilleures pratiquesOct 13, 2025 am 11:43 AM

Cet article fournit une analyse détaillée des TypeErrors courantes provoquées par la fonction print() en Python lors de l'utilisation d'opérateurs pour concaténer des chaînes et des nombres à virgule flottante. Le principal problème est que Python ne permet pas la concaténation directe de chaînes et de types non-chaînes (tels que les nombres à virgule flottante). Le didacticiel fournit une solution pour convertir explicitement des nombres à virgule flottante en chaînes et présente d'autres méthodes de formatage d'impression plus flexibles et recommandées pour aider les développeurs à écrire un code de sortie plus robuste et plus lisible.

Série chronologique Pandas : extension de l'application de fonction pour mettre en œuvre une réinitialisation quotidienneSérie chronologique Pandas : extension de l'application de fonction pour mettre en œuvre une réinitialisation quotidienneOct 13, 2025 am 11:36 AM

Ce didacticiel explique comment implémenter la stratégie de calcul de réinitialisation quotidienne de la fonction Expansion() dans les données de séries chronologiques Pandas. En convertissant l'index date-heure en regroupement par jour et en combinant les méthodes groupby() et Expansion(), le besoin de réaccumuler les calculs au début de chaque nouvelle date peut être efficacement résolu, garantissant ainsi l'exactitude et l'indépendance des résultats d'analyse au niveau du jour.

Tutoriel Python pour télécharger des fichiers compressés d'URL et extraire correctement le contenuTutoriel Python pour télécharger des fichiers compressés d'URL et extraire correctement le contenuOct 13, 2025 am 11:09 AM

Ce didacticiel vise à résoudre le problème suivant : lors du téléchargement d'un fichier à partir d'une URL, si le fichier source est en fait un package compressé (tel que ZIP) plutôt qu'un fichier directement lisible (tel que CSV), le fichier sera endommagé ou ne pourra pas être analysé. Nous présenterons en détail comment utiliser la bibliothèque de requêtes de Python pour les téléchargements en streaming, combinée avec les modules zipfile et tempfile, pour télécharger, stocker temporairement et décompresser correctement en toute sécurité et efficacement des fichiers compressés dans des URL afin de garantir l'intégrité et la disponibilité des données.

Tutoriel sur le filtrage des modèles associés en fonction des chemins d'URL dans les modèles DjangoTutoriel sur le filtrage des modèles associés en fonction des chemins d'URL dans les modèles DjangoOct 13, 2025 am 10:33 AM

Cet article vise à guider les développeurs sur la manière de restituer conditionnellement les données de modèle enfant associées appartenant à un modèle parent spécifique en vérifiant le chemin de l'URL actuel dans un modèle Django. Nous explorerons la mise en œuvre de l'utilisation des balises {% if ... in ... %} directement dans le modèle en conjonction avec request.get_full_path et les ID de modèle associés, et mettrons en évidence les meilleures pratiques pour le filtrage des données au niveau de la couche de vue.

Utilisez pycaw pour détecter efficacement l'état de la lecture audio sous WindowsUtilisez pycaw pour détecter efficacement l'état de la lecture audio sous WindowsOct 13, 2025 am 09:48 AM

Cet article explique comment utiliser la bibliothèque Python pycaw pour détecter de manière fiable l'état de la lecture audio sur les systèmes d'exploitation Windows. En simplifiant la manipulation directe de l'interface COM sous-jacente, pycaw fournit une méthode stable et facile à mettre en œuvre pour identifier s'il existe actuellement une session audio active, évitant ainsi la complexité et les plantages de programme pouvant résulter de la gestion manuelle des objets COM.

Commande Python pydoc : posture d'utilisation correcte et analyse des problèmes courantsCommande Python pydoc : posture d'utilisation correcte et analyse des problèmes courantsOct 13, 2025 am 09:12 AM

Cet article vise à aider les lecteurs à utiliser correctement l'outil pydoc de Python pour afficher la documentation des fonctions et modules intégrés. Nous expliquerons le fonctionnement de pydoc et fournirons des solutions possibles et des conseils d'utilisation au problème selon lequel pydoc renvoie des informations sur le package au lieu de la documentation sur les fonctions pour aider les lecteurs à obtenir rapidement les informations sur les fonctions requises.

See all articles

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Sujets chauds