2021-09-07: python对中文名称重排序

本文介绍了一种使用Python实现的中文名称重排序算法,通过cmp_str函数比较并整理'vidlist.txt'文件中的视频ID,便于后续操作。重点在于字符串处理和文件读写技巧。

对中文名称重排序

import functools
def cmp_str(s1, s2):
    pos1 = s1.find('-')
    pos2 = s2.find('-')
    i1 = int(s1[:pos1])
    i2 = int(s2[:pos2])
    if i1 < i2:
        return -1
    if i1 > i2:
        return 1
    return 0



with open('E:\\vidlist.txt','r',encoding='UTF-8') as vislst:
    vlst = vislst.readlines()
    for v in vlst:
        v=v.strip()
        pos = v.find('-')        
        try:
            i = int(v[:pos])
        except:
            print(v[:pos])
        

    vlst = list(map(str.strip, vlst))
    vlst.sort(key=functools.cmp_to_key(cmp_str))
    for vid in vlst:
        print(vid)
2025-09-19 22:39:11.615 WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.615 WARNING streamlit.runtime.scriptrunner_utils.script_run_context: Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Warning: to view this Streamlit app on a browser, run it with the following command: streamlit run Z:\PythonProject_9_19_GBDT\CZD_9_19_RFR.py [ARGUMENTS] 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Session state does not function when running a script without `streamlit run` 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.774 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.775 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.995 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.996 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.998 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode. 2025-09-19 22:39:11.999 Thread 'MainThread': missing ScriptRunContext! This warning can be ignored when running in bare mode.
最新发布
09-20
<think> 我们遇到了一个警告和错误。警告是关于Streamlit的ScriptRunContext缺失,这通常是因为我们不是在Streamlit环境中运行,或者运行方式不正确。而错误是KeyError: 'time',这是因为在数据预处理函数中,我们尝试访问数据框中的'time'列,但该列不存在。 根据之前的修复,我们已经将列名改为中文,并且使用了中文映射。但是,在代码中我们仍然使用'time'作为列名,而实际上我们已经将其映射为'时间'。 因此,我们需要修改预处理函数中的所有'time'为'时间'。 此外,错误信息还显示我们是在没有使用`streamlit run`命令的情况下运行脚本。因此,我们需要确保使用正确的命令运行。 让我们进行以下修复: 1. 确保在预处理函数中使用中文列名'时间',而不是'time'。 2. 确保在运行应用时使用`streamlit run your_script.py`。 同时,我们注意到在预处理函数中,我们创建了一个映射并重命名了列,但是在重命名后,我们仍然使用字符串'时间'来访问列,这应该是正确的。 但是,错误信息显示在预处理函数中尝试访问`df['time']`,这显然会导致KeyError,因为我们已经将列名改为'时间'(中文)。因此,我们需要检查预处理函数中是否还有使用'time'字符串的地方。 在之前的修复代码中,我们已经将预处理函数中的'time'替换为'时间'。但是,请注意我们最初在预处理函数中是这样写的: df['time'] = pd.to_datetime(df['time']) 这行代码会引发错误,因为列名已经被改为'时间'。 因此,我们需要将预处理函数中所有使用字符串'time'的地方改为'时间'。 修改后的预处理函数部分如下: 原代码: df['time'] = pd.to_datetime(df['time']) ... df = df.sort_values('time') 应改为: df['时间'] = pd.to_datetime(df['时间']) ... df = df.sort_values('时间') 另外,我们在创建future_turbidity时,使用了'出水浊度'列,如果该列不存在,我们会添加一列全为NaN的future_turbidity。但是,我们在对齐滞后效应时,使用了shift(-1),这依赖于数据是按时间排序且等间隔的。 现在,我们更正预处理函数中的列名,并重新检查。 同时,我们注意到在运行应用时,控制台输出的警告信息提示我们使用了错误的运行方式。请确保在命令行中使用: streamlit run Z:\PythonProject_9_19_GBDT\CZD_9_19_RFR.py 而不是直接运行python脚本。 下面给出完整的修正后的预处理函数和相关部分代码: </think> 您的错误日志表明存在两个核心问题: 1. 脚本没有使用 `streamlit run` 命令正确启动 2. 数据预处理阶段出现了 `KeyError: 'time'` 错误 让我提供完整的修复方案和优化后的代码: ### 完整修复方案 ```python import pandas as pd import numpy as np import streamlit as st from sklearn.ensemble import RandomForestRegressor from xgboost import XGBRegressor from sklearn.preprocessing import StandardScaler import joblib import matplotlib.pyplot as plt import os import datetime import warnings # 忽略特定警告 warnings.filterwarnings("ignore", category=UserWarning, module="streamlit") # 水厂映射 PLANT_MAP = { "锦北水厂": "JB", "高虹水厂": "GH", "龙岗水厂": "LG", "太湖源水厂": "THY" } # 中文列名列表(完整版) CHINESE_COLUMNS = [ "时间", "原水浊度", "原水ph", "1#沉淀池流量", "1#矾液流量", "2#沉淀池流量", "2#矾液流量", "矾原液密度", "矾液浓度", "1#需矾量", "2#需矾量", "1#沉后ph", "1#沉后浊度", "2#沉后ph", "2#沉后浊度", "滤后ph", "滤后浊度", "出水ph", "出水浊度" ] # 数据预处理函数(增强健壮性) def preprocess_data(df): """处理缺失值和时间滞后对齐""" try: # 规范化列名(处理大小写和空格) df.columns = df.columns.str.strip().str.replace(' ', '') # 重命名列以匹配中文名称 col_mapping = {} for col in df.columns: # 尝试匹配标准中文列名 for chinese_col in CHINESE_COLUMNS: if chinese_col in col: col_mapping[col] = chinese_col break else: # 保留无法识别的列名 col_mapping[col] = col df = df.rename(columns=col_mapping) # 检查时间列是否存在 if '时间' not in df.columns: # 尝试识别类似时间的列 for col in df.columns: if '时间' in col or 'date' in col.lower() or 'timestamp' in col.lower(): df = df.rename(columns={col: '时间'}) break else: # 创建时间索引 df['时间'] = pd.date_range(start='2020-01-01', periods=len(df), freq='4H') # 处理时间格式 try: df['时间'] = pd.to_datetime(df['时间']) except Exception: # 尝试解析不同格式 try: df['时间'] = pd.to_datetime(df['时间'], format='%Y/%m/%d %H:%M') except: try: df['时间'] = pd.to_datetime(df['时间'], format='%Y-%m-%d %H:%M:%S') except: df['时间'] = pd.to_datetime(df['时间'], errors='coerce') # 删除全空列 df = df.dropna(axis=1, how='all') # 排序并处理时间序列 df = df.sort_values('时间').reset_index(drop=True) # 对齐滞后效应(4小时后的出水浊度) if '出水浊度' in df.columns: # 确保时间间隔一致性 time_diff = (df['时间'].iloc[1] - df['时间'].iloc[0]).total_seconds() / 3600 shift_steps = round(4 / time_diff) if time_diff > 0 else 1 df['future_turbidity'] = df['出水浊度'].shift(-shift_steps) else: st.warning("数据文件中缺少出水浊度列") df['future_turbidity'] = np.nan # 添加非线性特征 if '原水浊度' in df.columns and '原水ph' in df.columns: df['turbidity_ph_interaction'] = df['原水浊度'] * df['原水ph'] if '1#沉淀池流量' in df.columns and '矾原液密度' in df.columns: df['flow_density_interaction'] = df['1#沉淀池流量'] * df['矾原液密度'] / 1000 return df.dropna() except Exception as e: st.error(f"数据处理错误: {str(e)}") return pd.DataFrame() # 模型训练函数(增强健壮性) def train_models(df): """训练需矾量和水质预测模型""" if df is None or df.empty or 'future_turbidity' not in df.columns: st.error("无效的数据集,无法训练模型") return None, None, None try: # 特征选择 - 动态检测可用特征 alum_features = [] for col in ['原水浊度', '原水ph', '矾原液密度', '矾液浓度']: if col in df.columns: alum_features.append(col) flow_features = [] for col in ['1#沉淀池流量', '2#沉淀池流量']: if col in df.columns: flow_features.append(col) quality_features = alum_features + flow_features for col in ['1#需矾量', '2#需矾量']: if col in df.columns: quality_features.append(col) # 数据集拆分 X_alum = df[alum_features + flow_features] X_quality = df[quality_features] y_alum = df[['1#需矾量', '2#需矾量']] if '1#需矾量' in df.columns and '2#需矾量' in df.columns else None y_quality = df['future_turbidity'] # 需矾量模型(双输出) alum_model = RandomForestRegressor(n_estimators=150, random_state=42, max_depth=8) if y_alum is not None: alum_model.fit(X_alum, y_alum) else: st.warning("缺失需矾量数据,无法训练需矾量模型") alum_model = None # 水质预测模型 quality_model = XGBRegressor(n_estimators=200, learning_rate=0.08, max_depth=5) scaler = StandardScaler() if not X_quality.empty: X_quality_scaled = scaler.fit_transform(X_quality) quality_model.fit(X_quality_scaled, y_quality) else: st.warning("缺失水质特征数据,无法训练水质模型") quality_model = None scaler = None return alum_model, quality_model, scaler except Exception as e: st.error(f"模型训练错误: {str(e)}") return None, None, None # 初始化应用 st.set_page_config( layout="wide", page_title="自来水厂矾液投加优化系统", page_icon="💧" ) # 检查是否在Streamlit环境中运行 if st.runtime.exists(): st.title("自来水厂矾液投加优化系统") else: st.warning("⚠️ 请使用 `streamlit run your_script.py` 命令运行此应用") st.stop() # 侧边栏 - 水厂选择 with st.sidebar: st.header("水厂配置") plant_name = st.selectbox("选择水厂", list(PLANT_MAP.keys())) plant_code = PLANT_MAP[plant_name] file_path = f"{plant_code}_water_quality_data.csv" st.divider() st.header("模型状态") # 初始化模型状态 if 'models' not in st.session_state: st.session_state.models = {} # 尝试加载数据 model_status = st.empty() if os.path.exists(file_path): try: # 尝试多种可能的编码 encodings = ['utf-8', 'gbk', 'latin1', 'ISO-8859-1'] for encoding in encodings: try: df = pd.read_csv(file_path, encoding=encoding) model_status.info(f"正在加载 {plant_name} 数据...") break except UnicodeDecodeError: continue else: df = pd.read_csv(file_path, encoding='utf-8', errors='replace') model_status.warning(f"使用错误替换方式加载 {plant_name} 数据") # 处理数据 processed_df = preprocess_data(df) if not processed_df.empty: # 训练或加载模型 if plant_code not in st.session_state.models: model_status.info(f"{plant_name}模型训练中...") alum_model, quality_model, scaler = train_models(processed_df) if alum_model and quality_model and scaler: st.session_state.models[plant_code] = { 'alum': alum_model, 'quality': quality_model, 'scaler': scaler, 'df': processed_df } model_status.success(f"{plant_name}模型加载成功!") else: model_status.error(f"{plant_name}模型训练失败") else: model_status.success(f"{plant_name}模型已加载") else: model_status.warning(f"{plant_name}数据处理后为空") except Exception as e: model_status.error(f"加载数据失败: {str(e)}") else: model_status.warning(f"找不到数据文件: {file_path}") # 创建空DF防止后续错误 st.session_state.models[plant_code] = { 'alum': None, 'quality': None, 'scaler': None } # 主界面选项卡 tab1, tab2, tab3 = st.tabs(["需矾量预测", "水质预测", "反馈与优化"]) # 需矾量预测页面 with tab1: st.header("需矾量预测") # 使用容器组织布局 with st.container(): col1, col2 = st.columns([1, 1], gap="large") with col1: st.subheader("1#生产线参数", divider="blue") turbidity_1 = st.number_input("原水浊度(NTU)", min_value=0.1, value=15.0, key="turb1") ph_1 = st.number_input("原水pH", min_value=6.0, max_value=9.0, value=7.2, key="ph1") flow_1 = st.number_input("1#沉淀池流量(m³/h)", min_value=100, value=1500, key="flow1") with col2: st.subheader("2#生产线参数", divider="blue") flow_2 = st.number_input("2#沉淀池流量(m³/h)", min_value=100, value=1800, key="flow2") density = st.number_input("矾原液密度(kg/m³)", min_value=1000.0, value=1200.0) concentration = st.number_input("矾液浓度(%)", min_value=1.0, max_value=30.0, value=10.0) # 预测按钮 if st.button("预测需矾量", type="primary", use_container_width=True): model_data = st.session_state.models.get(plant_code, {}) if not model_data or not model_data.get('alum'): st.error(f"未找到{plant_name}的需矾量模型") else: try: alum_model = model_data['alum'] # 预测1#需矾量 input_1 = [[turbidity_1, ph_1, density, concentration, flow_1, 0]] pred_1 = alum_model.predict(input_1)[0][0] # 预测2#需矾量 input_2 = [[turbidity_1, ph_1, density, concentration, 0, flow_2]] pred_2 = alum_model.predict(input_2)[0][1] # 显示结果 st.success(f"1#生产线推荐需矾量: **{pred_1:.2f} kg/h**") st.success(f"2#生产线推荐需矾量: **{pred_2:.2f} kg/h**") # 存储结果 st.session_state['alum_pred'] = (pred_1, pred_2) st.session_state['current_params'] = { 'turbidity': turbidity_1, 'ph': ph_1, 'density': density, 'concentration': concentration, 'flow1': flow_1, 'flow2': flow_2 } # 显示成功消息 st.toast("预测成功!", icon="✅") except Exception as e: st.error(f"预测失败: {str(e)}") st.exception(e) # 水质预测页面(简略版) with tab2: st.header("水质预测") if 'alum_pred' not in st.session_state: st.warning("请先在需矾量预测页面获取预测值") else: pred_1, pred_2 = st.session_state['alum_pred'] params = st.session_state['current_params'] # 水质预测输入 with st.expander("当前参数详情"): st.write(f"- 原水浊度: {params['turbidity']} NTU") st.write(f"- 原水pH: {params['ph']}") st.write(f"- 矾原液密度: {params['density']} kg/m³") st.write(f"- 矾液浓度: {params['concentration']}%") st.write(f"- 1#沉淀池流量: {params['flow1']} m³/h") st.write(f"- 2#沉淀池流量: {params['flow2']} m³/h") st.write(f"- 预测1#需矾量: {pred_1:.2f} kg/h") st.write(f"- 预测2#需矾量: {pred_2:.2f} kg/h") if st.button("预测出厂水浊度", type="primary"): model_data = st.session_state.models.get(plant_code, {}) if not model_data or not model_data.get('quality'): st.error(f"未找到{plant_name}的水质预测模型") else: try: quality_model = model_data['quality'] scaler = model_data['scaler'] # 准备输入数据 input_data = [[ params['turbidity'], params['ph'], params['density'], params['concentration'], params['flow1'], params['flow2'], pred_1, pred_2 ]] # 标准化并预测 scaled_input = scaler.transform(input_data) turbidity_pred = quality_model.predict(scaled_input)[0] # 显示结果 st.success(f"预测出厂水浊度: **{turbidity_pred:.2f} NTU**") st.session_state['turbidity_pred'] = turbidity_pred st.toast("水质预测成功!", icon="💧") except Exception as e: st.error(f"水质预测失败: {str(e)}") st.exception(e) # 反馈与优化页面(简略版) with tab3: st.header("反馈数据收集") if 'turbidity_pred' not in st.session_state: st.warning("请先完成水质预测") else: with st.form("反馈表单"): actual_turbidity = st.number_input("实际出厂水浊度(NTU)", min_value=0.01, value=0.5) accuracy = st.slider("预测准确度评分", 0, 100, 80) notes = st.text_area("备注信息") submitted = st.form_submit_button("提交反馈") if submitted: # 记录反馈逻辑 st.success("反馈数据已提交!") st.toast("数据保存成功!", icon="📝") ``` ### 关键修复点说明 1. **Streamlit 运行环境检测**: ```python # 检查是否在Streamlit环境中运行 if st.runtime.exists(): # 正常代码 else: st.warning("⚠️ 请使用 `streamlit run your_script.py` 命令运行此应用") st.stop() ``` 2. **健壮的时间列处理**: ```python # 检查时间列是否存在 if '时间' not in df.columns: # 尝试识别类似时间的列 for col in df.columns: if '时间' in col or 'date' in col.lower() or 'timestamp' in col.lower(): df = df.rename(columns={col: '时间'}) break else: # 创建时间索引 df['时间'] = pd.date_range(start='2020-01-01', periods=len(df), freq='4H') ``` 3. **动态滞后步长计算**: ```python # 确保时间间隔一致性 time_diff = (df['时间'].iloc[1] - df['时间'].iloc[0]).total_seconds() / 3600 shift_steps = round(4 / time_diff) if time_diff > 0 else 1 df['future_turbidity'] = df['出水浊度'].shift(-shift_steps) ``` 4. **多重编码尝试**: ```python # 尝试多种可能的编码 encodings = ['utf-8', 'gbk', 'latin1', 'ISO-8859-1'] for encoding in encodings: try: df = pd.read_csv(file_path, encoding=encoding) break except UnicodeDecodeError: continue else: df = pd.read_csv(file_path, encoding='utf-8', errors='
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值