python_PyQt5日周月K线纵向对齐显示_3_聚焦某段图形

news2024/12/23 14:34:47

目录

写在前面:

结果显示:

代码:


写在前面:

“PyQt5日周月K线纵向对齐显示”,将分三篇博文描述

1 数据处理。将数据处理成适合图形显示的格式。(已写,请看往期博文)

2 显示工具开发。用pyqtgraph开发。(已写,请看往期博文)

3 聚焦某段图形

结果显示:

选择2023年1月5日聚焦,图形会将2023年1月5日的数据移到中心位置,并放大显示

代码:

聚焦的代码 在 def focus_location(self,left_x:int,right_x:int,y_data:List)中,计算要聚焦数据要显示的横坐标范围和纵坐标范围,在ViewBox中重绘

整体代码

import sys
import pandas as pd
import talib
from typing import Dict,List
from PyQt5 import QtCore,QtWidgets,QtGui
import pyqtgraph as pg
pg.setConfigOption('background','w')
pg.setConfigOption('foreground','k')

class CandlestickItem(pg.GraphicsObject):
    def __init__(self, data):
        pg.GraphicsObject.__init__(self)
        self.data = data  ## data must have fields: time, open, close, min, max
        self.generatePicture()

    def generatePicture(self):
        ## pre-computing a QPicture object allows paint() to run much more quickly,
        ## rather than re-drawing the shapes every time.
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('d'))
        # w = (self.data[1][0] - self.data[0][0]) / 3.
        w = 0.3
        for (t, open, close, min, max) in self.data:
            p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
            if open < close:
                p.setBrush(pg.mkBrush('r'))
            else:
                p.setBrush(pg.mkBrush('g'))
            p.drawRect(QtCore.QRectF(t-w, open, w * 2, close - open))
        p.end()

    def paint(self, p, *args):
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        ## boundingRect _must_ indicate the entire area that will be drawn on
        ## or else we will get artifacts and possibly crashing.
        ## (in this case, QPicture does all the work of computing the bouning rect for us)
        return QtCore.QRectF(self.picture.boundingRect())

class VOLtickItem(pg.GraphicsObject):
    def __init__(self, data):
        pg.GraphicsObject.__init__(self)
        self.data = data  ## data must have fields: time,open,close, vol
        self.generatePicture()

    def generatePicture(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('d'))
        # w = (self.data[1][0] - self.data[0][0]) / 3.
        w = 0.3
        for (t,open,close, vol) in self.data:
            if open < close:
                p.setBrush(pg.mkBrush('r'))
            else:
                p.setBrush(pg.mkBrush('g'))
            p.drawRect(QtCore.QRectF(t - w, 0, w * 2, vol))
        p.end()

    def paint(self, p, *args):
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        ## boundingRect _must_ indicate the entire area that will be drawn on
        ## or else we will get artifacts and possibly crashing.
        ## (in this case, QPicture does all the work of computing the bouning rect for us)
        return QtCore.QRectF(self.picture.boundingRect())

class ExampleWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_data()
        self.init_ui()
        pass
    def init_data(self):
        self.v_list = []
        self.vline_list = []
        self.hline_list = []
        self.label_list = []

        self.data_list = []
        self.show_map: Dict = {}
        self.mark_data_map: Dict = {}
        self.mark_item_map: Dict = {}
        self.hand_check_data: Dict = {}
        self.three_df = None

        self.graph_type_candle: str = 'candle'
        self.graph_type_curve: str = 'curve'
        self.graph_type_bar: str = 'bar'

        self.tip_show_yeah: bool = False
        pass
    def init_ui(self):
        self.setMinimumWidth(800)
        self.setMinimumHeight(600)
        origin_btn = QtWidgets.QPushButton('返回原位')
        origin_btn.clicked.connect(self.origin_btn_clicked)
        self.tip_checkbox = QtWidgets.QCheckBox('数据提示框')
        self.tip_checkbox.stateChanged.connect(self.tip_checkbox_stateChanged)

        self.focus_point = QtWidgets.QDateEdit()
        self.focus_point.setDisplayFormat('yyyy-MM-dd')
        self.focus_point.setCalendarPopup(True)
        focus_check_btn = QtWidgets.QPushButton('聚焦')
        focus_check_btn.clicked.connect(self.focus_check_btn_clicked)


        layout1 = QtWidgets.QHBoxLayout()
        layout1.addWidget(origin_btn)
        layout1.addWidget(self.tip_checkbox)
        layout1.addStretch(1)
        layout1.addWidget(self.focus_point)
        layout1.addWidget(focus_check_btn)

        self.pw_layout = QtWidgets.QVBoxLayout()
        self.scroll_area = QtWidgets.QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.scroll_area.setViewportMargins(20,20,20,20)

        layout = QtWidgets.QVBoxLayout()
        layout.addLayout(layout1)
        layout.addWidget(self.scroll_area)
        self.setLayout(layout)
        pass

    def focus_location(self,left_x:int,right_x:int,y_data:List):
        if self.v_list:
            v0 = self.v_list[0]
            v0.setXRange(min=left_x,max=right_x)
            for i,v in enumerate(self.v_list):
                y_node = y_data[i]
                v.setYRange(min=y_node[0],max=y_node[1])
        pass
    def restart_init(self):
        self.v_list.clear()
        self.vline_list.clear()
        self.hline_list.clear()
        self.label_list.clear()
        self.data_list.clear()
        self.show_map.clear()
        pass

    def origin_btn_clicked(self):
        if self.v_list:
            v0 = self.v_list[0]
            v0.enableAutoRange() # 还原到初始状态
        pass
    def tip_checkbox_stateChanged(self):
        if self.tip_checkbox.isChecked():
            self.tip_show_yeah = True
        else:
            self.tip_show_yeah = False
        pass
    def focus_check_btn_clicked(self):
        focus_date_str = self.focus_point.date().toString('yyyy-MM-dd')
        cur_i = self.hand_check_data[focus_date_str]
        y_data = self.caculate_focus_location_data(cur_i-10, cur_i+10)
        self.focus_location(cur_i-10, cur_i+10, y_data)
        pass
    def caculate_focus_location_data(self,left_x:int,right_x:int)->List:
        # 返回每个视图的y数据 日 周 月
        three_df = self.three_df.copy()
        node_df = three_df.loc[(three_df['row_i']>=left_x) & (three_df['row_i']<=right_x)].copy()
        day_y_min = node_df['lowestPrice'].min()
        day_y_max = node_df['highestPrice'].max()
        day_v_min = 0
        day_v_max = node_df['turnoverVol'].max()
        week_y_min = node_df['week_low'].min()
        week_y_max = node_df['week_high'].max()
        week_v_min = 0
        week_v_max = node_df['week_turnoverVol'].max()
        month_y_min = node_df['month_low'].min()
        month_y_max = node_df['month_high'].max()
        month_v_min = 0
        month_v_max = node_df['month_turnoverVol'].max()

        return [[day_y_min,day_y_max],[day_v_min,day_v_max],[week_y_min,week_y_max],[week_v_min,week_v_max],[month_y_min,month_y_max],[month_v_min,month_v_max]]
    def set_data(self,data:Dict):
        self.restart_init()
        self.show_map = data['show_map']
        self.data_list = data['data_list']
        self.hand_check_data = data['hand_check_data']
        self.three_df = data['three_df']
        self.fill_viewbox()
        pass
    def fill_viewbox(self):
        pw = pg.GraphicsLayoutWidget(show=False)
        h_i = 0
        for i,node in enumerate(self.data_list):
            '''
            height_num
            data_list:[
            {
            type:candle,curve,bar
            data:[]
            },
            {}
            ]
            '''
            v = pw.addViewBox(row=i, col=0)
            v.setMouseEnabled(x=True, y=False)
            v.setAutoVisible(x=False, y=True)
            height_num = node['height_num']
            node_yMin = node['yMin']
            node_yMax = node['yMax']
            pw.ci.layout.setRowMinimumHeight(i, height_num)
            v.setLimits(yMin=node_yMin, yMax=node_yMax)
            h_i += height_num
            if i>0:
                v.setXLink(self.v_list[0])
            node_data_list = node['data_list']
            for one in node_data_list:
                one_type = one['type']
                one_data = one['data']
                if one_type == self.graph_type_candle:
                    candle = CandlestickItem(one_data)
                    v.addItem(candle)
                elif one_type == self.graph_type_curve:
                    curve = pg.PlotCurveItem(x=one_data['x'],y=one_data['y'],pen=(0,0,255))
                    v.addItem(curve)
                    pass
                elif one_type == self.graph_type_bar:
                    bar = VOLtickItem(one_data)
                    v.addItem(bar)
                    pass
                else:
                    pass
                pass

            vLine = pg.InfiniteLine(angle=90, movable=False)
            hLine = pg.InfiniteLine(angle=0, movable=False)
            label = pg.TextItem()
            v.addItem(vLine, ignoreBounds=True)
            v.addItem(hLine, ignoreBounds=True)
            v.addItem(label, ignoreBounds=True)

            v.scene().sigMouseMoved.connect(self.mouseMoved)

            self.v_list.append(v)
            self.vline_list.append(vLine)
            self.hline_list.append(hLine)
            self.label_list.append(label)
            pass
        pw.setFixedHeight(h_i+50)
        self.fill_pw_widget(pw)
        pass

    def fill_pw_widget(self,pw):
        # print(pw.width(),pw.height())
        # 清空控件
        while self.pw_layout.count():
            item = self.pw_layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            pass
        sc_child_widget = self.scroll_area.takeWidget()
        if sc_child_widget is not None:
            sc_child_widget.deleteLater()
        # for item in self.pw_widgets_list:
        #     self.pw_layout.addWidget(item)
        self.pw_layout.addWidget(pw)
        one_sc_child_widget = QtWidgets.QWidget()
        one_sc_child_widget.setLayout(self.pw_layout)
        self.scroll_area.setWidget(one_sc_child_widget)
        pass

    def mouseMoved(self,evt):
        pos = evt
        for la in self.label_list:
            la.setHtml("")
            la.setPos(-1, -1)
        for i,v in enumerate(self.v_list):
            if v.sceneBoundingRect().contains(pos):
                mousePoint = v.mapSceneToView(pos)
                index = int(mousePoint.x())
                hline = self.hline_list[i]
                hline.setPos(mousePoint.y())
                for hi,hl in enumerate(self.hline_list):
                    if hi!=i:
                        hl.setPos(-1)
                    pass
                for vl in self.vline_list:
                    vl.setPos(mousePoint.x())
                if self.tip_show_yeah and self.show_map.get(str(index)):
                    node_one = self.show_map[str(index)]
                    node_str = "<span style='font-size:12pt;color:red'>"

                    n_i = 1
                    for k,v in node_one.items():
                        if n_i%7 == 0:
                            node_str += f"{k}:{v}<br/>"
                        else:
                            node_str += f"{k}:{v}&nbsp;"
                        n_i += 1
                        pass
                    node_str += "</span>"
                    tip_label = self.label_list[i]
                    tip_label.setHtml(node_str)
                    tip_label.setPos(mousePoint.x(),mousePoint.y())
                    pass
                else:
                    for la in self.label_list:
                        la.setHtml("")
                        la.setPos(-1,-1)
                    pass
                break
            pass
        pass

    pass

