python_PyQt5开发验证K线视觉想法工具V1.2_批量验证

news2024/11/20 21:34:00

目录

运行情况:

​编辑

结果json文件格式:

 代码:


承接 【python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段】 博文

地址:python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段_程序猿与金融与科技的博客-CSDN博客

运行情况:

1 选择“批量验证”

2 选择时间区间,与验证的数据相同的时间区间

3 选择股票日数据所在文件夹

4 选择标记结果json文件

5 可以选择某一个股票显示结果,也可以通过“上一个”,“下一个”按钮切换股票查看对应股票标记

结果json文件格式:

 代码:

 界面布局

 1 在 EyeCheckMainWidget 类中实现 fill_stack_widget_two 方法

    def fill_stack_widget_two(self):
        batch_choice_daily_dir_btn = QtWidgets.QPushButton('选择股票日数据文件夹')
        batch_choice_daily_dir_btn.clicked.connect(self.batch_choice_daily_dir_btn_clicked)
        self.batch_choice_daily_dir_lineedit = QtWidgets.QLineEdit()
        batch_results_file_btn = QtWidgets.QPushButton('批量结果json文件')
        batch_results_file_btn.clicked.connect(self.batch_results_file_btn_clicked)
        self.batch_results_file_lineedit = QtWidgets.QLineEdit()

        batch_layout_one = QtWidgets.QFormLayout()
        batch_layout_one.addRow(batch_choice_daily_dir_btn,self.batch_choice_daily_dir_lineedit)
        batch_layout_one.addRow(batch_results_file_btn,self.batch_results_file_lineedit)

        self.batch_targets_combox = QtWidgets.QComboBox()
        self.batch_targets_combox.currentTextChanged.connect(self.batch_targets_combox_currentTextChanged)
        batch_pre_btn = QtWidgets.QPushButton('上一个')
        batch_pre_btn.clicked.connect(self.batch_pre_btn_clicked)
        batch_next_btn = QtWidgets.QPushButton('下一个')
        batch_next_btn.clicked.connect(self.batch_next_btn_clicked)

        batch_layout_two = QtWidgets.QHBoxLayout()
        batch_layout_two.addWidget(self.batch_targets_combox)
        batch_layout_two.addWidget(batch_pre_btn)
        batch_layout_two.addWidget(batch_next_btn)

        batch_layout = QtWidgets.QVBoxLayout()
        batch_layout.addLayout(batch_layout_one)
        batch_layout.addLayout(batch_layout_two)
        self.stack_two.setLayout(batch_layout)
        pass

2 在 EyeCheckMainWidget 类  init_data 方法

    def init_data(self):
        self.please_select_str: str = '-- 请选择 --'
        self.single_settingMark_widget: QtWidgets.QWidget = None
        self.target_column_list: List[str] = ['xTick', 'open', 'close', 'highest', 'lowest']
        self.target_names_list: List[str] = []
        self.target_marks_map: Dict = {}
        self.batch_current_target_name: str = None
        pass

3 在 EyeCheckMainWidget 类 增加批量验证用到的方法

    def caculate_k_data_and_show(self,daily_file:str,title_name:str):
        left_point = self.left_point.date().toString('yyyy-MM-dd')
        right_point = self.right_point.date().toString('yyyy-MM-dd')
        left_datetime = datetime.datetime.strptime(left_point, '%Y-%m-%d')
        right_datetime = datetime.datetime.strptime(right_point, '%Y-%m-%d')
        if left_datetime >= right_datetime:
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '请选择时间区间',
                QtWidgets.QMessageBox.Yes
            )
            return
        df = pd.read_csv(daily_file, encoding='utf-8')
        df = df.loc[df['openPrice'] > 0].copy()
        df['o_date'] = pd.to_datetime(df['tradeDate'])
        df = df.loc[(df['o_date'] >= left_point) & (df['o_date'] <= right_point)].copy()
        df['open'] = df['openPrice'] * df['accumAdjFactor']
        df['close'] = df['closePrice'] * df['accumAdjFactor']
        df['highest'] = df['highestPrice'] * df['accumAdjFactor']
        df['lowest'] = df['lowestPrice'] * df['accumAdjFactor']
        df['xTick'] = df['tradeDate']

        k_data = {
            'whole_df': df,
            'whole_header': ['日期', '开盘', '收盘', '最高', '最低'],
            'whole_pd_header': self.target_column_list
        }
        self.graph_widget.first_setData(k_data)
        self.graph_title_label.setText(title_name)
        pass
    def batch_choice_daily_dir_btn_clicked(self):
        path = QtWidgets.QFileDialog.getExistingDirectory(
            self,
            '打开股票日数据所在目录',
            '.'
        )
        if not path:
            return
        self.batch_choice_daily_dir_lineedit.setText(path)
    def batch_results_file_btn_clicked(self):
        path,_ = QtWidgets.QFileDialog.getOpenFileName(
            self,
            '打开标记计算结果json文件',
            '.',
            'JSON(*.json)'
        )
        if not path:
            return

        try:
            with open(path,'r',encoding='utf-8') as fr:
                json_obj = json.load(fr)
            self.target_marks_map = json_obj

            self.target_names_list.clear()
            self.target_names_list = list(json_obj.keys())
            self.batch_targets_combox.clear()
            self.batch_current_target_name = None
            self.batch_targets_combox.addItem(self.please_select_str)
            self.batch_targets_combox.addItems(self.target_names_list)

            self.batch_results_file_lineedit.setText(path)
            pass
        except Exception as e:
            print(e)
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                e.__str__(),
                QtWidgets.QMessageBox.Yes
            )
            return
        pass
    def batch_targets_combox_currentTextChanged(self,txt:str):
        cur_txt = self.batch_targets_combox.currentText()
        if not cur_txt or cur_txt == self.please_select_str:
            return
        self.batch_current_target_name = cur_txt
        self.batch_show_current_target()
        pass
    def batch_pre_btn_clicked(self):
        if not self.batch_current_target_name:
            self.batch_current_target_name = self.target_names_list[-1]
        else:
            node_index = self.target_names_list.index(self.batch_current_target_name)
            if node_index <=0:
                self.batch_current_target_name = self.target_names_list[-1]
            else:
                self.batch_current_target_name = self.target_names_list[node_index-1]
            pass
        self.batch_show_current_target()
        pass
    def batch_next_btn_clicked(self):
        if not self.batch_current_target_name:
            self.batch_current_target_name = self.target_names_list[0]
        else:
            node_index = self.target_names_list.index(self.batch_current_target_name)
            if node_index >= len(self.target_names_list)-1:
                self.batch_current_target_name = self.target_names_list[0]
            else:
                self.batch_current_target_name = self.target_names_list[node_index+1]
        self.batch_show_current_target()
        pass
    def batch_show_current_target(self):
        self.mark_table.clear_table_contents()
        one_node = self.target_marks_map[self.batch_current_target_name]
        self.mark_table.set_data(one_node)

        # daily_file,title_name
        daily_dir = self.batch_choice_daily_dir_lineedit.text()
        daily_file = daily_dir + os.path.sep + self.batch_current_target_name + '.csv'
        if not daily_dir or not os.path.exists(daily_file):
            QtWidgets.QMessageBox.information(
                self,
                '提示',
                '股票日数据目录没有选择,或对应日数据不存在',
                QtWidgets.QMessageBox.Yes
            )
            return
        self.caculate_k_data_and_show(daily_file,self.batch_current_target_name)
        self.graph_widget.add_marks(one_node)
        pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用node.js 搭建一个简单的HelloWorld Web项目

文档结构 config.ini #将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式如 natapp -authtokenxxx 等相同参数将会覆盖掉此配置 #命令行参数 -config 可以指定任意config.ini文件 [default] authtokencc83c08d73357802 #对应一条隧…

【LeetCode】从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 题目描述算法分析编程代码 链接: 从中序与后序遍历序列构造二叉树 题目描述 算法分析 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : …

Vulnhub靶机DC-2 writeup

靶机介绍 靶机介绍&#xff1a;https : //download.vulnhub.com/dc/DC-2.zip ​ 信息搜集 获取IP地址 扫描靶机的IP的方法 1. nmap -sP 192.168.142.0/24 #nmap进行ping扫描发现存活主机 2. arp-scan -l #基于ARP发现内网存活主机 3. netdiscover -r 192.168.142.0/24 -…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

Vue2 第十七节 Vue中的Ajax

1.Vue脚手架配置代理 2.vue-resource 一.Vue脚手架配置代理 1.1 使用Ajax库 -- axios ① 安装 : npm i axios ② 引入: import axios from axios ③ 使用示例 1.2 解决开发环境Ajax跨域问题 跨域&#xff1a;违背了同源策略&#xff0c;同源策略规定协议名&#xff0…

智能的等价超越了数学的等价

尽管等价关系只是智能的一方面&#xff0c;还有其他一些如语言理解、创造性思维和决策能力等方面都可以作为评估智能的标志。 能否有效产生出等价关系仍然被视为智能出现的最重要标志之一。在认知科学和人工智能领域&#xff0c;智能通常被定义为具备理解、学习、推理和问题解决…

Python系统学习1-3

1、变量 变量&#xff1a;关联一个对象的标识符 学习目标&#xff1a;学会画变量的内存图 命名规则:字母数字下划线&#xff0c;所有单词小写&#xff0c;单词之间下划线隔开 赋值&#xff1a;创建一个变量或改变一个变量关联的数据。 语法&#xff1a;变量名数据&#xf…

【项目流程】前端项目的开发流程

1. 项目中涉及的所有角色及其职责 - PM 产品经理 产品经理&#xff08;Product Manager&#xff0c;简称PM&#xff09;负责明确和定义产品的愿景和战略&#xff0c;与客户、用户、业务部门和其他利益相关者进行沟通&#xff0c;收集并分析他们的需求和期望。负责制定产品的详…

使用FreeMarker导出word文档(支持导出图片)

今天跟大家分享一下工作中比较实用的导出word 带图片的功能。 对于在idea开发中我们需要引入以下依赖&#xff1a; 2.对于eclipse 开发我们需要进入对应的jar包 这个必须放在lib下&#xff0c;同样也需要在当前项目的环境是加入该依赖 需要在MEAT-INF加入 首先制定word 导出…

动画响应卡

html代码: <div class"container"><div class"card" style"--clr: #009688"><div class"img-box"><img src"https://www.jq22.com/newjs/img-01.png"></div><div class"content&quo…

RabbitMQ 教程 | 第8章 跨越集群的界限

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

面试热题100(买卖股票的最佳时机)

为什么有人夜里碰到股票问题&#xff0c;辗转反侧睡不着觉&#xff1f;为什么有人看到股票问题心理欢喜直接操作&#xff1f;你是想做哪类人&#xff1f;今天就揭秘股票问题&#xff0c;让你应对股票问题的时候可以如鱼得水。 这种问题一看就是动态规划问题&#xff0c;动态规划…

导入了Junit依赖,但@Test注解依然爆红~

错误描述如下所示&#xff1a; 原因&#xff1a; 解决方法&#xff0c;将<scope>test</scope>删除&#xff0c;再如下所示重新构建项目&#xff1a;

MYSQL视图和mysql触发器(学会并使用day6)

MYSQL视图和mysql触发器 MYSQL视图使用视图的原因视图作用视图规则和限制视图的应用实际操作创建表并查看创建视图视图记录修改修改视图 mysql触发器创建触发器employee表employee02表创建一个触发器t1更新语句并查看employee02表删除触发器查询触发器触发器类型OLD和NEW MYSQL…

用户体验旅程图:改进用户体验的好工具

用户体验旅程图&#xff1a;改进用户体验的好工具 怎么改进体验&#xff0c;是有方法的 用户情绪曲线来衡量用户感觉 趣讲大白话&#xff1a;没有流程刨析&#xff0c;就没法改进 【趣讲信息科技245期】 **************************** 企业管理需要基本的流程的 企业流程简称BP…

“中国网安企业出海20强” | 赛宁网安持续领航国际市场

​​8月2日&#xff0c;斯元商业咨询机构基于对网安行业长期研究数据和公开调研&#xff0c;正式发布了「China’s Top 20 Cybersecurity Tech Going Global」&#xff08;「中国网络安全企业出海20强」&#xff09;研究报告&#xff08;以下简称TOP20报告&#xff09;。 “TO…

【MYSQL】MYSQL学习笔记【基础篇】【未完待续】

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库&#xff0c;数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.3 MySQL数据库安装1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2…

UIAutomator2安装及连接手机,我踩的坑都在这儿了

一、大致步骤 大家搜索网络教程&#xff0c;都会看到差不多的安装步骤&#xff1a; 1、本人使用的python3.11 2、OPPO手机 3、安装UIAutomator2&#xff1a; 在命令行中输入&#xff1a;pip install --pre uiautomator2 4、安装配置adb 安装window上&#xff08;其他的自…

excal中遇到数据变成科学计数法的处理方法

1、单元格宽度太小&#xff08;解决办法增加单元格的宽度&#xff09; 2、通过设置单元格格式里面调整 #;#;0;G/通用格式

Python毕业设计 抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕…