活动介绍

d = np.cumsum(hist)

时间: 2024-05-28 14:11:23 浏览: 93
这一行代码的作用是计算一个累积直方图。假设hist是一个一维数组,表示某个数据集的直方图,其中hist[i]表示数据集中落在第i个区间内的数据点的个数。那么,np.cumsum(hist)将返回一个与hist长度相同的一维数组d,其中d[i]表示数据集中落在前i个区间内的数据点的个数的累积和。换句话说,d就是hist的累积分布函数。
相关问题

d = np.cumsum(hist)/float(dark_channel.size)

这行代码是计算暗通道直方图的累积分布函数(CDF)。 具体来说,`hist` 是暗通道直方图,`np.cumsum(hist)` 是对其进行累积求和,得到的是每个灰度级别下的像素点数的累积值。然后,除以暗通道图像的像素总数 `dark_channel.size`,即可得到每个灰度级别下的像素点数的比例。 这个比例表示了该灰度级别下的像素点数在整幅图像中所占的比例,也可以理解为该灰度级别下像素点的累积分布函数值。

cs=np.cumsum(hist)是什么意思

`cs` 是一个一维数组,包含了 `hist` 数组中所有元素的累加和。也就是说,`cs[i]` 的值表示 `hist[0]` 到 `hist[i]` 的元素之和。 这个操作在数据分析和图像处理中比较常用,可以用来计算累计分布函数(cumulative distribution function,CDF)或者计算直方图的累计值。
阅读全文

相关推荐

import cv2 import numpy as np import matplotlib.pyplot as plt # 读取原图和目标图(灰度模式) src_img = cv2.imread(r'F:\tupian\star.jpg', 0) ref_img = cv2.imread(r'F:\tupian\star2.jpeg', 0) # 计算直方图 src_hist = cv2.calcHist([src_img], [0], None, [256], [0,256]) ref_hist = cv2.calcHist([ref_img], [0], None, [256], [0,256]) # 归一化处理 src_hist = src_hist / src_img.size ref_hist = ref_hist / ref_img.size # 原图CDF src_cdf = np.cumsum(src_hist) # 目标图CDF ref_cdf = np.cumsum(ref_hist) # 创建映射表 mapping = np.zeros(256, dtype=np.uint8) for i in range(256): diff = np.abs(ref_cdf - src_cdf[i]) mapping[i] = np.argmin(diff) # 找到最接近的CDF值 # 执行像素值映射 matched_img = cv2.LUT(src_img, mapping) # 显示结果对比 plt.figure(figsize=(15,10)) plt.subplot(231), plt.imshow(src_img, cmap='gray'), plt.title('原图') plt.subplot(232), plt.imshow(ref_img, cmap='gray'), plt.title('目标图') plt.subplot(233), plt.imshow(matched_img, cmap='gray'), plt.title('匹配结果') plt.subplot(234), plt.hist(src_img.ravel(), bins=256,range=(0,256)), plt.title('原图直方图') plt.subplot(235), plt.hist(ref_img.ravel(), bins=256, range=(0,256)), plt.title('目标直方图') plt.subplot(236), plt.hist(matched_img.ravel(),bins= 256,range=(0,256)), plt.title('匹配后直方图') plt.show() 出现D:\aa\.venv\Lib\site-packages\IPython\core\pylabtools.py:170: UserWarning: Glyph 21407 (\N{CJK UNIFIED IDEOGRAPH-539F}) missing from font(s) DejaVu Sans. fig.canvas.print_figure(bytes_io, **kw) 报错 请修改一下

import tifffile import numpy as np from skimage import exposure, util from skimage import restoration # 新增关键导入 from skimage import filters # 新增关键导入 import matplotlib.pyplot as plt # 原处理代码保持不变... # 读取高位深图像(示例为16位) img = tifffile.imread('G:/异物检测需求描述/yw/边角撞伤/NG-0_04QCB36557400JEAN0000059_20241120-152222687_4.tif').astype(np.float32) max_val = np.finfo(img.dtype).max # 自动获取最大像素值 # 动态范围分析 hist, bins = exposure.histogram(img) dark_threshold = bins[np.where(np.cumsum(hist) > 0.01*hist.sum())[0][0]] # 自动确定暗区阈值 # 多尺度细节增强 def multiscale_enhance(img): layers = [] for sigma in [1, 2, 4, 8]: blurred = filters.gaussian(img, sigma) layers.append(img - blurred) return img + sum(layers[i]*(1.2**i) for i in range(len(layers))) # 物理模型校正 enhanced = exposure.adjust_log(img, gain=0.8, inv=True) # 反转对数压缩 # 量子噪声抑制 denoised = restoration.denoise_tv_chambolle(enhanced, weight=0.2) # 自适应暗区增强 mask = denoised < dark_threshold enhanced_dark = exposure.rescale_intensity(denoised[mask], in_range=(0, dark_threshold), out_range=(0, max_val)) denoised[mask] = enhanced_dark * 1.2 # 增强系数 # 高动态范围融合 hdr_img = exposure.equalize_adapthist(util.img_as_float(denoised), clip_limit=0.03, kernel_size=64) plt.figure(1) plt.title("Enhanced Image") plt.imshow(hdr_img*max_val, cmap='gray') plt.axis('off') 其中的enhance矩阵全部变成inf

图像背景区域识别与模板生成方案 我将通过以下步骤解决您的问题: 1. 识别背景最干净的区域 背景干净区域的特征:纹理简单、颜色均匀、边缘少。实现方法: Python import cv2 import numpy as np def find_clean_background(img): # 转换为HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) v_channel = hsv[:,:,2] # 边缘检测 edges = cv2.Canny(img, 100, 200) # 纹理分析 sobelx = cv2.Sobel(v_channel, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(v_channel, cv2.CV_64F, 0, 1, ksize=5) texture = np.sqrt(sobelx**2 + sobely**2) # 创建综合评分图 score_map = 255 - edges - texture/2 return score_map 原理说明: 边缘检测识别清晰边界(非背景特征)2 Sobel算子量化纹理复杂度 低边缘/纹理区域得分越高,代表背景越干净 2. 裁剪高评分区域 Python def crop_clean_regions(img, score_map, patch_size=100, num_patches=5): # 寻找最高分区域 locations = [] for _ in range(num_patches): min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(score_map) x,y = max_loc locations.append((x, y)) # 屏蔽已选区域 cv2.rectangle(score_map, (x-50, y-50), (x+50, y+50), 0, -1) # 裁剪区域 patches = [img[y:y+patch_size, x:x+patch_size] for (x,y) in locations] return patches 3. 拼接背景模板 Python def stitch_background(patches, output_size=(800,600)): # 创建空白画布 canvas = np.zeros((output_size[1], output_size[0], 3), dtype=np.uint8) # 网格布局 rows = 2 cols = 3 patch_h, patch_w = patches[0].shape[:2] for i, patch in enumerate(patches[:rows*cols]): row = i // cols col = i % cols y = row * patch_h x = col * patch_w # 无缝拼接(泊松融合) mask = 255 * np.ones(patch.shape, dtype=patch.dtype) canvas = cv2.seamlessClone(patch, canvas, mask, (x+patch_w//2, y+patch_h//2), cv2.NORMAL_CLONE) return canvas 4. 色彩还原技术 Python def match_background_color(original, generated_template): # 计算原图色彩分布 orig_hist = cv2.calcHist([original], [0,1,2], None, [8,8,8], [0,256,0,256,0,256]) cv2.normalize(orig_hist, orig_hist) # 直方图匹配 matched = generated_template.copy() for i in range(3): hist = cv2.calcHist([generated_template], [i], None, [256], [0,256]) cdf = hist.cumsum() cdf = 255 * cdf / cdf[-1] # 应用映射 matched[:,:,i] = np.interp(matched[:,:,i].flatten(), np.arange(256), cdf).reshape(matched.shape[:2]) return matched 关键技术: 直方图均衡化保持视觉一致性3 颜色空间转换确保自然过渡 泊松融合消除拼接痕迹 完整工作流程 输入原始图像 img = cv2.imread("input.jpg") 生成评分图 score_map = find_clean_background(img) 裁剪干净区域 patches = crop_clean_regions(img, score_map) 拼接模板 template = stitch_background(patches) 色彩还原 final_template = match_background_color(img, template) 输出结果 cv2.imwrite("background_template.jpg", final_template) 应用示例 假设原始图像包含分散的简单背景区域(如纯色墙面、天空等),系统将: 自动识别右上角天空区域(评分95) 选择左下角纯色地面区域(评分88) 拼接生成无缝背景模板 匹配原图整体色调(如黄昏暖色调) 注意:对于复杂图像,建议增加采样区域数量(num_patches参数)并使用更大尺寸的采样块(patch_size)以获得更自然的拼接效果1。帮我看下我这段代码的问题,目前总体来说效果还可以,但是还是有些除背景色之外的色彩,可能是拼接的问题,也可能是其他的问题,import cv2 import numpy as np from tqdm import tqdm def find_clean_background_regions(img, min_fill_rate=0.9, patch_size=100): """ 识别图像中背景最干净的区域(填充度>90%) 参数: img: 输入图像 (BGR格式) min_fill_rate: 最小填充率阈值 (默认0.9) patch_size: 区域大小 (默认100x100像素) 返回: clean_patches: 干净背景区域列表 locations: 区域位置坐标列表 """ # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150) # 计算填充率图 kernel = np.ones((3, 3), np.uint8) dilated_edges = cv2.dilate(edges, kernel, iterations=1) fill_rate_map = 1 - (dilated_edges.astype(float) / 255) # 滑动窗口检测高填充率区域 clean_patches = [] locations = [] height, width = gray.shape # 使用tqdm显示进度条 for y in tqdm(range(0, height - patch_size, patch_size // 2), desc="扫描图像"): for x in range(0, width - patch_size, patch_size // 2): # 提取当前窗口 patch = fill_rate_map[y:y + patch_size, x:x + patch_size] # 计算平均填充率 avg_fill_rate = np.mean(patch) # 检查填充率是否达标 if avg_fill_rate > min_fill_rate: # 保存背景区域和位置 clean_patches.append(img[y:y + patch_size, x:x + patch_size]) locations.append((x, y)) return clean_patches, locations def stitch_background_template(patches, output_size=(1200, 800)): """ 拼接背景区域生成大尺寸模板 参数: patches: 背景区域列表 output_size: 输出模板尺寸 (宽, 高) 返回: template: 拼接后的背景模板 """ # 创建空白画布 template = np.zeros((output_size[1], output_size[0], 3), dtype=np.uint8) # 计算网格布局 cols = int(np.ceil(np.sqrt(len(patches)))) rows = int(np.ceil(len(patches) / cols)) # 计算每个区块尺寸 patch_h, patch_w = patches[0].shape[:2] canvas_h, canvas_w = output_size[1], output_size[0] grid_h = min(patch_h, canvas_h // rows) grid_w = min(patch_w, canvas_w // cols) # 调整所有区块到相同尺寸 resized_patches = [cv2.resize(p, (grid_w, grid_h)) for p in patches] # 网格布局拼接 for i, patch in enumerate(resized_patches): row = i // cols col = i % cols y = row * grid_h x = col * grid_w # 确保不超出画布边界 if y + grid_h <= canvas_h and x + grid_w <= canvas_w: # 泊松融合实现无缝拼接 mask = 255 * np.ones(patch.shape, dtype=patch.dtype) center = (x + grid_w // 2, y + grid_h // 2) template = cv2.seamlessClone(patch, template, mask, center, cv2.MONOCHROME_TRANSFER) return template def match_background_color(original_img, template, locations): """ 匹配背景模板色彩到原始图像 参数: original_img: 原始图像 template: 背景模板 locations: 原始背景区域位置 返回: color_matched_template: 色彩匹配后的模板 """ # 提取原始背景区域颜色特征 original_colors = [] for (x, y) in locations: patch = original_img[y:y + 100, x:x + 100] avg_color = np.mean(patch, axis=(0, 1)) original_colors.append(avg_color) # 计算原始背景平均颜色 avg_original_color = np.mean(original_colors, axis=0) # 计算模板平均颜色 avg_template_color = np.mean(template, axis=(0, 1)) # 计算颜色偏移量 color_shift = avg_original_color - avg_template_color # 应用颜色校正 color_matched_template = template.astype(np.float32) color_matched_template += color_shift color_matched_template = np.clip(color_matched_template, 0, 255).astype(np.uint8) return color_matched_template def main(input_path, output_path): """ 主函数:处理图像并生成背景模板 参数: input_path: 输入图像路径 output_path: 输出模板保存路径 """ # 读取图像 img = cv2.imread(input_path) if img is None: print(f"错误:无法读取图像 {input_path}") return print("步骤1: 识别背景区域...") patches, locations = find_clean_background_regions(img) if not patches: print("警告:未找到足够干净的背景区域") return print(f"找到 {len(patches)} 个背景区域") print("步骤2: 拼接背景模板...") template = stitch_background_template(patches) print("步骤3: 色彩匹配...") final_template = match_background_color(img, template, locations) # 保存结果 cv2.imwrite(output_path, final_template) print(f"背景模板已保存至: {output_path}") if __name__ == "__main__": # 使用示例 input_image = "zdk.jpg" # 替换为实际图像路径 output_template = "background_template.jpg" main(input_image, output_template)

帮我把出去排名前20的股票改成输出排名前50的股票:# -*- coding: utf-8 -*- """ Created on Sun Jul 20 16:28:49 2025 @author: srx20 """ # -*- coding: utf-8 -*- """ 股票上涨概率预测程序 - 输出前20名股票 """ import os import pandas as pd import numpy as np import joblib import talib as ta from tqdm import tqdm import logging import datetime # 设置日志记录 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('stock_prediction_inference.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # ========== 配置类 ========== class PredictionConfig: def __init__(self): # 数据路径 self.SH_PATH = r"D:\股票量化数据库\股票csv数据\上证" self.SZ_PATH = r"D:\股票量化数据库\股票csv数据\深证" # 预测日期范围 self.START_DATE = "2024-01-01" # 足够历史数据计算特征 self.END_DATE = datetime.datetime.now().strftime("%Y-%m-%d") # 当前日期 # 模型路径 self.CLUSTER_MODEL_PATH = "stock_cluster_model.pkl" self.PREDICTION_MODEL_PATH = "stock_prediction_model.pkl" # 输出设置 self.TOP_N = 20 # 输出前N名股票 self.OUTPUT_FILE = "top_stocks.csv" # ========== 内存管理工具 ========== def reduce_mem_usage(df): """优化DataFrame内存使用""" for col in df.columns: col_type = df[col].dtype if col_type != object: c_min = df[col].min() c_max = df[col].max() if str(col_type)[:3] == 'int': if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max: df[col] = df[col].astype(np.int8) elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max: df[col] = df[col].astype(np.int16) elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max: df[col] = df[col].astype(np.int32) elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max: df[col] = df[col].astype(np.int64) else: if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max: df[col] = df[col].ast(np.float16) elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max: df[col] = df[col].astype(np.float32) else: df[col] = df[col].astype(np.float64) return df # ========== 数据加载 ========== def load_stock_data_for_prediction(sh_path, sz_path, start_date, end_date): """加载股票数据用于预测""" stock_data = {} # 创建文件列表 all_files = [] for exchange, path in [('SH', sh_path), ('SZ', sz_path)]: if os.path.exists(path): csv_files = [f for f in os.listdir(path) if f.endswith('.csv')] for file in csv_files: all_files.append((exchange, path, file)) if not all_files: logger.warning("没有找到任何CSV文件") return stock_data total_files = len(all_files) pbar = tqdm(total=total_files, desc='加载股票数据') loaded_count = 0 for exchange, path, file in all_files: if file.endswith('.csv'): stock_code = f"{exchange}_{file.split('.')[0]}" file_path = os.path.join(path, file) try: # 读取数据并验证列名 df = pd.read_csv(file_path) # 验证必要的列是否存在 required_cols = ['date', 'open', 'high', 'low', 'close', 'volume'] if not all(col in df.columns for col in required_cols): logger.warning(f"股票 {stock_code} 缺少必要列,跳过") pbar.update(1) continue # 转换日期并过滤 df['date'] = pd.to_datetime(df['date']) df = df[(df['date'] >= start_date) & (df['date'] <= end_date)] if len(df) < 100: # 至少100个交易日 logger.info(f"股票 {stock_code} 数据不足({len(df)}条),跳过") pbar.update(1) continue # 转换数据类型 for col in ['open', 'high', 'low', 'close']: df[col] = pd.to_numeric(df[col], errors='coerce').astype(np.float32) df['volume'] = pd.to_numeric(df['volume'], errors='coerce').astype(np.uint32) # 删除包含NaN的行 df = df.dropna(subset=required_cols) if len(df) > 0: stock_data[stock_code] = df loaded_count += 1 logger.debug(f"成功加载股票 {stock_code},数据条数: {len(df)}") else: logger.warning(f"股票 {stock_code} 过滤后无数据") except Exception as e: logger.error(f"加载股票 {stock_code} 失败: {str(e)}", exc_info=True) pbar.update(1) pbar.close() logger.info(f"成功加载 {len(stock_data)} 只股票数据") return stock_data # ========== 特征工程 ========== class FeatureEngineer: def __init__(self): pass def safe_fillna(self, series, default=0): """安全填充NaN值""" if isinstance(series, pd.Series): return series.fillna(default) elif isinstance(series, np.ndarray): return np.nan_to_num(series, nan=default) return series def transform(self, df): """添加技术指标特征""" try: # 创建临时副本用于TA-Lib计算 df_temp = df.copy() # 将价格列转换为float64以满足TA-Lib要求 for col in ['open', 'high', 'low', 'close']: df_temp[col] = df_temp[col].astype(np.float64) # 基础特征 df['price_change'] = df['close'].pct_change().fillna(0) df['volatility'] = df['close'].rolling(5).std().fillna(0) df['volume_change'] = df['volume'].pct_change().fillna(0) df['MA5'] = df['close'].rolling(5).mean().fillna(0) df['MA20'] = df['close'].rolling(20).mean().fillna(0) # 技术指标 rsi = ta.RSI(df_temp['close'].values, timeperiod=14) df['RSI14'] = self.safe_fillna(rsi, 50) macd, macd_signal, macd_hist = ta.MACD( df_temp['close'].values, fastperiod=12, slowperiod=26, signalperiod=9 ) df['MACD_hist'] = self.safe_fillna(macd_hist, 0) # 新增特征 mom = ta.MOM(df_temp['close'].values, timeperiod=10) df['MOM10'] = self.safe_fillna(mom, 0) atr = ta.ATR( df_temp['high'].values, df_temp['low'].values, df_temp['close'].values, timeperiod=14 ) df['ATR14'] = self.safe_fillna(atr, 0) # 成交量加权平均价 vwap = (df['volume'] * (df['high'] + df['low'] + df['close']) / 3).cumsum() / df['volume'].cumsum() df['VWAP'] = self.safe_fillna(vwap, 0) # 相对强弱指数差值 df['RSI_diff'] = df['RSI14'] - df['RSI14'].rolling(5).mean().fillna(0) # 价格波动比率 df['price_vol_ratio'] = df['price_change'] / (df['volatility'].replace(0, 1e-8) + 1e-8) # 技术指标组合特征 df['MACD_RSI'] = df['MACD_hist'] * df['RSI14'] # 市场情绪指标 df['advance_decline'] = (df['close'] > df['open']).astype(int).rolling(5).sum().fillna(0) # 时间特征 df['day_of_week'] = df['date'].dt.dayofweek df['month'] = df['date'].dt.month # 处理无穷大和NaN df = df.replace([np.inf, -np.inf], np.nan) df = df.fillna(0) # 优化内存 return reduce_mem_usage(df) except Exception as e: logger.error(f"特征工程失败: {str(e)}", exc_info=True) # 返回基本特征作为回退方案 df['price_change'] = df['close'].pct_change().fillna(0) df['volatility'] = df['close'].rolling(5).std().fillna(0) df['volume_change'] = df['volume'].pct_change().fillna(0) df['MA5'] = df['close'].rolling(5).mean().fillna(0) df['MA20'] = df['close'].rolling(20).mean().fillna(0) # 填充缺失的技术指标 for col in ['RSI14', 'MACD_hist', 'MOM10', 'ATR14', 'VWAP', 'RSI_diff', 'price_vol_ratio', 'MACD_RSI', 'advance_decline']: if col not in df.columns: df[col] = 0 return df # ========== 聚类模型 ========== class StockCluster: def __init__(self, model_path): # 加载聚类模型 if os.path.exists(model_path): model_data = joblib.load(model_path) self.kmeans = model_data['kmeans'] self.scaler = model_data['scaler'] self.cluster_map = model_data['cluster_map'] logger.info(f"从 {model_path} 加载聚类模型") else: logger.error("聚类模型文件不存在") self.cluster_map = {} def transform(self, df, stock_code): """为数据添加聚类特征""" cluster_id = self.cluster_map.get(stock_code, -1) # 默认为-1表示未知聚类 df['cluster'] = cluster_id return df # ========== 预测执行器 ========== class StockPredictor: def __init__(self, config): self.config = config # 加载预测模型 if os.path.exists(self.config.PREDICTION_MODEL_PATH): self.model, self.selected_features = joblib.load(self.config.PREDICTION_MODEL_PATH) logger.info(f"从 {self.config.PREDICTION_MODEL_PATH} 加载预测模型") logger.info(f"模型使用的特征: {self.selected_features}") else: logger.error("预测模型文件不存在") self.model = None self.selected_features = [] # 加载聚类模型 self.cluster_model = StockCluster(self.config.CLUSTER_MODEL_PATH) # 特征工程 self.feature_engineer = FeatureEngineer() def prepare_prediction_data(self, stock_data): """准备预测数据""" logger.info("准备预测数据...") prediction_data = [] for stock_code, df in tqdm(stock_data.items(), desc="处理股票数据"): try: # 特征工程 df = self.feature_engineer.transform(df.copy()) # 添加聚类特征 df = self.cluster_model.transform(df, stock_code) # 只取最新一天的数据 latest_data = df.iloc[-1].copy() # 确保所有特征都存在 for feature in self.selected_features: if feature not in latest_data: latest_data[feature] = 0 # 填充默认值 # 选择所需特征 features = latest_data[self.selected_features].values.reshape(1, -1) prediction_data.append({ 'stock_code': stock_code, 'date': latest_data['date'], 'features': features, 'open': latest_data['open'], 'high': latest_data['high'], 'low': latest_data['low'], 'close': latest_data['close'], 'volume': latest_data['volume'] }) except Exception as e: logger.error(f"处理股票 {stock_code} 失败: {str(e)}", exc_info=True) return prediction_data def predict(self, prediction_data): """执行预测并返回结果""" if self.model is None: logger.error("没有可用的预测模型") return None logger.info("执行预测...") results = [] for data in tqdm(prediction_data, desc="预测股票"): try: # 预测正类概率 proba = self.model.predict_proba(data['features'])[0][1] results.append({ 'stock_code': data['stock_code'], 'date': data['date'], 'probability': proba, 'open': data['open'], 'high': data['high'], 'low': data['low'], 'close': data['close'], 'volume': data['volume'] }) except Exception as e: logger.error(f"预测股票 {data['stock_code']} 失败: {str(e)}", exc_info=True) return results def get_top_stocks(self, results, top_n=20): """获取概率最高的前N只股票""" if not results: return [] # 转换为DataFrame并排序 df = pd.DataFrame(results) df = df.sort_values('probability', ascending=False).head(top_n) # 添加排名 df['rank'] = range(1, len(df) + 1) # 格式化输出 df['probability'] = df['probability'].apply(lambda x: f"{x:.2%}") df['date'] = df['date'].dt.strftime('%Y-%m-%d') return df def save_results(self, df, output_file): """保存结果到CSV文件""" if df is not None and not df.empty: df.to_csv(output_file, index=False) logger.info(f"结果已保存到: {output_file}") return True return False # ========== 主程序 ========== def main(): # 初始化配置 config = PredictionConfig() logger.info("===== 股票上涨概率预测程序 =====") logger.info(f"预测日期: {config.END_DATE}") # 加载股票数据 logger.info(f"加载股票数据: {config.START_DATE} 至 {config.END_DATE}") stock_data = load_stock_data_for_prediction( config.SH_PATH, config.SZ_PATH, config.START_DATE, config.END_DATE ) if not stock_data: logger.error("错误: 没有加载到任何股票数据") return # 初始化预测器 predictor = StockPredictor(config) if predictor.model is None: return # 准备预测数据 prediction_data = predictor.prepare_prediction_data(stock_data) if not prediction_data: logger.error("错误: 没有准备好预测数据") return # 执行预测 results = predictor.predict(prediction_data) if not results: logger.error("错误: 没有预测结果") return # 获取前N名股票 top_stocks = predictor.get_top_stocks(results, config.TOP_N) # 输出结果 logger.info("\n===== 上涨概率最高的前20只股票 =====") print(top_stocks[['rank', 'stock_code', 'probability', 'close', 'date']].to_string(index=False)) # 保存结果 predictor.save_results(top_stocks, config.OUTPUT_FILE) logger.info("===== 程序执行完成 =====") if __name__ == "__main__": main()

txt

最新推荐

recommend-type

【地球科学与遥感】基于Google Earth Engine的哨兵2号数据分析:研究区域NDVI、LST及城市热岛效应评估系统设计

内容概要:本文档提供了一套完整的Python脚本,利用Google Earth Engine (GEE) API对哨兵2号卫星影像进行处理与分析。首先,导入必要的库(如ee、geemap、geopandas),并通过Google Drive加载GeoJSON文件定义研究区域。接着,对哨兵2号Harmonized数据进行预处理,包括云掩膜、日期筛选和区域过滤。然后,基于红波段和近红外波段计算归一化植被指数(NDVI),并进一步推算地表温度(LST)。最后,通过计算研究区域内的LST均值和标准差,构建标准化城市热岛指数(UHI)和城市热场变异指数(UTFVI),并将其可视化于交互式地图中。 适合人群:具备一定遥感和地理信息系统(GIS)基础知识的研究人员和技术人员,特别是从事环境监测、城市规划或气候变化相关领域的工作者。 使用场景及目标:① 对特定区域内的植被覆盖和地表温度进行动态监测;② 分析城市热岛效应及其空间分布特征;③ 辅助城市规划和环境管理决策,提高应对气候变化的能力。 阅读建议:此资源侧重于实际应用中的遥感数据分析流程,建议读者熟悉Python编程语言和GEE平台的基本操作,同时结合具体的科学问题来理解和实践代码中的各个步骤。在学习过程中应关注数据处理逻辑与方法论的应用,确保能够独立完成类似的数据分析任务。
recommend-type

2025二级建造师继续教育考试题库带有答案.docx

2025二级建造师继续教育考试题库带有答案.docx
recommend-type

sglj宫颈癌lkdgj lsakgj路上lsslagjlalsagj

sglj宫颈癌lkdgj lsakgj路上lsslagjlalsagj
recommend-type

17页无人机俯仰姿态保持模糊PID控制设计报告:'仿真模型与性能改善'

基于模糊PID控制的无人机俯仰姿态精确保持设计及其性能优化。首先,建立了一款固定翼无人机的状态空间数学模型,并基于传统PID控制方法设计了初步的俯仰姿态控制律。然而,针对常规PID控制在复杂环境下的局限性,文中引入了模糊自适应PID控制方法,实现了对无人机俯仰姿态更为精准和平稳的控制。通过仿真实验验证,模糊PID控制显著减少了俯仰角单位阶跃响应的调节时间与超调量,降低了俯仰角速率的峰值,从而提高了无人机的飞行性能和稳定性。 适合人群:从事无人机技术研发的专业人士、自动化控制领域的研究人员以及对智能控制算法感兴趣的学者。 使用场景及目标:适用于需要提升无人机飞行稳定性和性能的研究项目,旨在解决复杂环境中无人机姿态控制的问题,提供一种有效的解决方案。 其他说明:文中还讨论了未来智能控制算法在无人机领域的潜在应用和发展方向,强调了模糊控制、神经网络控制等技术的重要性和前景。
recommend-type

Pandas TA:120+技术分析指标的Python 3 Pandas扩展

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a Pandas TA 是 Python 3 中一款简单易用的技术分析库,它基于 Pandas 库开发,集成了 120 多种指标及实用功能。涵盖诸多常见指标,比如简单移动平均线(sma)、移动平均线收敛发散指标(macd)、赫尔指数移动平均线(hma)、布林带(bband)、动平衡量(obv)、Aroon 及 Aroon 振荡器(阿隆)、挤压等。产品优势在于拥有 120 多个指标与实用功能,若指标有通用性,与事实紧密关联。追求速度的话,借助 DataFrame 策略方法,能轻松实现多处理功能,使用起来十分便捷。
recommend-type

Typora下载问题解决:资源安装包实测可用

### 知识点:Typora下载与安装问题解决 #### 1. Typora 简介 Typora 是一款流行的轻量级Markdown编辑器,它将实时预览功能和源代码编辑结合在一起,为用户提供了一个简洁高效的写作环境。由于其独特的设计和出色的用户体验,Typora 迅速在开发者和内容创作者之间获得了普及。 #### 2. Markdown 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。Markdown 被广泛用于编写 README 文件、撰写文章、创建富文本内容等。其特点在于简化了传统的排版语法,让写作更加专注于内容本身。 #### 3. Typora 的特点和优势 - **所见即所得编辑器**:Typora 结合了传统Markdown编辑器和富文本编辑器的优点,使得用户在编写文档时可以直接看到最终效果。 - **跨平台兼容性**:Typora 支持Windows、macOS以及Linux等多个操作系统。 - **简洁的界面**:它拥有简洁的用户界面,没有复杂的菜单,这有助于减少分心,专注于内容创作。 - **即时预览**:Typora 提供即时预览功能,用户可以立即看到其标记语法对应的视觉效果。 - **集成度高**:支持插入图片、代码块、表格、数学公式等多种格式。 - **扩展性**:支持多种主题和插件,可以进一步增强其功能。 #### 4. 关于标题:“关于Typora下载找不到资源” 当用户在寻找Typora的下载资源时,可能会遇到找不到官方下载链接或被错误资源误导的问题。这可能是由于网络环境限制、搜索关键词不当或者不正确的网站导航等原因导致的。为了解决这个问题,重要的是要知道如何辨别官方下载渠道,以及如何查找和验证可靠的资源。 #### 5. 官方资源的识别和下载 - **访问官方网站**:访问 Typora 的官方网站(https://typora.io/)获取最新版本的下载信息。官方网站是获取软件的最安全和最可靠的方式。 - **下载安装包**:官方网站通常会提供最新版本的安装包下载链接,例如,在此案例中,压缩包子文件名列表中的 typora-setup-x64-0.9.49.exe 对应了 Typora 的一个版本号为 0.9.49 的安装程序,适用于64位Windows系统。 - **检查版本更新**:在安装之前,用户应当确认是否是当前最新版本。如果不是,可从官方网站下载最新版本。 #### 6. 安装包文件名称解析 文件名 typora-setup-x64-0.9.49.exe 中的各部分含义: - **typora**:指的是要安装的软件名。 - **setup**:通常表示这是一个安装程序。 - **x64**:表示这个安装程序支持64位系统架构。 - **0.9.49**:表示这个版本号,用户可以通过这个版本号了解其更新历史和功能改进情况。 #### 7. 实测完成 “实测完成”这一描述表明此文件已经过测试,并确认可以正常下载和安装。实测的流程包括下载安装包、运行安装程序、完成安装以及验证软件功能是否正常。 #### 8. 安装流程详解 1. **下载**:从官方网站下载对应操作系统版本的 Typora 安装包。 2. **运行安装程序**:双击下载的安装程序文件(例如 typora-setup-x64-0.9.49.exe)。 3. **安装向导**:安装向导启动后,遵循提示完成安装。可能包含选择安装路径、接受许可协议、选择开始菜单文件夹等步骤。 4. **完成安装**:完成安装向导后,可能需要重启电脑以完成安装。 5. **验证安装**:启动 Typora 程序,检查软件是否能够正常打开,并确保可以正常使用Markdown编辑功能。 #### 9. 常见问题及解决方案 - **找不到下载资源**:确保访问官方网站或使用正规的软件分发平台获取资源。 - **安装程序无法运行**:检查文件是否有损坏,重新下载安装包。确认系统环境满足安装需求,如操作系统版本兼容性、运行库等。 - **软件无法打开**:尝试以管理员权限运行 Typora,或检查是否有系统安全软件阻止其运行。 - **功能异常或错误**:检查是否有可用的软件更新,或者查看 Typora 官方论坛获取帮助。 #### 10. Typora 的未来展望 由于 Typora 不断更新迭代,功能和用户界面可能会有所改变,包括对新特性的支持和旧特性的优化。同时,开发者社区也在不断地为 Typora 开发新的主题和插件,以提供更加丰富的写作体验和扩展功能。用户应定期访问官方网站或关注官方消息,以便获取最新动态和软件更新。 通过以上介绍和问题解答,用户应该可以更好地理解 Typora 的下载与安装过程,并在遇到相关问题时快速找到解决方法,从而顺利使用这款强大的Markdown编辑器。
recommend-type

网络嗅探器实战进阶:掌握高效数据捕获与准确分析的6大策略

# 1. 网络嗅探器基础原理与工具介绍 网络嗅探器,或称为网络分析器、包分析器,是一种用于捕获网络中的数据包并分析其内容的工具。它们通过直接连接到网络上,读取传输中的数据包信息,为网络安全、故障排除和网络性
recommend-type

system verilog task中用宏定义传参

<think>好的,用户现在想了解如何在SystemVerilog中使用宏定义向task传递参数。之前我已经回答了C/C++中宏定义传参的方法,现在需要迁移到SystemVerilog,同时结合用户提供的引用内容。 首先,我需要回忆SystemVerilog中宏的基本语法,确认是否与C/C++类似。SystemVerilog确实支持`define宏,带参数的形式应该也是类似的。用户提供的引用中提到`__FILE__`和`__LINE__`,这些可能和调试有关,所以可能需要考虑在宏中加入这些信息来帮助调试。 接下来,用户的问题是关于如何通过宏向task传参。这里的task应该是指System
recommend-type

Java开发的Help GUI 1.1源码:可视化组件库详解

在分析给定文件信息后,可以提取出如下知识点: 首先,标题中提到了“基于java的开发源码-帮助视图组件库 Help GUI 1.1源代码.zip”,这说明文件包含了一个Java开发的开源项目,该库被命名为Help GUI,版本为1.1。在此基础上,我们可以讨论以下几个方面: 1. Java开发: - Java是一种广泛使用的面向对象的编程语言,它具有跨平台的特性,即“一次编写,到处运行”的能力。Java通过Java虚拟机(JVM)来实现跨平台运行。 - Java的开发环境一般需要配置Java开发工具包(JDK)和集成开发环境(IDE),如Eclipse、IntelliJ IDEA或PyCharm。 - Java支持多线程编程,拥有丰富的类库和框架,如Spring、Hibernate等,用以简化开发流程。 - Java在企业级应用、移动开发(Android)、桌面应用和服务器端应用中都有广泛的应用。 2. 开源项目: - 开源项目是指源代码公开的软件项目,通常遵循特定的开源许可协议,如GPL、LGPL、Apache License等。 - 开源项目的优势在于可自由使用、修改和分发代码,能够促进技术的交流和创新。 - 通过参与开源项目,开发者可以提高自身的技术水平,贡献代码以回馈社区。 3. 组件库Help GUI 1.1: - Help GUI可能是一个为开发者提供的图形用户界面(GUI)组件库,用于简化Java桌面应用的帮助视图创建。 - 组件库一般会包含一系列预制的用户界面组件,例如按钮、文本框、列表框、对话框等,以帮助快速构建用户界面。 - 版本1.1表明这是组件库的一个更新版本,通常新版本会增加新的特性、修复bug、优化性能。 4. PyCharm配置Python环境: - 这部分描述似乎与主标题无关,但其可能涉及PyCharm这一IDE的使用。 - PyCharm是专为Python语言开发的IDE,但也可以配置Java开发环境。 - 在配置Python环境时,需要安装Python解释器,并设置相关的路径、环境变量等。 - PyCharm提供了代码高亮、代码自动完成、版本控制等功能,能够提升开发效率。 由于【压缩包子文件的文件名称列表】中只有一个“codefans.net”,这可能是一个网站地址,但没有提供足够的信息来推断与上述Java项目或组件库直接相关的内容。 综上所述,文件描述了一个基于Java的开源组件库Help GUI 1.1,该组件库用于帮助开发者创建帮助视图,且暗示了PyCharm这一IDE的使用。通过探讨Java开发、开源项目、组件库和IDE配置等知识点,可以更好地理解文件所指的项目背景和应用场景。
recommend-type

网络嗅探器全攻略:从入门到精通的15大技巧与实践案例

# 1. 网络嗅探器基础与重要性 在数字化的世界中,网络嗅探器是IT专业人员的重要工具,它允许我们监视和分析经过网络的数据包。本章将带您了解网络嗅探器的基本概念及其在网络安全和性能监控中的关键作用。 ## 网络嗅探器概述 网络嗅探器,通常被称为“抓包工具”或“协议分析器”,是一种可以监听、记录和分析网络流量的程序或设备。它们在排除网络问题、进行安全审计和协议分析时发挥着重要作用。 ##