def temp_000():
    junxian = 20
    columns_list = ['row_i', 'tradeDate', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice',
                               'turnoverVol', 'turnoverValue','ma','vol_ma','value_ma']
    file_path = r'E:/temp003/600941.xlsx'
    df = pd.read_excel(file_path,engine='openpyxl')
    df['row_i'] = [i for i in range(len(df))]
    df['o_date'] = pd.to_datetime(df['tradeDate'])
    df['ma'] = talib.MA(df['closePrice'], timeperiod=junxian)
    df['vol_ma'] = talib.MA(df['turnoverVol'], timeperiod=junxian)
    df['value_ma'] = talib.MA(df['turnoverValue'], timeperiod=junxian)
    week_group = df.resample('W-FRI', on='o_date')
    month_group = df.resample('M', on='o_date')

    week_df = week_group.last()
    week_df['row_i'] = week_group.last()['row_i']
    week_df['openPrice'] = week_group.first()['openPrice']
    week_df['lowestPrice'] = week_group.min()['lowestPrice']
    week_df['highestPrice'] = week_group.max()['highestPrice']
    week_df['turnoverVol'] = week_group.sum()['turnoverVol']
    week_df['turnoverValue'] = week_group.sum()['turnoverValue']
    week_df = week_df.loc[:, columns_list].copy()
    week_df.dropna(axis=0, how='any', subset=['closePrice'], inplace=True)
    week_df['ma'] = talib.MA(week_df['closePrice'], timeperiod=junxian)
    week_df['vol_ma'] = talib.MA(week_df['turnoverVol'], timeperiod=junxian)
    week_df['value_ma'] = talib.MA(week_df['turnoverValue'], timeperiod=junxian)

    month_df = month_group.last()
    month_df['row_i'] = month_group.last()['row_i']
    month_df['openPrice'] = month_group.first()['openPrice']
    month_df['lowestPrice'] = month_group.min()['lowestPrice']
    month_df['highestPrice'] = month_group.max()['highestPrice']
    month_df['turnoverVol'] = month_group.sum()['turnoverVol']
    month_df['turnoverValue'] = month_group.sum()['turnoverValue']
    month_df = month_df.loc[:, columns_list].copy()
    month_df.dropna(axis=0, how='any', subset=['closePrice'], inplace=True)
    month_df['ma'] = talib.MA(month_df['closePrice'], timeperiod=junxian)
    month_df['vol_ma'] = talib.MA(month_df['turnoverVol'], timeperiod=junxian)
    month_df['value_ma'] = talib.MA(month_df['turnoverValue'], timeperiod=junxian)

    daily_df = df.loc[:, columns_list].copy()
    return daily_df, week_df, month_df
    # daily_df.to_excel(r'E:/temp009/day.xlsx',engine='openpyxl')
    # week_df.to_excel(r'E:/temp009/week.xlsx',engine='openpyxl')
    # month_df.to_excel(r'E:/temp009/month.xlsx',engine='openpyxl')
    return daily_df,week_df,month_df

