讲师中心 微信公众号
AI工具推荐 视频效率加速

Kedro与Streamlit集成:动态数据目录在Web应用中的高效实践

阿萱酱_6952

阿萱酱_6952

发布时间:2025-11-13 10:59:17

|

1028人浏览过

|

来源于php中文网

原创

Kedro与Streamlit集成:动态数据目录在Web应用中的高效实践

本文深入探讨了如何在streamlit应用中无缝集成kedro数据管道,并动态传递自定义datacatalog。我们将分析常见的集成误区,特别是关于kedrosession和kedrocontext中datacatalog和pipeline_registry属性的错误使用,并提供一个清晰、可操作的解决方案,以实现streamlit加载数据后,通过内存数据集高效运行kedro管道,从而构建灵活的数据处理web应用。

Kedro与Streamlit集成的核心挑战

在构建数据驱动的Web应用时,将Streamlit的交互式前端与Kedro的强大数据管道后端结合是一种常见且高效的模式。然而,当需要在Streamlit中动态加载数据(例如通过文件上传),并将其作为输入传递给Kedro管道进行处理时,会遇到一些挑战。核心问题在于如何将Streamlit中已加载的Pandas DataFrame等内存数据,封装成Kedro可识别的DataCatalog,并在不修改Kedro项目配置的情况下,将其注入到管道执行流程中。

常见的需求场景包括:

  1. 用户通过Streamlit上传CSV或Excel文件。
  2. Streamlit将这些文件读取为Pandas DataFrame。
  3. 需要将这些DataFrame作为输入,运行一个或多个Kedro管道。
  4. Kedro管道处理完成后,将结果返回给Streamlit进行展示或进一步操作。

常见错误与原因分析

在尝试将自定义DataCatalog传递给Kedro管道时,开发者可能会遇到以下几种AttributeError或TypeError:

  1. AttributeError: can't set attribute 'catalog' 这个错误通常发生在尝试直接修改KedroSession或KedroContext的catalog属性时,例如 context.catalog = custom_catalog。 原因分析:在较新版本的Kedro中,KedroSession.catalog以及从session.load_context()获取到的context.catalog通常是只读的,或者不应通过直接赋值的方式来动态替换。Kedro设计其内部组件时,强调配置的不可变性,以确保管道执行的一致性和可预测性。

  2. AttributeError: 'KedroContext' object has no attribute 'pipeline_registry' 这个错误表明尝试访问KedroContext对象上不存在的pipeline_registry属性。 原因分析:KedroContext对象从未直接拥有名为pipeline_registry的属性。管道的注册和获取通常通过KedroSession或项目内部的机制来管理,而不是直接暴露在KedroContext上。

  3. TypeError: KedroSession.run() got an unexpected keyword argument 'extra_params' 这个错误通常与session.run()方法的参数变化有关。 原因分析:KedroSession.run()方法的签名可能会在不同Kedro版本中发生变化。extra_params参数在某些旧版本中可能用于传递额外的运行时参数,但在新版本中可能已被移除或替换为其他参数(如config_params)。因此,使用过时的参数会导致TypeError。

正确集成方案:动态DataCatalog的传递

解决上述问题的关键在于理解KedroSession.run()方法的设计意图,并利用其提供的data_catalog参数来注入自定义的DataCatalog。

核心思想: 在Streamlit中加载数据后,将这些数据封装成Kedro的MemoryDataSet,然后组合成一个临时的DataCatalog实例。最后,在调用KedroSession.run()时,通过data_catalog参数将这个自定义的DataCatalog传递进去。这样,Kedro管道在执行时会优先使用这个自定义的DataCatalog来查找输入数据,而不是默认的conf/base/catalog.yml中定义的数据集。

步骤一:在Streamlit中加载数据并创建MemoryDataSet

首先,在Streamlit应用中实现文件上传和数据加载逻辑,然后将加载的Pandas DataFrame封装成MemoryDataSet。MemoryDataSet是Kedro提供的一种特殊数据集,用于处理内存中的数据,而无需将其写入磁盘。

Adwords
Adwords

营销文案助手。标题公式(100个)、正文写作、AIDA框架、痛点挖掘、客户证言、落地页文案。Copywriting with 100 headline formulas, body copy, AIDA framework, pain points, testimonials.

下载
import streamlit as st
import pandas as pd
from kedro.io import DataCatalog, MemoryDataSet
from kedro.framework.session import KedroSession
import os

# 假设Kedro项目根目录的路径
# 请根据实际情况修改此路径,确保Streamlit应用可以访问到Kedro项目
KEDRO_PROJECT_PATH = os.path.abspath("./my_kedro_project") 

st.set_page_config(layout="wide")
st.title("Kedro管道与动态数据集成示例")

st.markdown("""
本应用演示了如何通过Streamlit上传数据,并将其作为自定义DataCatalog传递给Kedro管道进行处理。
""")

# Streamlit文件上传器
st.header("1. 上传输入数据")
uploaded_file_1 = st.file_uploader("上传第一个CSV文件 (例如: reagentes_raw.csv)", type=["csv"])
uploaded_file_2 = st.file_uploader("上传第二个CSV文件 (例如: balanco_de_massas_raw.csv)", type=["csv"])

df1, df2 = None, None

if uploaded_file_1:
    df1 = pd.read_csv(uploaded_file_1)
    st.success("文件 'reagentes_raw' 加载成功!")
    st.subheader("reagentes_raw 数据预览:")
    st.dataframe(df1.head())

if uploaded_file_2:
    df2 = pd.read_csv(uploaded_file_2)
    st.success("文件 'balanco_de_massas_raw' 加载成功!")
    st.subheader("balanco_de_massas_raw 数据预览:")
    st.dataframe(df2.head())

# 运行Kedro管道的按钮
st.header("2. 运行Kedro管道")
if st.button('处理数据') and df1 is not None and df2 is not None:
    if not os.path.exists(KEDRO_PROJECT_PATH):
        st.error(f"错误:Kedro项目路径不存在或不正确。请检查路径: {KEDRO_PROJECT_PATH}")
        st.stop()

    with st.spinner('正在执行Kedro管道...'):
        try:
            # 1. 创建自定义DataCatalog,使用MemoryDataSet封装DataFrame
            # 这里的键名 (例如 "reagentes_raw", "balanco_de_massas_raw") 
            # 必须与你的Kedro管道中定义的输入数据集名称一致。
            custom_catalog = DataCatalog({
                "reagentes_raw": MemoryDataSet(df1),
                "balanco_de_massas_raw": MemoryDataSet(df2),
                # 如果有更多数据集,按此模式添加
            })

            # 2. 初始化KedroSession并运行指定的管道
            # 确保 'my_kedro_pipeline' 是你Kedro项目中实际定义的管道名称
            with KedroSession.create(project_path=KEDRO_PROJECT_PATH) as session:
                # 通过 data_catalog 参数传入自定义的 DataCatalog
                session.run(pipeline_name="my_kedro_pipeline", data_catalog=custom_catalog)

            st.success('Kedro管道执行成功!')

            # 3. 从自定义catalog中加载管道输出结果
            # 假设管道输出一个名为 "processed_output_data" 的数据集
            # 这个数据集也必须被定义为MemoryDataSet在custom_catalog中
            if "processed_output_data" in custom_catalog.list():
                processed_data = custom_catalog.load("processed_output_data")
                st.header('3. 管道处理结果:')
                st.dataframe(processed_data.head())
                st.download_button(
                    label="下载处理后的数据 (CSV)",
                    data=processed_data.to_csv(index=False).encode('utf-8'),
                    file_name="processed_output.csv",
                    mime="text/csv",
                )
            else:
                st.warning("Kedro管道未将 'processed_output_data' 存储回自定义DataCatalog。请检查管道配置。")

        except Exception as e:
            st.error(f"运行Kedro管道时发生错误: {e}")
            st.exception(e)

步骤二:Kedro项目配置(示例)

为了使上述Streamlit应用能够成功运行,你需要有一个相应的Kedro项目。以下是一个简化的Kedro项目结构和管道示例,以匹配Streamlit代码中的数据集名称:

项目结构:

my_kedro_project/
├── conf/
│   └── base/
│       └── catalog.yml  # 可以为空或定义其他持久化数据集
│       └── parameters.yml
├── src/
│   └── my_kedro_project/
│       ├── __init__.py
│       ├── pipeline_registry.py
│       └── pipelines/
│           └── my_kedro_pipeline/
│               ├── __init__.py
│               ├── nodes.py
│               └── pipeline.py
└── pyproject.toml

src/my_kedro_project/pipelines/my_kedro_pipeline/nodes.py 示例:

import pandas as pd

def merge_and_process_data(df_reagentes: pd.DataFrame, df_balanco: pd.DataFrame) -> pd.DataFrame:
    """
    一个简单的节点函数,用于合并并处理两个输入DataFrame。
    """
    st.write("Kedro节点:正在合并数据...")
    # 假设这两个DataFrame有一个共同的键 'id' 用于合并
    # 实际项目中,你需要根据数据结构调整合并逻辑
    merged_df = pd.merge(df_reagentes, df_balanco, on='id', how='inner', suffixes=('_reag', '_bal'))

    # 进行一些简单的处理
    merged_df['calculated_value'] = merged_df['value_reag'] * merged_df['value_bal']

    return merged_df

# 注意:为了让Streamlit的st.write在Kedro节点中可见,你可能需要一些高级的日志捕获或回调机制。
# 在标准的Kedro执行中,st.write不会直接输出到Streamlit前端。
# 这里仅为示例,表明节点内部的逻辑。

src/my_kedro_project/pipelines/my_kedro_pipeline/pipeline.py 示例:

from kedro.pipeline import Pipeline, node
from .nodes import merge_and_process_data

def create_pipeline(**kwargs) -> Pipeline:
    """
    创建并注册 'my_kedro_pipeline'。
    输入数据集名称 ('reagentes_raw', 'balanco_de_massas_raw') 
    必须与Streamlit中自定义DataCatalog的键名一致。
    输出数据集名称 ('processed_output_data') 
    也应在自定义DataCatalog中被预期。
    """
    return Pipeline(
        [
            node(
                func=merge_and_process_data,
                inputs=["reagentes_raw", "balanco_de_massas_raw"],
                outputs="processed_output_data",
                name="merge_and_process_node",
            ),
        ]
    )

src/my_kedro_project/pipeline_registry.py 示例:

from typing import Dict, Any
from kedro.pipeline import Pipeline
from kedro.framework.project import find_pipelines

def register_pipelines() -> Dict[str, Pipeline]:
    """
    注册项目的管道。
    """
    pipelines = find_pipelines()
    # 注册你的管道,并将其设置为默认管道
    pipelines["__default__"] = pipelines["my_kedro_pipeline"]
    return pipelines

注意事项与最佳实践

  1. Kedro版本兼容性:KedroSession.run()方法的参数可能随Kedro版本更新而变化。始终查阅你所使用的Kedro版本的官方文档,以确保参数的正确性。
  2. 数据持久化:
    • 输入数据:如果Streamlit上传的数据量较大,或者需要在多次运行之间保持不变,可以考虑先将上传数据保存到临时文件(如Parquet),然后在Kedro管道的catalog.yml中定义相应的ParquetDataSet。但对于动态、一次性的内存数据,MemoryDataSet是更简洁的选择。
    • 输出数据:如果管道的输出需要持久化,可以在Kedro管道内部定义一个ParquetDataSet或CSVDataSet来将结果写入磁盘。或者,如示例所示,从自定义DataCatalog中加载结果MemoryDataSet后,在Streamlit中手动将其保存或提供下载。
  3. 错误处理与日志:在Streamlit应用中,务必使用try-except块捕获KedroSession.run()可能抛出的异常,并使用st.error()和st.exception()向用户提供友好的错误提示和详细的堆栈信息。
  4. Kedro项目路径:确保Streamlit应用能够正确找到KEDRO_PROJECT_PATH。在部署时,这可能意味着需要将Kedro项目作为子目录包含在Streamlit应用中,或者通过环境变量动态配置路径。
  5. 管道设计:设计Kedro管道时,输入数据集的名称(例如reagentes_raw)应与你在Streamlit中创建DataCatalog时使用的键名保持一致。这样,`session.run(data

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

300

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

212

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

371

2026.04.13

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1826

2025.08.19

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

909

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2500

2023.10.25

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.6万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn