当前位置: 首页 > news >正文

测试data_management函数

测试data_management函数

这是我最近正在开发的AI工具信息平台的部门功能模块测试,基于streamlit架构。整理出来与大家分享,也为我以后自己回溯找到资源。

为了测试 data_management 函数并结合 Excel 文件中的 “Tools” 表单内容,我们需要进行以下步骤:

  1. 确保 Excel 文件准备好:你的 Excel 文件(例如 test_tools.xlsx)应包含相关的工具数据。
  2. 实现 save_all_data 函数:确保有一个函数用于保存数据回 Excel 文件。
  3. 编写完整的测试代码:将 data_management 函数整合到一个 Streamlit 应用中,以便从 Excel 读取数据、执行管理操作并实时展示结果。

步骤 1:准备 Excel 文件

确保你的 Excel 文件 test_tools.xlsx 内容如下:

NameCategoryCountryCompanyDescriptionURLOpen SourcePopularityLastUpdated
通义千问大语言模型中国阿里巴巴阿里云企业级大模型平台https://tongyi.aliyun.com4002024/2/11
智谱清言App大语言模型中国智谱AI新一代认知智能大模型,提供对话、问答等功能https://chatglm.cn/50002025/1/22
Tool A大语言模型USACompany AA great toolhttp://example.com1002023/1/1
Tool B大语言模型CanadaCompany BAnother great toolhttp://example2.com2002023/1/2
Tool C大语言模型UKCompany CAmazing toolhttp://example3.com1502023/1/3

步骤 2:实现 save_all_data 函数

确保你能将数据保存回 Excel 文件。以下是一个简单的示例实现:

def save_all_data(excel_file, tools_data, tutorials_data):
    """保存所有数据到 Excel 文件"""
    with pd.ExcelWriter(excel_file) as writer:
        # 将工具数据写入工作表
        for category, items in tools_data.items():
            df = pd.DataFrame(items)
            df.to_excel(writer, sheet_name=category, index=False)
        
        # 如果有教程数据,也可以保存到对应的工作表
        if tutorials_data:  # 示例,如果有必要可以添加处理
            tutorials_df = pd.DataFrame(tutorials_data)
            tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)

    return True

步骤 3:编写完整的 Streamlit 应用代码

data_management 函数整合到一个完整的 Streamlit 应用中,读取 Excel 文件并实现数据的管理功能:

import pandas as pd
import streamlit as st
import datetime

# 国家标志示例
COUNTRY_FLAGS = {
    '中国': '🇨🇳',
    'USA': '🇺🇸',
    'Canada': '🇨🇦',
    'UK': '🇬🇧'
}

def save_all_data(excel_file, tools_data, tutorials_data):
    """保存所有数据到Excel"""
    try:
        tools_rows = []
        for category, items in tools_data.items():
            for item in items:
                tools_rows.append({
                    'Name': item['name'],
                    'Category': category,
                    'Country': item['country'],
                    'Company': item.get('company', ''),
                    'Description': item['description'],
                    'URL': item['url'],
                    'Open Source': item['open_source']
                })
        tools_df = pd.DataFrame(tools_rows)

        tutorials_rows = []
        for tool_name, tutorials in tutorials_data.items():
            for tut in tutorials:
                tutorials_rows.append({
                    'TutorialID': tut['id'],
                    'RelatedTool': tool_name,
                    'Title': tut['title'],
                    'URL': tut['url'],
                    'Type': tut['type'],
                    'DifficultyLevel': tut['difficulty'],
                    'Duration': tut.get('duration', ''),
                    'Rating': tut.get('rating', None),
                    'Language': tut.get('language', '中文'),
                    'Tags': ', '.join(tut.get('tags', [])),
                    'VersionCompatible': tut.get('version', ''),
                    'Author': tut.get('author', '')
                })
        tutorials_df = pd.DataFrame(tutorials_rows)

        with pd.ExcelWriter(excel_file, engine='openpyxl') as writer:
            tools_df.to_excel(writer, sheet_name='Tools', index=False)
            tutorials_df.to_excel(writer, sheet_name='Tutorials', index=False)
        return True
    except Exception as e:
        st.error(f"保存失败:{str(e)}")
        return False

class EnhancedConfig:
    SERPER_API_KEY = 'your api_key'  # 替换为实际的 API 密钥


def render_url(url):
    """根据URL生成超链接"""
    if url and url != '无':
        return f'<a href="{url}" class="link-btn" target="_blank">{url}</a>'
    else:
        return "<span>无可用链接</span>"


def classify_tool(name, description):
    """模拟分类工具的功能"""
    return '大语言模型'  # 示例返回


def data_management(excel_file, tools_data):
    # 新增分类验证功能
    if st.sidebar.button("🔍 分类质量检查"):
        error_count = 0
        for category, items in tools_data.items():
            for item in items:
                predicted = classify_tool(item['name'], item['description'])
                if predicted != category:
                    st.warning(f"分类不一致:{item['name']} 当前分类:{category},预测分类:{predicted}")
                    error_count += 1
        st.info(f"完成检查,发现{error_count}个潜在分类问题")

    # 数据管理界面
    st.sidebar.subheader("数据管理")
    operation = st.sidebar.radio("操作类型", ["添加条目", "编辑条目", "删除分类", "增加分类"])

    if operation == "添加条目":
        category = st.selectbox("选择分类", list(tools_data.keys()) + ["新增分类"])
        if category == "新增分类":
            category = st.text_input("请输入新分类名称")

        with st.form("添加表单"):
            name = st.text_input("工具名称")
            url = st.text_input("官网URL")
            country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()))
            company = st.text_input("公司名称")
            description = st.text_area("工具描述")
            open_source = st.selectbox("是否开源", ["是", "否"])
            popularity = st.slider("初始流行度", 500, 2000, 1000)

            if st.form_submit_button("提交"):
                if all([category, name, url]):
                    new_item = {
                        'name': name,
                        'url': url,
                        'description': description,
                        'country': country,
                        'open_source': open_source,
                        'company': company,
                        'popularity': popularity,
                        'last_updated': datetime.datetime.now()
                    }
                    if category not in tools_data:
                        tools_data[category] = []
                    tools_data[category].append(new_item)

                    if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                        st.success("添加成功!")
                else:
                    st.error("请填写必填字段(分类、名称、URL)")

    elif operation == "编辑条目":
        category = st.selectbox("选择分类", list(tools_data.keys()))
        items = tools_data.get(category, [])

        if items:
            index = st.selectbox("选择条目", range(len(items)), format_func=lambda x: items[x]['name'])

            with st.form("编辑表单"):
                new_category = st.text_input("新分类名称", value=category)
                name = st.text_input("工具名称", value=items[index]['name'])
                url = st.text_input("官网URL", value=items[index]['url'])

                # 确保安全地获取国家
                try:
                    selected_country_index = list(COUNTRY_FLAGS.keys()).index(items[index]['country'])
                except ValueError:
                    selected_country_index = 0  # 默认到第一个国家

                country = st.selectbox("所属国家", list(COUNTRY_FLAGS.keys()), index=selected_country_index)
                company = st.text_input("公司名称", value=items[index]['company'])
                description = st.text_area("工具描述", value=items[index]['description'])
                open_source = st.selectbox("是否开源", ["是", "否"],
                                           index=["是", "否"].index(items[index]['open_source']))

                if st.form_submit_button("保存修改"):
                    del tools_data[category][index]
                    if new_category not in tools_data:
                        tools_data[new_category] = []
                    tools_data[new_category].append({
                        'name': name,
                        'url': url,
                        'description': description,
                        'country': country,
                        'open_source': open_source,
                        'company': company
                    })
                    if not tools_data[category]:
                        del tools_data[category]

                    if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                        st.success("修改已保存!")

        else:
            st.warning("该分类下没有条目可供编辑或删除!")

    elif operation == "增加分类":
        new_category = st.text_input("请输入新分类名称")
        if st.button("提交"):
            if new_category:
                if new_category not in tools_data:
                    tools_data[new_category] = []
                    save_all_data(excel_file, tools_data, {})
                    st.success(f"分类 '{new_category}' 已成功添加!")
                else:
                    st.error("该分类已存在,请选择其他名称。")
            else:
                st.error("分类名称不能为空。")

    elif operation == "删除分类":
        category = st.selectbox("选择分类", list(tools_data.keys()))
        if st.button("确认删除"):
            del tools_data[category]

            if save_all_data(excel_file, tools_data, {}):  # 假设没有教程数据
                st.success(f"分类 {category} 已删除!")