def temp_001(daily_df,week_df,month_df):
    week_df.rename(
        columns={'row_i': 'week_i', 'tradeDate': 'week_tradeDate', 'closePrice': 'week_close', 'openPrice': 'week_open',
                 'lowestPrice': 'week_low', 'highestPrice': 'week_high', 'turnoverVol': 'week_turnoverVol',
                 'turnoverValue': 'week_turnoverValue'}, inplace=True)
    month_df.rename(columns={'row_i': 'month_i', 'tradeDate': 'month_tradeDate', 'closePrice': 'month_close',
                             'openPrice': 'month_open', 'lowestPrice': 'month_low', 'highestPrice': 'month_high',
                             'turnoverVol': 'month_turnoverVol', 'turnoverValue': 'month_turnoverValue'}, inplace=True)

    three_df = pd.merge(daily_df, week_df, how='left', left_on='tradeDate', right_on='week_tradeDate')
    three_df.fillna(method='bfill', inplace=True)
    three_df = pd.merge(three_df, month_df, how='left', left_on='tradeDate', right_on='month_tradeDate')
    three_df.fillna(method='bfill', inplace=True)
    # three_df.to_excel(r'E:/temp009/111/three.xlsx',engine='openpyxl')
    res_map = {}
    for i, row in three_df.iterrows():
        row_i = row['row_i']
        res_map[str(row_i)] = {
            '日期': row['tradeDate'],
            '收盘价': row['closePrice'],
            '开盘价': row['openPrice'],
            '最高价': row['highestPrice'],
            '最低价': row['lowestPrice'],
            '成交量': row['turnoverVol'],
            '成交额': row['turnoverValue'],
            '周': row['week_tradeDate'],
            '周收盘价': row['week_close'],
            '周开盘价': row['week_open'],
            '周最高价': row['week_high'],
            '周最低价': row['week_low'],
            '周成交量': row['week_turnoverVol'],
            '周成交额': row['week_turnoverValue'],
            '月': row['month_tradeDate'],
            '月收盘价': row['month_close'],
            '月开盘价': row['month_open'],
            '月最高价': row['month_high'],
            '月最低价': row['month_low'],
            '月成交量': row['month_turnoverVol'],
            '月成交额': row['month_turnoverValue']
        }
    return res_map, three_df

