pd.concat列名不变

时间: 2025-04-27 09:30:13 浏览: 21
### 如何在使用 Pandas `concat` 时保持原有列名 当使用 `pd.concat()` 函数连接多个 DataFrame 对象时,默认情况下会保留原始的列名。然而,如果不同 DataFrame 中存在相同名称的列,则这些列会被直接拼接在一起而不会重命名。 为了确保在连接过程中不改变任何现有的列名,并且处理可能存在的同名列情况,可以采取如下措施: - **检查并统一列名**:在执行连接操作之前确认所有待连接的数据框具有唯一的列标签。 - **设置参数 `join='outer'` 和 `ignore_index=False`**:这能保证即使索引不同也能正确合并,并维持原有序号而不重新编号[^1]。 下面是一个具体的例子展示如何实现这一点: ```python import pandas as pd # 创建两个示例数据帧 df1 = pd.DataFrame([ ["张三", 28], ["李四", 32], ["王二", 19] ], columns=['name', 'age'], index=['no_001', 'no_002', 'no_003']) df2 = pd.DataFrame([ ["李四", 32, 'A'], ["王二", 19, 'B'] ], columns=['name', 'age', 'level'], index=['no_004', 'no_005']) # 使用 concat 进行纵向堆叠(axis=0),并且指定 join='outer' result_df = pd.concat([df1, df2], axis=0, join='outer') print(result_df) ``` 上述代码片段展示了通过 `pd.concat()` 方法沿垂直方向(即按照行)将两个 DataFrames 合并起来的方式。这里选择了外连接 (`join='outer'`) 来确保所有的行都被包含进来;同时由于没有更改默认的 `ignore_index=True` 参数设定,所以最终得到的结果表中的索引将会被重置为连续整数序列[^4]。 需要注意的是,在这个特定的例子中,虽然我们希望保持原来的列名不变,但由于第二个 DataFrame 包含了一个额外的新列 `'level'` ,因此它也会自然地成为结果集中的一部分。对于那些只存在于其中一个输入 DataFrame 的列来说,它们对应的缺失值位置将以 NaN 表示。
阅读全文

相关推荐

import baostock as bs import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams ['font.sans-serif'] ='SimHei' #显示中文 plt.rcParams ['axes.unicode_minus']=False #显示负号 three_factors=pd.read_csv('fivefactor_daily.csv')[['trddy','mkt_rf','smb','hml','rmw','cma']].rename(columns={'trddy':'日期'}).set_index('日期') three_factors=three_factors.loc['2023-04-01':'2024-03-31',:] three_factors.index=pd.to_datetime(three_factors.index) three_factors.head(3) def sum_return_ratio(price_list): '''实际总收益率''' price_list=price_list.to_numpy() return (price_list[-1]-price_list[0])/price_list[0] def MaxDrawdown(price_list): '''最大回撤率''' i = np.argmax((np.maximum.accumulate(price_list) - price_list) / np.maximum.accumulate(price_list)) # 结束位置 if i == 0: return 0 j = np.argmax(price_list[:i]) # 开始位置 return (price_list[j] - price_list[i]) / (price_list[j]) def sharpe_ratio(price_list,rf=0.000041): '''夏普比率''' #公式 夏普率 = (回报率均值 - 无风险率) / 回报率的标准差 # pct_change()是pandas里面的自带的计算每日增长率的函数 daily_return = price_list.pct_change() return daily_return.mean()-rf/ daily_return.std() def Information_Ratio(price_list,rf=0.000041): '''信息比率''' chaoer=sum_return_ratio(price_list)-((1+rf)**365-1) return chaoer/np.std(price_list.pct_change()-rf) def deal(code='', mode='五因子'): day_return = return_dict[code] # ['收益率'] day_return.index = pd.to_datetime(day_return.index) 实际总收益率 = sum_return_ratio(day_return['收盘']) 最大回测率 = MaxDrawdown(day_return['收盘']) 夏普比率 = sharpe_ratio(day_return['收盘']) 信息比率 = Information_Ratio(day_return['收盘']) zgpa_threefactor = pd.merge(three_factors, day_return, left_index=True, right_index=True) if mode == '五因子': result = sm.OLS(zgpa_threefactor['收益率'], sm.add_constant(zgpa_threefactor.loc[:, ['mkt_rf', 'smb', 'hml', 'rmw', 'cma']])).fit() betas = result.params return pd.DataFrame( {'阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3], '盈利能力因子RMW': betas[4], '投资风格因子CMA': betas[5], '实际总收益率': 实际总收益率, '最大回测率': 最大回测率, '夏普比率': 夏普比率, '信息比率': 信息比率, '股票代码': code}, index=[0]) else: # zgpa_threefactor = pd.merge(three_factors, day_return,left_index=True, right_index=True) result = sm.OLS(zgpa_threefactor['收益率'], sm.add_constant(zgpa_threefactor.loc[:, ['mkt_rf', 'smb', 'hml']])).fit() betas = result.params return pd.DataFrame( {'阿尔法': betas[0], '市场风险因子MKT': betas[1], '市值因子SMB': betas[2], '账面市值因子HML': betas[3], '实际总收益率': 实际总收益率, '最大回测率': 最大回测率, '夏普比率': 夏普比率, '信息比率': 信息比率, '股票代码': code}, index=[0]) df_results = pd.DataFrame() for code, df_one in return_dict.items(): result = deal(code=code,mode='五因子'); result['股票名称'] = code_name[code] df_results = pd.concat([df_results, result], axis=0, ignore_index=True) df_results=df_results[['股票代码', '股票名称','阿尔法', '市场风险因子MKT', '市值因子SMB', '账面市值因子HML', '实际总收益率', '最大回测率', '夏普比率', '信息比率']].sort_values(by='阿尔法',ascending=False) df_results ### 储存结果 df_results.to_csv('五因子结果.csv',index=False)代码运行错误怎样更改