def main():
    # 从 Excel 文件读取工具数据
    excel_file = 'test.xlsx'
    tools_data = {}

    # 读取 Excel 文件内容
    df = pd.read_excel(excel_file, sheet_name='Tools')

    # 构建工具数据字典
    for _, row in df.iterrows():
        category = row['Category']
        if category not in tools_data:
            tools_data[category] = []
        tools_data[category].append({
            'name': row['Name'],
            'url': row['URL'],
            'description': row['Description'],
            'country': row['Country'],
            'open_source': row['Open Source'],
            'company': row['Company'],
            'popularity': row['Popularity'],
            'last_updated': row['LastUpdated']
        })

    data_management(excel_file, tools_data)


if __name__ == "__main__":
    main()

步骤 4:运行测试

将上述代码保存为 Python 文件,例如 data_management_app.py,然后在命令行中运行以下命令:

streamlit run data_management_app.py

验证输出

当应用启动后,你应该能够通过侧边栏操作来:

  • 进行分类质量检查
  • 添加、编辑和删除条目
  • 增加或删除分类

确保在每次操作后正确更新 Excel 文件,并在页面上显示相应的结果和消息。

注意事项

  1. Excel 文件路径:确保 Excel 文件路径正确或与脚本在同一目录下。
  2. 异常处理:在操作中添加异常处理以捕获错误。
  3. 数据有效性检查:确保用户输入的数据格式正确。

通过这些步骤,你应该能够测试 data_management 函数。如果有任何问题或进一步的要求,请随时告诉我!

相关文章:

  • python爬虫——爬取全年天气数据并做可视化分析
  • JAVA最新版本详细安装教程(附安装包)
  • 解决pyenv versions没有列出系统的python版本
  • ue5.2.1 quixel brideg显示asset not available in uAsset format
  • 2025年-G10-Lc84-235.二叉搜索树的最低公共祖先-java版
  • HarmonyOS NEXT 创新应用开发白皮书(api12+)
  • QML Image 圆角设置
  • SpringBoot核心框架之AOP详解
  • Linux 内核自旋锁spinlock(三)--- MCS locks
  • 区块链中的递归长度前缀(RLP)序列化详解
  • JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测
  • Redis中集合(Set)常见命令详解
  • nginx配置ssl
  • Spring Boot拦截器(Interceptor)详解
  • P1034 [NOIP 2002 提高组] 矩形覆盖
  • DeepSeek人工智能大模型全解析:技术架构与应用场景解读
  • go 模块管理
  • react+typescript,初始化与项目配置
  • UE4 GamePlay架构介绍
  • Springboot的jak安装与配置教程
  • 小米SU7 Ultra风波升级:数百名车主要求退车,车主喊话雷军“保持真诚”
  • 最美西游、三星堆遗址等入选“2025十大年度IP”
  • 商务部就开展打击战略矿产走私出口专项行动应询答记者问
  • 全国层面首次!《防震减灾基本知识与技能大纲》发布
  • 乌外长:乌方准备无条件停火至少30天
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体