def temp_002(df):
    # 生成K线图和成交量柱状图
    k_height_num = 400
    vol_height_num = 100
    candle_data = df.loc[:, ['row_i', 'openPrice', 'closePrice', 'lowestPrice', 'highestPrice']].values.tolist()
    curve_data = {
        'x': df['row_i'].values.tolist(),
        'y': df['ma'].values.tolist()
    }
    one = {
        'height_num': k_height_num,
        'yMin': df['lowestPrice'].min(),
        'yMax': df['highestPrice'].max(),
        'data_list': [
            {
                'type': 'candle',
                'data': candle_data
            },
            {
                'type': 'curve',
                'data': curve_data
            }
        ]
    }
    bar_data = df.loc[:, ['row_i', 'openPrice', 'closePrice', 'turnoverVol']].values.tolist()
    curve_data2 = {
        'x': df['row_i'].values.tolist(),
        'y': df['vol_ma'].values.tolist()
    }
    two = {
        'height_num': vol_height_num,
        'yMin': 0,
        'yMax': df['turnoverVol'].max(),
        'data_list': [
            {
                'type': 'bar',
                'data': bar_data
            },
            {
                'type': 'curve',
                'data': curve_data2
            }
        ]
    }
    return one, two


if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    app = QtWidgets.QApplication(sys.argv)
    main_window = ExampleWidget()
    # main_window.show()
    # app.exec()

    day_df,week_df,month_df = temp_000()
    k_tip_map, three_df = temp_001(day_df.copy(),week_df.copy(),month_df.copy())
    one,two = temp_002(day_df.copy())
    three,four = temp_002(week_df.copy())
    five,six = temp_002(month_df.copy())

    hand_check_data = {}
    for i,row in day_df.iterrows():
        hand_check_data[row['tradeDate']] = row['row_i']

    base_k_data = {
        'show_map': k_tip_map,
        'data_list': [one, two, three, four, five, six],
        'hand_check_data':hand_check_data,
        'three_df':three_df
    }
    main_window.set_data(base_k_data)
    main_window.show()
    app.exec()
    pass


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

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

相关文章

搜维尔科技:Varjo在心理学、医学研究、技术、工程学等领域都在使用

该软件用于心理学、医学研究、可用性、品牌和营销等领域。vajio头显组合到了运动8.0平台中,提供了在高保真虚拟环境中进行的行为研究,否则这些环境的成本太高,不切实际,甚至无法在现实世界中再现。 在心理学、医学研究、可用性、技术、工程学、市场营销等领域工作的学术和商业研…

【项目管理】生命周期风险评估

规划阶段目标&#xff1a;识别系统的业务战略&#xff0c;以支撑系统的安全需求及安全战略 规划阶段评估重点&#xff1a;1、本阶段不需要识别资产和脆弱性&#xff1b;2、应根据被评估对象的应用对象、应用环境、业务状况、操作要求等方面识别威胁&#xff1b; 设计阶段目标…

草莓熊代码

话不多说直接上代码 如果需要exe文件电脑可以不依赖环境直接运行请评论或者私信 注意: 不需要年月日显示 注释 879-894 行不需要雪花显示 注释 895-908 行不需要礼物显示 注释 771 行653行 可以修改 祝你节日快乐内容657行 可以修改 草莓熊 内容修改程序标题 第 16 行# -*- co…

Tower for Mac—Git客户端 支持M1

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

使用考试培训系统定制适合不同学生需求的教学内容

考试培训系统是一种方便高效的教育工具&#xff0c;可以根据不同学生的需求定制教学内容。通过使用这个系统&#xff0c;教师可以为学生提供个性化的学习计划&#xff0c;帮助他们提高学习效果。以下将详细介绍如何使用考试培训系统定制适合不同学生需求的教学内容。 考试培训系…

联手皇室企业 哪吒汽车发力阿联酋

布局阿联酋,哪吒汽车全球化战略加速落地。10月27日,哪吒汽车与阿联酋知名企业——EIH Automotive &Trading,在上海签署战略合作协议,并宣布2024年将为阿联酋带去多款车型。拥有皇室背景的EIH Automotive &Trading,将成为哪吒汽车在阿联酋的首家战略经销商,加速哪吒汽车…

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

Termux SFTP如何实现远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

LSH 复习(考试向)

LSH Review OverallMinhash SignaturesBinary Matrix&#xff08;bit-vector&#xff09;Construct MinHash matrixGenerate simulated permutationsJaccard similarities Tuning Parameters for rNNS Overall hash就是将不同长度规则的文本转化成相同长度的字符串&#xff0c…

问CHAT:以“重要性”为题写一篇作文

今天小编带大家看看&#xff0c;如何利用CHAT 写一篇作文&#xff0c;那我们来根据要求来问它。 问CHAT &#xff1a;以“重要性”为题写一篇作文&#xff0c;非语言交流的基础”根据下面的提纲来写作文。 1)非言语交际概述。 (暗示:暗示、敏感、情感、非语言) 2)非言语交际的…

Leetcode刷题---搜索插入位置(Java实现二分查找算法)

题目描述&#xff1a; 题解一 class Solution {public int searchInsert(int[] nums, int target) {int i0;while(i<nums.length){if(nums[i]>target){return i;}if(nums[i]<target ){i;}}return i;} }题解二—使用二分查找算法 使用算法前提&#xff1a;数组是一…

52张扑克牌(Python字符串替换)

输入a~d的字母对应扑克牌黑、红、梅、方花色 1~13数字对应扑克牌点数&#xff1b;输出“字母数字”字符串对应的扑克牌花色和点数。 (本笔记适合熟悉Python循环和str字符串处理的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

【二叉树经典题目】

根据二叉树创建字符串 本题的关键在于什么情况要省略括号&#xff0c;什么情况不能省略&#xff1a; 左右为空可以省略括号 左不为空&#xff0c;右为空可以省略括号左为空,右不为空不能省略括号 class Solution { public://1.左右为空可以省略括号//2.左不为空&#xff0c;右…

杰林码纠错算法库(lib、dll)以及AWGN信道BPSK信号下的仿真程序(C/C++)

2023年10月30日此次是我最后一次在国内发布纠错算法的测试程序&#xff0c;这个算法2018年左右就出来了第一个版本&#xff0c;部分网络上也能下载到测试程序&#xff0c;尽管以前的版本效率跟不上&#xff0c;而且码率比较固定只能支持0.63。通过几年的努力&#xff0c;我这次…

分享一下怎么做一个同城配送小程序

如何制作一个同城配送小程序&#xff1a;功能特点、使用指南及未来展望 一、引言 随着互联网的快速发展&#xff0c;人们对于生活服务的需求越来越高。同城配送作为连接消费者与商家的桥梁&#xff0c;越来越受到人们的关注。本文将详细介绍如何制作一个同城配送小程序&#…

oracel处理XML时,报ORA-31011、ORA-19202。

原字段为clob&#xff0c; 查询 SELECT XMLTYPE(字段) FROM TABLE_A报错如下&#xff1a; ORA-31011: XML 语法分析失败 ORA-19202: XML 处理 LPX-00217: invalid character 12 (U000C) Error at line 1559时出错 ORA-06512: 在 "SYS.XMLTYPE", line 272 ORA-0651…

3ds Max2022安装教程(最新最详细)

目录 一.简介 二.安装步骤 网盘资源见文末 一.简介 3DS Max是由Autodesk公司开发的一款专业三维建模、动画和渲染软件&#xff0c;广泛应用于影视、游戏、建筑和工业设计等领域。 3DS Max的主要特点和功能包括&#xff1a; 三维建模&#xff1a;3DS Max提供了各种强大的建…

【数据结构】数组和字符串(十一):字符串的定义与存储(顺序存储、链式存储及其C语言实现)

文章目录 4.3 字符串4.3.1 字符串的定义与存储1. 顺序存储2. 链式存储3. C语言实现顺序存储4. C语言实现链式存储代码优化 4.3 字符串 字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列&#xff0c;简称为串。例如 “good morning”就是由12个字符构成的一个字符…

优思学院|制作SPC控制图一定要用Minitab吗?

如果是使用SPC控制图作为一种控制过程变异的工具&#xff0c;无需使用Minitab&#xff0c;用Excel已经相当足够。但无论你使用哪种工具&#xff0c;你都应该要先明白SPC或者控制图工具的目的是什么&#xff0c;以及如何选择合适的控制图&#xff0c;以及如何去解读它等等。 要…

从云到AI到大模型,阿里云始终和谁站在了一起?

引言&#xff1a;云的创新没有减缓 而且在加速深入百行百业 【科技明说 &#xff5c; 热点关注】 【全球云观察 | 每日看点】作为中国最大的云计算厂商&#xff0c;阿里云的产品矩阵覆盖越来越全面&#xff0c;越来越细致&#xff0c;越来越到位。 ​ 在2023杭州云栖大会现场…