import pandas as pd import numpy as np import pandas as pd from sklearn.utils import shuffle # 读取你的Excel文件(注意Windows路径需要转义) file_path = r'C:\Users\Administrator\Desktop\data3.xlsx' # 使用原始字符串避免转义问题 df = pd.read_excel(file_path, engine='openpyxl') # 必须指定engine参数 class DynamicTemperatureNoise: def __init__(self, temp_col_name='主燃区温度', # 温度特征列名 base_noise_scale=5.0, # 基础噪声标准差(°C) max_noise_scale=20.0, # 最大噪声标准差(°C) epoch_growth=0.3, # 每轮训练噪声强度增长系数 keep_ratio=0.7): # 每条数据被增强的概率 self.temp_col = temp_col_name self.base_scale = base_noise_scale self.max_scale = max_noise_scale self.epoch_growth = epoch_growth self.keep_ratio = keep_ratio self.current_epoch = 0 # 需要在外层训练循环中更新 def _dynamic_scale(self): """动态计算当前epoch的噪声强度""" return min(self.base_scale * (1 + self.epoch_growth * self.current_epoch), self.max_scale) def __call__(self, df): """对输入DataFrame进行增强""" # 深拷贝原始数据避免污染 augmented_df = df.copy() # 随机选择要增强的样本(增强概率=1 - keep_ratio) mask = np.random.rand(len(df)) > self.keep_ratio selected_data = df[mask] if not selected_data.empty: # 生成动态噪声(高斯分布) current_scale = self._dynamic_scale() noise = np.random.normal(0, current_scale, size=len(selected_data)) # 仅对温度列添加噪声,其他特征保持不变 augmented_temp = selected_data[self.temp_col] + noise # 限制温度物理合理性(假设温度范围0-2000°C) augmented_temp = np.clip(augmented_temp, 0, 2000) # 替换原始温度值 augmented_df.loc[mask, self.temp_col] = augmented_temp # 打乱增强后的数据 return shuffle(pd.concat([df, augmented_df], ignore_index=True)) #========================= 使用示例 =========================# # 假设原始数据存储在df中,包含列:掺氨比,过量空气系数,燃尽风位置,主燃区温度,NO排放浓度 # df = pd.read_csv('your_data.csv') # 初始化增强器 noise_augmenter = DynamicTemperatureNoise( temp_col_name='主燃区温度', base_noise_scale=10.0, # 初始噪声标准差10°C max_noise_scale=50.0, # 最大噪声不超过50°C epoch_growth=0.2 # 每轮噪声强度增加20% ) # 模拟训练循环(需要在外层更新current_epoch) for epoch in range(100): noise_augmenter.current_epoch = epoch # 关键步骤:更新当前epoch # 每个epoch开始时增强数据 augmented_data = noise_augmenter(df) # 在此处进行训练步骤... # model.fit(augmented_data[features], augmented_data['NO排放浓度']) # 保存增强后的数据集 # augmented_data.to_csv('augmented_data.csv', index=False) output_path = r'C:\Users\Administrator\Desktop\augdata.xlsx' augmented_data.to_excel(output_path, index=False) 检查错误,并修改为增加到300个数据

for file_path in file_list: try: base_name = os.path.basename(file_path) output_name = f"{os.path.splitext(base_name)[0]}模型评估结果.xlsx" output_path = os.path.join(output_folder, output_name) print(f"\n正在处理文件:{base_name}") df = pd.read_excel(file_path) df.columns = df.columns.str.strip() df['Qe'] = df['Removal'] * 0.01 * df['Initial'] / df['Biomass'] X = df[features] y = df[target_column] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) model = CatBoostRegressor(**catboost_params) model.fit(X_train, y_train) # 预测与评估... # 预测与评估(保持不变) y_pred = model.predict(X_test) y_train_pred = model.predict(X_train) # 指标计算(保持不变) metrics = { '训练集 MSE': mean_squared_error(y_train, y_train_pred), '测试集 MSE': mean_squared_error(y_test, y_pred), '训练集 RMSE': np.sqrt(mean_squared_error(y_train, y_train_pred)), '测试集 RMSE': np.sqrt(mean_squared_error(y_test, y_pred)), '训练集 R²': r2_score(y_train, y_train_pred), '测试集 R²': r2_score(y_test, y_pred) } # 保存结果(保持不变) results_df = pd.DataFrame({ '数据集': ['训练集', '测试集'], 'MSE': [metrics['训练集 MSE'], metrics['测试集 MSE']], 'RMSE': [metrics['训练集 RMSE'], metrics['测试集 RMSE']], 'R²': [metrics['训练集 R²'], metrics['测试集 R²']] }) results_df.to_excel(output_path, index=False) # 汇总数据收集(保持不变) summary_data = { '文件名': base_name, **{k: v for k, v in metrics.items()} } all_results.append(summary_data) print(f"已保存结果至:{output_path}") # ========== SHAP分析 ========== explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) # 可视化 plt.figure(figsize=(10, 6)) shap.summary_plot(shap_values, X_test, plot_type="bar", show=False) plt.savefig(os.path.join(shap_folder, f"{base_name}_特征重要性.png"), dpi=300) plt.close() plt.figure(figsize=(10, 6)) shap.summary_plot(shap_values, X_test, show=False) plt.savefig(os.path.join(shap_folder, f"{base_name}_SHAP分布.png"), dpi=300) plt.close() # 保存SHAP值 shap_df = pd.DataFrame(shap_values, columns=features) shap_df['文件名'] = base_name all_shap = pd.concat([all_shap, shap_df], axis=0) # 汇总统计 mean_abs_shap = pd.Series(np.abs(shap_values).mean(axis=0), index=features) # ========== SHAP结束 ========== # 更新结果 summary_data = { '文件名': base_name, **{k: v for k, v in metrics.items()}, **{f"{feat}_SHAP": mean_abs_shap[feat] for feat in features} } all_results.append(summary_data) except Exception as e: print(f"处理错误:{str(e)}") continue分析这段代码中可能出现的问题

import pandas as pd import numpy as np from sklearn.utils import shuffle # 读取原始数据 file_path = r'C:\Users\Administrator\Desktop\掺氨比、燃尽风位置、主燃区温度\原数据.xlsx' df = pd.read_excel(file_path, engine='openpyxl') class TemperatureAugmenter: def __init__(self, temp_col='掺氨比', # 温度特征列名 base_noise=0.5, # 基础噪声强度(°C) max_noise=2.5): # 最大噪声强度(°C) self.temp_col = temp_col self.base_noise = base_noise self.max_noise = max_noise def augment(self, df, target_size=50): """核心增强逻辑:填充至目标数量""" current_size = len(df) if current_size >= target_size: return df # 计算需要生成的样本数 num_needed = target_size - current_size # 从原始数据中有放回采样 augmented_samples = df.sample(n=num_needed, replace=True, random_state=42) # 生成动态噪声(基于当前需要生成的样本数) noise = np.random.normal(0, self.base_noise, num_needed) # 添加噪声并限制物理范围 augmented_samples[self.temp_col] = np.clip( augmented_samples[self.temp_col] + noise, 60, # 温度最小值 90 # 温度最大值 ) # 合并原始数据与增强数据 combined_df = pd.concat([df, augmented_samples], ignore_index=True) # 打乱数据集顺序 return shuffle(combined_df) #========================= 使用示例 =========================# # 初始化增强器(保持与原始代码相似的参数结构) augmenter = TemperatureAugmenter( temp_col='主燃区温度', base_noise=0.5, # 基础噪声标准差10°C max_noise=30 # 最大噪声不超过50°C ) # 执行增强(自动填充至300条) augmented_data = augmenter.augment(df, target_size=50) # 保存增强后的数据集 output_path = r'C:\Users\Administrator\Desktop\掺氨比、燃尽风位置、主燃区温度\掺氨比.xlsx' augmented_data.to_excel(output_path, index=False) 修改为扩展10条在60到90之间的掺氨比数据

import pandas as pd import numpy as np from sklearn.utils import shuffle class MultiColumnAugmenter: def __init__(self, column_configs=[ {'name': '掺氨比', 'base_noise': 0.1, 'max_noise': 0.5,'min_val': 60, 'max_val': 90, 'target_size': 10}, {'name': '主燃区温度', 'base_noise': 10, 'max_noise': 50, 'min_val': 600, 'max_val': 2000, 'target_size': 300} ]): """ 多列数据增强器 :param column_configs: 列配置列表,每列包含: - name: 列名 - base_noise: 基础噪声标准差 - max_noise: 允许的最大噪声绝对值 - min_val/max_val: 数值物理范围 - target_size: 该列目标样本数 """ self.column_configs = {conf['name']: conf for conf in column_configs} def augment(self, df): """执行多列增强""" # 获取最大目标样本数 max_target = max(conf['target_size'] for conf in self.column_configs.values()) # 原始数据不足时进行增强 if len(df) < max_target: num_needed = max_target - len(df) augmented = df.sample(n=num_needed, replace=True, random_state=42) # 逐列添加噪声 for col_conf in self.column_configs.values(): col = col_conf['name'] noise = np.clip( np.random.normal(0, col_conf['base_noise'], num_needed), -col_conf['max_noise'], col_conf['max_noise'] ) augmented[col] = np.clip( augmented[col] + noise, col_conf['min_val'], col_conf['max_val'] ) # 合并并打乱 combined_df = pd.concat([df, augmented], ignore_index=True) return shuffle(combined_df) else: return df #========================= 使用示例 =========================# # 读取数据 file_path = r'C:\Users\Administrator\Desktop\掺氨比、燃尽风位置、主燃区温度\原数据.xlsx' df = pd.read_excel(file_path, engine='openpyxl') # 初始化增强器(参数已内置配置) augmenter = MultiColumnAugmenter() # 执行增强(自动按各列target_size处理) augmented_data = augmenter.augment(df) # 保存结果 output_path = r'C:\Users\Administrator\Desktop\掺氨比、燃尽风位置、主燃区温度\主燃区温度扩展300掺氨比扩展10.xlsx' augmented_data.to_excel(output_path, index=False) 代码如何修改能使掺氨比扩展出60、70、80、90的数据

pip install pandas openpyxl xlsxwriter tqdm import pandas as pd import re from tqdm import tqdm import os def filter_single_company_news(input_path, output_path, company_list): # === 1. 前置检查 === if not os.path.exists(input_path): raise FileNotFoundError(f"文件 {input_path} 不存在") # === 2. 加载公司列表 === with open(company_list, 'r', encoding='utf-8') as f: companies = [line.strip() for line in f if line.strip()] # === 3. 构建正则表达式 === escaped_companies = [re.escape(company) for company in companies] boundary_pattern = r'(?<![一-鿿a-zA-Z0-9])(?:{})(?![一-鿿a-zA-Z0-9])'.format('|'.join(escaped_companies)) cross_regex = re.compile( r'({}).*?({})'.format(boundary_pattern, boundary_pattern), flags=re.IGNORECASE ) # === 4. 分块处理(关键修复) === try: # 分块读取(添加 chunksize 参数) chunks = pd.read_excel(input_path, engine='openpyxl', chunksize=10000) except Exception as e: raise ValueError(f"Excel文件读取失败: {str(e)}") filtered_dfs = [] for chunk in tqdm(chunks, desc="处理进度"): # === 列名检查 === if 'NewsContent' not in chunk.columns: raise KeyError("Excel文件中必须包含 'NewsContent' 列") # === 类型转换 === chunk['NewsContent'] = chunk['NewsContent'].astype(str) # === 检测函数 === def check_multiple(text): matches = cross_regex.findall(text) if not matches: return False unique_companies = {m[0].lower() for m in matches} | {m[1].lower() for m in matches} return len(unique_companies) >= 2 # === 生成过滤掩码 === mask = chunk['NewsContent'].apply(lambda x: not check_multiple(x)) filtered_dfs.append(chunk[mask]) # === 5. 保存结果 === if filtered_dfs: final_df = pd.concat(filtered_dfs, ignore_index=True) final_df.to_excel(output_path, index=False, engine='xlsxwriter') print(f"处理完成!保留数据量:{len(final_df)}条") else: print("警告:未处理任何数据!") # === 使用示例 === if __name__ == "__main__": filter_single_company_news( input_path='sample.xlsx', output_path='filtered_news.xlsx', company_list='companies.txt' ) 以上为完整代码,运行到此处报错。 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_14844/3787377892.py in filter_single_company_news(input_path, output_path, company_list) 20 # 分块读取(添加 chunksize 参数) ---> 21 chunks = pd.read_excel(input_path, engine='openpyxl', chunksize=5000) 22 except Exception as e: D:\py\anaconda\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs) 310 ) --> 311 return func(*args, **kwargs) 312 TypeError: read_excel() got an unexpected keyword argument 'chunksize' During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_14844/3187432990.py in <module> 1 # === 使用示例 === 2 if __name__ == "__main__": ----> 3 filter_single_company_news( 4 input_path='sample.xlsx', 5 output_path='filtered_news.xlsx', ~\AppData\Local\Temp/ipykernel_14844/3787377892.py in filter_single_company_news(input_path, output_path, company_list) 21 chunks = pd.read_excel(input_path, engine='openpyxl', chunksize=5000) 22 except Exception as e: ---> 23 raise ValueError(f"Excel文件读取失败: {str(e)}") 24 25 filtered_dfs = [] ValueError: Excel文件读取失败: read_excel() got an unexpected keyword argument 'chunksize'

import os import pandas as pd from prophet import Prophet from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score import matplotlib.pyplot as plt import numpy as np # 数据加载与清洗函数 def load_and_clean_data(folder_path): all_files = [ os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.csv') and '阜阳' in f ] list_df = [] for filename in all_files: try: # 读取CSV文件,假设列之间由多个空格分隔 df = pd.read_csv( filename, delim_whitespace=True, header=None, names=[ 'Year', 'Month', 'Day', 'Hour', 'Air Temperature', 'Dew Point Temperature', 'Sea Level Pressure', 'Wind Direction', 'Wind Speed Rate', 'Sky Condition Total Coverage Code', 'Liquid Precipitation 1H', 'Liquid Precipitation 6H' ], dtype={'Year': int, 'Month': int, 'Day': int, 'Hour': int} ) # 处理温度数据 df['Air Temperature'] = pd.to_numeric(df['Air Temperature'], errors='coerce') / 10 df.replace(-999.9, np.nan, inplace=True) # 假设-9999/10为缺失值 # 生成时间戳 df['Datetime'] = pd.to_datetime( df[['Year', 'Month', 'Day', 'Hour']], format='%Y%m%d%H', errors='coerce' ) # 删除无效时间和缺失值 df = df.dropna(subset=['Datetime', 'Air Temperature']) df = df[['Datetime', 'Air Temperature']].set_index('Datetime') list_df.append(df) except Exception as e: print(f"Error processing {filename}: {str(e)}") # 合并并重采样为3小时频率 full_df = pd.concat(list_df).sort_index() full_df = full_df.resample('3H').mean().ffill() # 前向填充缺失值 return full_df # 加载数据 folder_path = 'E:/11/阜阳气象数据' df = load_and_clean_data(folder_path).reset_index() df.columns = ['ds', 'y'] # 划分数据集 train_df = df[df['ds'] < '2021-01-01'] test_df = df[df['ds'] >= '2021-01-01'] # 初始化Prophet模型 model = Prophet( yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False, changepoint_prior_scale=0.05 # 调整趋势变化灵敏度 ) # 添加自定义季节性 model.add_seasonality(name='quarterly', period=91.25, fourier_order=8) model.add_seasonality(name='monthly', period=30.5, fourier_order=5) # 训练模型 model.fit(train_df) # 生成未来数据框(预测到2023年底) future = model.make_future_dataframe( periods=int(3 * 365 * 24 / 3), # 3年数据(2021-2023) freq='3H', include_history=False ) # 执行预测 forecast = model.predict(future) # 评估性能 merged = test_df.merge(forecast[['ds', 'yhat']], on='ds', how='inner') mse = mean_squared_error(merged['y'], merged['yhat']) mae = mean_absolute_error(merged['y'], merged['yhat']) r2 = r2_score(merged['y'], merged['yhat']) print(f""" Model Performance: - MSE: {mse:.2f} - MAE: {mae:.2f} - R²: {r2:.2f} """) # 可视化结果 fig1 = model.plot(forecast) plt.title('Temperature Forecast') fig2 = model.plot_components(forecast) # 提取趋势变化点 changepoints = model.changepoints trend_changes = forecast.loc[changepoints, 'trend'].diff().dropna() print("Significant trend changes at:") print(trend_changes[abs(trend_changes) > 0.5]) # 显示显著变化点 # 保存预测结果 forecast[['ds', 'yhat']].to_csv('fuyang_forecast_2021-2023.csv', index=False)Error processing E:/11/阜阳气象数据\2003阜阳.csv: invalid literal for int() with base 10: ‘2003,1,1,0,-38,-48,10338,90,20,0,-9999,0’

import pandas as pd import matplotlib.pyplot as plt data1 = pd.read_excel(r"C:\Users\tengh\Desktop\3\农排灌溉、煤改电\煤改电\一般台区(200户以上)类型台区晋中市21年12月29日-22年01月05日96点数据鼓楼变采集点\煤改电用户功率.xlsx", parse_dates=["数据日期"]) data2 = pd.read_excel(r"C:\Users\tengh\Desktop\3\农排灌溉、煤改电\煤改电\一般台区(200户以上)类型台区晋中市21年12月29日-22年01月05日96点数据鼓楼变采集点\乡村居民生活用电功率.xlsx", parse_dates=["数据日期"]) # 筛选用户并处理数据类型 user1 = data1[data1["用户/台区名称"] == "程玉林(煤改电)"] user2 = data2[data2["用户/台区名称"] == "胡晋雅"] # 预处理:确保数值类型 time_columns = user1.columns[8:-1] user1[time_columns] = user1[time_columns].apply(pd.to_numeric, errors='coerce').fillna(0) user2[time_columns] = user2[time_columns].apply(pd.to_numeric, errors='coerce').fillna(0) # 合并数据 combined = ( user1.set_index("数据日期")[time_columns] .add(user2.set_index("数据日期")[time_columns], fill_value=0) .groupby(level=0).sum() ) # 绘图设置 plt.figure(figsize=(15, 8)) for date in combined.index.unique(): daily_data = combined.loc[date] plt.plot( daily_data.values.astype(float), label=date.strftime("%Y-%m-%d") ) # 以下坐标设置保持不变 plt.xlabel("时间点(15分钟间隔)") plt.ylabel("总有功功率(kW)") plt.title("7×24小时功率叠加图") plt.xticks( range(0, 96, 4), [f"{i//4}:{i%4*15:02d}" for i in range(0, 96, 4)], rotation=45 ) plt.legend() plt.grid() plt.tight_layout() plt.show()所有天数的数据合并成一条线,即所有时间点连起来。如果数据是7天,每天96点,合并后变成7*96=672点,横坐标可能需要调整。

import os import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import MinMaxScaler from sklearn.svm import SVR from sklearn.metrics import mean_squared_error, r2_score def process_single_file(file_path, output_dir, features, target_column): try: # 读取数据 df = pd.read_excel(file_path) df.columns = df.columns.str.strip() # 提取特征和目标 X = df[features] y = df[target_column] # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 特征归一化 scaler_X = MinMaxScaler() X_train_scaled = scaler_X.fit_transform(X_train) X_test_scaled = scaler_X.transform(X_test) # 目标归一化 scaler_y = MinMaxScaler() y_train_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).flatten() y_test_scaled = scaler_y.transform(y_test.values.reshape(-1, 1)).flatten() # 参数网格 param_grid = { 'kernel': ['rbf', 'poly'], 'C': np.logspace(-2, 3, 6), 'gamma': np.logspace(-4, 0, 5), 'epsilon': [0.05, 0.1, 0.2], 'degree': [2, 3] } # 建模与调参 svr = SVR(max_iter=10000, tol=1e-4) grid_search = GridSearchCV(svr, param_grid, cv=5, scoring='neg_mean_squared_error', verbose=0) grid_search.fit(X_train_scaled, y_train_scaled) # 最佳模型预测 best_svr = grid_search.best_estimator_ y_test_pred = best_svr.predict(X_test_scaled) y_test_pred_original = scaler_y.inverse_transform(y_test_pred.reshape(-1, 1)).flatten() # 计算指标 mse = mean_squared_error(y_test, y_test_pred_original) rmse = np.sqrt(mse) r2 = r2_score(y_test, y_test_pred_original) # 创建结果DataFrame file_name = os.path.basename(file_path) results = pd.DataFrame({ '文件名': [file_name], '最佳参数': [str(grid_search.best_params_)], '测试集MSE': [mse], '测试集RMSE': [rmse], '测试集R²': [r2] }) # 保存单独结果 output_path = os.path.join(output_dir, f"{os.path.splitext(file_name)[0]}_结果.xlsx") os.makedirs(os.path.dirname(output_path), exist_ok=True) results.to_excel(output_path, index=False) return results except Exception as e: print(f"处理文件 {file_path} 时出错: {str(e)}") return None # 配置参数 INPUT_DIR = "microalgae" # 原始文件存放目录 OUTPUT_DIR = "SVR结果" # 结果输出目录 SUMMARY_FILE = "SVR模型汇总结果.xlsx" # 汇总文件名 FEATURES = ['T', 'Ph', 'Biomass', 'Time', 'Initial'] # 特征列 TARGET = 'Removel' # 目标列 # 获取所有Excel文件 all_files = [os.path.join(INPUT_DIR, f) for f in os.listdir(INPUT_DIR) if f.endswith('.xlsx') or f.endswith('.xls')] # 处理所有文件并汇总结果 all_results = [] for file in all_files: print(f"正在处理文件: {file}") result = process_single_file(file, OUTPUT_DIR, FEATURES, TARGET) if result is not None: all_results.append(result) # 合并结果并保存 if all_results: summary_df = pd.concat(all_results, ignore_index=True) summary_df.to_excel(os.path.join(OUTPUT_DIR, SUMMARY_FILE), index=False) print(f"处理完成!共处理 {len(all_results)} 个文件,汇总结果已保存。") else: print("没有成功处理任何文件。")代码出现Found input variables with inconsistent numbers of samples

def get_5_workdays_back(end_date=None): """计算从结束日期倒推5个工作日的起始日期""" end_date = pd.Timestamp.now().normalize() if end_date is None else end_date count = 0 current_date = end_date # 复用原有节假日配置 holidays = [ # 元旦(不调休) '2025-01-01', # 周三 # 春节(调休2天) '2025-01-28', '2025-01-29', '2025-01-30', '2025-01-31', '2025-02-01', '2025-02-02', '2025-02-03', '2025-02-04', # 1.28(除夕)-2.4 # 清明节(不调休) '2025-04-04', '2025-04-05', '2025-04-06', # 周五-周日 # 劳动节(调休1天) '2025-05-01', '2025-05-02', '2025-05-03', '2025-05-04', '2025-05-05', # 周四-周一 # 端午节(不调休) '2025-05-31', '2025-06-01', '2025-06-02', # 周六-周一 # 中秋节+国庆节(调休2天) '2025-10-01', '2025-10-02', '2025-10-03', '2025-10-04', '2025-10-05', '2025-10-06', '2025-10-07', '2025-10-08' # 周三-下周三 ] holiday_dates = pd.to_datetime(holidays) # 新增调休工作日列表(转换为日期格式) workdays_adjustment = [ '2025-01-26', # 周日补春节 '2025-02-08', # 周六补春节 '2025-04-27', # 周日补劳动节 '2025-09-28', # 周日补国庆 '2025-10-11' # 周六补国庆 ] adjustment_dates = pd.to_datetime(workdays_adjustment) # 转换日期格式 while count < 5: current_date -= pd.Timedelta(days=1) # 判断是否为有效工作日 is_workday = ( (current_date.weekday() < 5 or current_date in adjustment_dates) and current_date not in holiday_dates ) if is_workday: count += 1 return current_date, end_date # 获取处理后的数据 df = getchaoshi() # 计算时间范围 start_date, end_date = get_5_workdays_back() date_mask = (df['收案时间'] >= start_date) & (df['收案时间'] <= end_date) weekly_cases = df[date_mask].copy() # 添加状态分类列 weekly_cases['状态分类'] = weekly_cases['案件状态'].apply( lambda x: '已完成' if x in ['办结', '发件'] else '正在处理' ) # 分组统计 result = weekly_cases.groupby('组别').agg( 总案件数=('案件状态', 'count'), 已完成=('状态分类', lambda x: (x == '已完成').sum()), 处理中=('状态分类', lambda x: (x == '正在处理').sum()), 超时案件数=('是否超时', lambda x: (x == '是').sum()), 缓办案件数=('是否缓办', lambda x: (x == '是').sum()) # 新增行 ).reset_index() # 结果展示样例 print(result.to_markdown(index=False)) # 创建Excel写入对象(注意:需要安装openpyxl) with ExcelWriter('案件统计结果20250320.xlsx', engine='openpyxl') as writer: # 将result写入Sheet1 result.to_excel(writer, sheet_name='Sheet1', index=False) # 将原始数据写入Sheet2 df.to_excel(writer, sheet_name='Sheet3', index=False)增加result的一行,为总案件数求和,已完成求和,处理中求和,超时案件数求和,缓办案件数求和

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error from scipy.optimize import minimize import matplotlib.pyplot as plt from pathlib import Path # ------------------ 数据预处理 ------------------ # 设置文件路径 excel_path = Path("C:/Users/Administrator/Desktop/augmented_data3.xlsx") # 读取数据 data = pd.read_excel(excel_path, sheet_name='Sheet1') # 特征工程处理 # 检查并转换分类变量(仅对真正需要编码的列进行处理) cat_cols = [] le = LabelEncoder() # 假设'燃尽风位置'是分类变量,进行编码 if data['燃尽风位置'].dtype == 'object': data['燃尽风位置'] = le.fit_transform(data['燃尽风位置']) cat_cols.append('燃尽风位置') # 确保温度保持为连续数值(移除之前的字符串转换) X = data[['掺氨比', '过量空气系数', '燃尽风位置', '主燃区温度']] y = data['NO排放浓度'] # ------------------ 模型训练 ------------------ # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 随机森林模型配置 rf = RandomForestRegressor( n_estimators=300, max_depth=10, min_samples_split=5, random_state=42 ) # 训练模型 rf.fit(X_train, y_train) y_pred = rf.predict(X_test) 这段代码中如何去除离群值的影响

最新推荐

recommend-type

新版青岛奥博软件公司营销标准手册.docx

新版青岛奥博软件公司营销标准手册.docx
recommend-type

网站安全管理制度(1).doc

网站安全管理制度(1).doc
recommend-type

基于AVR单片机的自动语音欢迎系统-本科毕业论文(1)(1).doc

基于AVR单片机的自动语音欢迎系统-本科毕业论文(1)(1).doc
recommend-type

500强企业管理表格模板大全

在当今商业环境中,管理表格作为企业运营和管理的重要工具,是确保组织高效运作的关键。世界500强企业在管理层面的成功,很大程度上得益于它们的规范化和精细化管理。本文件介绍的“世界500强企业管理表格经典”,是一份集合了多种管理表格模板的资源,能够帮助管理者们更有效地进行企业规划、执行和监控。 首先,“管理表格”这个概念在企业中通常指的是用于记录、分析、决策和沟通的各种文档和图表。这些表格不仅仅局限于纸质形式,更多地是以电子形式存在,如Excel、Word、PDF等文件格式。它们帮助企业管理者收集和整理数据,以及可视化信息,从而做出更加精准的决策。管理表格可以应用于多个领域,例如人力资源管理、财务预算、项目管理、销售统计等。 标题中提及的“世界500强”,即指那些在全球范围内运营且在《财富》杂志每年公布的全球500强企业排行榜上出现的大型公司。这些企业通常具备较为成熟和先进的管理理念,其管理表格往往经过长时间的实践检验,并且能够有效地提高工作效率和决策质量。 描述中提到的“规范化”是企业管理中的一个核心概念。规范化指的是制定明确的标准和流程,以确保各项管理活动的一致性和可预测性。管理表格的使用能够帮助实现管理规范化,使得管理工作有据可依、有章可循,减少因个人经验和随意性带来的风险和不确定性。规范化管理不仅提高了企业的透明度,还有利于培养员工的规则意识,加强团队之间的协调与合作。 “经典”一词在这里强调的是,这些管理表格模板是经过实践验证,能够适用于大多数管理场景的基本模式。由于它们的普适性和高效性,这些表格模板被广泛应用于不同行业和不同规模的企业之中。一个典型的例子是SWOT分析表,它可以帮助企业识别内部的优势(Strengths)、弱点(Weaknesses)以及外部的机会(Opportunities)和威胁(Threats)。SWOT分析表就是一个在世界500强企业中普遍使用的管理表格。 标签中的“表格模板”则是对上述管理工具的具体描述。这些模板通常是预先设计好的,能够帮助企业管理者快速开始工作,无需从零开始制作新的表格。它们包含了一些必备的字段和格式,用户可以根据自己的具体需求对模板进行调整和填充。 文件名称列表中的“index.html”可能是压缩包内的一个网页文件,用于展示管理表格的索引或介绍。如果这是一个在线资源,它将允许用户通过网页界面访问和下载各种表格模板。而“menu”可能是一个导航文件,用来帮助用户在多个表格模板之间进行选择。“data”文件夹可能包含了实际的表格模板文件,它们可能以Excel、Word等格式存在。 总的来说,管理表格是企业成功管理不可或缺的工具。通过使用世界500强企业所采纳的管理表格模板,其他企业可以借鉴这些顶级企业的管理经验,帮助自己在管理实践中达到更高的效率和质量。通过规范化和模板化的管理表格,企业可以确保其管理活动的一致性和标准化,这对于保持竞争力和实现长期发展至关重要。
recommend-type

YOLOv8目标检测算法深度剖析:从零开始构建高效检测系统(10大秘诀)

# 1. YOLOv8目标检测算法概述 ## 1.1 YOLOv8的简介与定位 YOLOv8(You Only Look Once version 8)作为一种前沿的目标检测算法,是由YOLO系列算法演化而来。该算法特别强调快速与准确的平衡,它被设计用于实时图像识别
recommend-type

mclmcrrt9_8.dll下载

<think>我们正在处理用户关于"mclmcrrt9_8.dll"文件的下载请求。根据引用内容,这个文件是MATLAB运行时库的一部分,通常与特定版本的MATLABRuntime相关联。用户需求:下载mclmcrrt9_8.dll的官方版本。分析:1.根据引用[2]和[3],mclmcrrt9_0_1.dll和mclmcrrt9_13.dll都是MATLABRuntime的文件,版本号对应MATLAB的版本(如9_0对应R2016a,9_13对应2022b)。2.因此,mclmcrrt9_8.dll应该对应于某个特定版本的MATLAB(可能是R2016b?因为9.8版本通常对应MATLABR
recommend-type

林锐博士C++编程指南与心得:初学者快速提能

首先,这份文件的核心在于学习和提高C++编程能力,特别是针对初学者。在这个过程中,需要掌握的不仅仅是编程语法和基本结构,更多的是理解和运用这些知识来解决实际问题。下面将详细解释一些重要的知识点。 ### 1. 学习C++基础知识 - **基本数据类型**: 在C++中,需要熟悉整型、浮点型、字符型等数据类型,以及它们的使用和相互转换。 - **变量与常量**: 学习如何声明变量和常量,并理解它们在程序中的作用。 - **控制结构**: 包括条件语句(if-else)、循环语句(for、while、do-while),它们是构成程序逻辑的关键。 - **函数**: 理解函数定义、声明、调用和参数传递机制,是组织代码的重要手段。 - **数组和指针**: 学习如何使用数组存储数据,以及指针的声明、初始化和运算,这是C++中的高级话题。 ### 2. 林锐博士的《高质量的C++编程指南》 林锐博士的著作《高质量的C++编程指南》是C++学习者的重要参考资料。这本书主要覆盖了以下内容: - **编码规范**: 包括命名规则、注释习惯、文件结构等,这些都是编写可读性和可维护性代码的基础。 - **设计模式**: 在C++中合理使用设计模式可以提高代码的复用性和可维护性。 - **性能优化**: 学习如何编写效率更高、资源占用更少的代码。 - **错误处理**: 包括异常处理和错误检测机制,这对于提高程序的鲁棒性至关重要。 - **资源管理**: 学习如何在C++中管理资源,避免内存泄漏等常见错误。 ### 3. 答题与测试 - **C++C试题**: 通过阅读并回答相关试题,可以帮助读者巩固所学知识,并且学会如何将理论应用到实际问题中。 - **答案与评分标准**: 提供答案和评分标准,使读者能够自我评估学习成果,了解哪些方面需要进一步加强。 ### 4. 心得体会与实践 - **实践**: 理论知识需要通过大量编程实践来加深理解,动手编写代码,解决问题,是学习编程的重要方式。 - **阅读源码**: 阅读其他人的高质量代码,可以学习到许多编程技巧和最佳实践。 - **学习社区**: 参与C++相关社区,比如Stack Overflow、C++论坛等,可以帮助解答疑惑,交流心得。 ### 5. 拓展知识 - **C++标准库**: 学习C++标准模板库(STL),包括vector、map、list、algorithm等常用组件,是构建复杂数据结构和算法的基础。 - **面向对象编程**: C++是一种面向对象的编程语言,理解类、对象、继承、多态等概念对于写出优雅的C++代码至关重要。 - **跨平台编程**: 了解不同操作系统(如Windows、Linux)上的C++编程差异,学习如何编写跨平台的应用程序。 - **现代C++特性**: 学习C++11、C++14、C++17甚至C++20中的新特性,如智能指针、lambda表达式、自动类型推导等,可以提高开发效率和代码质量。 ### 总结 学习C++是一个系统工程,需要从基础语法开始,逐步深入到设计思想、性能优化、跨平台编程等领域。通过不断的学习和实践,初学者可以逐步成长为一个具有高代码质量意识的C++程序员。而通过阅读经典指南书籍,参与测试与评估,以及反思和总结实践经验,读者将更加扎实地掌握C++编程技术。此外,还需注意编程社区的交流和现代C++的发展趋势,这些都对于保持编程技能的前沿性和实用性是必不可少的。
recommend-type

线性代数方程组求解全攻略:直接法vs迭代法,一文搞懂

# 摘要 线性代数方程组求解是数学和工程领域中的基础而重要的问题。本文首先介绍了线性方程组求解的基础知识,然后详细阐述了直接法和迭代法两种主要的求解策略。直接法包括高斯消元法和LU分解方法,本文探讨了其理论基础、实践应用以及算法优化。迭代法则聚焦于雅可比和高斯-赛德尔方法,分析了其原理、实践应用和收敛性。通过比较分析,本文讨论了两种方法在
recommend-type

怎么下载mysql8.0.33版本

<think>我们正在处理用户关于下载并安装MySQL8.0.33版本的问题。根据引用[1]和引用[2],我们可以提供两种方法:一种是使用RPM包在CentOS上安装,另一种是使用ZIP包在Windows上安装。另外,引用[3]提到了安装过程中需要注意Python环境,但根据MySQL官方文档,Python并不是必须的,除非使用某些特定功能(如MySQLShell的Python模式)。因此,我们主要关注下载和安装步骤。用户没有明确操作系统,因此我们将分别介绍Windows和CentOS(Linux)下的安装方法。步骤概述:1.下载MySQL8.0.332.安装(根据系统不同步骤不同)3.初始化
recommend-type

C#学籍管理系统开发完成,信管专业的福音

标题中提到的“C#设计的学籍系统”涉及到几个重要的知识点。首先是“C#”,这是微软公司开发的一种面向对象的、运行在.NET框架上的高级编程语言。C#语言广泛用于开发Windows应用程序、游戏开发、分布式组件和客户端服务器应用程序等。在该标题中,它被用于构建一个学籍系统,这意味着系统的核心逻辑和功能是通过C#语言实现的。 其次是“学籍系统”,这通常是指用于管理学生个人信息、成绩、课程和学籍状态等数据的软件应用系统。学籍系统能够帮助教育机构高效地维护和更新学生档案,实现学生信息的电子化管理。它通常包括学生信息管理、成绩管理、课程安排、毕业资格审核等功能。 从描述中我们可以得知,这个学籍系统是“专门为信管打造”的。这里的“信管”很可能是对“信息管理”或者“信息系统管理”专业的简称。信息管理是一个跨学科领域,涉及信息技术在收集、存储、保护、处理、传输和安全地管理和开发信息资源方面的应用。这个系统可能是针对该专业学生的实际需求来定制开发的,包括一些特有的功能或者界面设计,以便更好地满足专业学习和实践操作的需要。 描述中还提到“请大家积极下载”,这可能意味着该学籍系统是一个开源项目,或者至少是一个允许公众访问的软件资源。由于开发者提出了“如有不足之处请大家多多包涵”,我们可以推断这个系统可能还处于测试或早期使用阶段,因此可能还不是完全成熟的版本,或者可能需要使用者反馈意见以便进行后续改进。 标签中的“C#的啊,大家注意,嘻嘻哈哈”表达了开发者轻松的态度和对C#语言的特定提及。这个标签可能是在一个非正式的交流环境中发布的,所以用词带有一定的随意性。尽管如此,它还是说明了该学籍系统是基于C#语言开发的,并提醒用户对这一点给予关注。 关于压缩包子文件的文件名称列表中,“学生成绩管理系统”直接指出了这个软件系统的主要功能之一,即管理学生的成绩。这通常包括录入成绩、查询成绩、统计分析成绩、成绩报告等功能。一个优秀的学生成绩管理系统可以让教师和学校管理人员更加高效地处理学生的成绩数据,同时也能让学生本人了解自己的学业进展。 综合以上信息,我们可以提炼出以下知识点: 1. C#语言:是一种面向对象的编程语言,适用于.NET框架,用于开发各种类型的应用程序。 2. 学籍系统:是管理学生基本信息、成绩、课程和学籍状态的软件应用系统,目的是实现学生信息的电子化管理。 3. 信息系统管理专业:该系统可能是针对信息系统管理专业的学生或教师的需求设计和开发的。 4. 开源项目或公众访问资源:鼓励用户下载使用,并接受用户的反馈和建议。 5. 学生成绩管理系统:是学籍系统的一个重要组成部分,专注于管理学生的成绩数据。 在开发一个C#设计的学籍系统时,开发者需要考虑的因素很多,比如系统的用户界面设计、数据库设计、数据安全、网络通信等。此外,系统还应该有良好的扩展性和易用性,以便未来可以根据用户反馈和新需求进行升级和优化。