ali_ssssa 2024-06-02 18:28 采纳率: 8.3%
浏览 28
已结题

index -1 is out of bounds for axis 0 with size 0

运行之后报错:index -1 is out of bounds for axis 0 with size 0。请问这该怎么解决?



import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
import numpy as np
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from PyQt5.QtWidgets import QDialog,QApplication,QLabel, QLineEdit,QMainWindow,QWidget, QVBoxLayout, QPushButton, QFileDialog, QTableWidget, QTableWidgetItem
from matplotlib.figure import Figure

class ExcelAnalyzer(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 设置窗口标题和初始大小
        self.setWindowTitle('Excel数据分析器')
        self.setGeometry(100, 100, 800, 600)

        # 创建垂直布局
        layout = QVBoxLayout()

        # 创建按钮,用于打开文件选择对话框
        self.loadButton = QPushButton('加载Excel文件', self)
        self.loadButton.clicked.connect(self.loadExcelFile)
        layout.addWidget(self.loadButton)

        # 设置布局
        self.setLayout(layout)

     # 打开文件选择对话框
    def loadExcelFile(self):
        filename, _ = QFileDialog.getOpenFileName(self, "选择Excel文件", "", "Excel Files (*.xlsx *.xls);;All Files (*)")
        if filename:
            self.loadExcelData(filename)
            
    #读取表格
    def loadExcelData(self, filename):
        df = pd.read_excel(filename)
        self.search_window = SearchScreen(self,df)
        self.hide()
        self.search_window.show()

class SearchScreen(QMainWindow):
    def __init__(self, parent,df):
        super().__init__(parent)
        self.setWindowTitle("股票查询")
        self.setGeometry(100, 100, 400, 300)
        self.df = df
        #搜索框
        self.code_input = QLineEdit(self)
        self.code_input.setPlaceholderText("输入代码(1001至1100)")
        #搜索按钮
        self.search_btn = QPushButton("搜索", self)
        self.search_btn.clicked.connect(self.on_search_clicked)
        #返回按钮
        self.back_btn = QPushButton("返回", self)
        self.back_btn.clicked.connect(self.on_back_clicked)

        layout = QVBoxLayout()
        layout.addWidget(self.code_input)
        layout.addWidget(self.search_btn)
        layout.addWidget(self.back_btn)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def on_search_clicked(self): 
        code = self.code_input.text()
        if code in [f'{number}' for number in range(1001,1101)]:
            self.details_window = show_details(self,code,self.df)
            self.details_window.show()    
        else:
            self.currentPage = QLabel("无效的代码")
      
    def on_back_clicked(self):
        self.parent().show()
        self.hide()
        

#详细信息页面
class show_details(QMainWindow):
    def __init__(self, parent, code,df):
        super().__init__(parent)
        self.code = code
        self.df = df
        self.dfi = self.individual()
        self.setWindowTitle("详细信息")
        self.setGeometry(100, 100, 400, 300)
        #返回按钮
        self.back_btn = QPushButton("返回", self)
        self.back_btn.clicked.connect(self.on_back_clicked)  
        #折线图按钮
        self.price_btn = QPushButton('价格折线图',self)
        self.price_btn.clicked.connect(self.show_price)
        
    def individual(self):
            dfi = self.df[self.df['股票代码'] == self.code]
            dfi.set_index(['日期'],inplace = True)
            dfi.index.name = 'Date'        
            dfi.columns = ['Number','Open','Close','High','Low','Volume','Limit','Amplitude','Turnover']
            return dfi
        
    def on_back_clicked(self):
            self.parent().show()
            self.hide()
            
    def show_price(self):
            dialog = priceDialog(self.dfi, self)
            dialog.exec_()
            
class priceDialog(QDialog):
    def __init__(self, dfi, parent=None):
        super().__init__(parent)
        self.dfi = dfi
        self.fig= Figure()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('价格折线图')
        self.setGeometry(300, 300, 600, 400) 

        # 创建一个matplotlib图表
        self.fig = mpf.plot(self.dfi,
                            type = 'line',
                            style = 'charles')
        # 创建一个垂直布局并添加图表
        self.canvas = FigureCanvasQTAgg(self.fig)
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)  # 确保添加 canvas 到布局

        # 设置布局
        self.setLayout(layout)
        
        
   
 
# 创建实例
app = QApplication(sys.argv)
start_window = ExcelAnalyzer()
start_window.show()
sys.exit(app.exec())
        
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-02 18:28
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您遇到的错误提示“index -1 is out of bounds for axis 0 with size 0”确实表明您尝试访问一个空数组的元素。在您的代码中,问题可能出现在priceDialog类中的mpf.plot函数调用中。当dfi为空DataFrame时,尝试绘制图表会导致索引越界错误。

    要解决这个问题,您可以在priceDialog类的initUI方法中添加一个检查,以确保dfi不为空,然后再进行绘图。以下是修改后的代码示例:

    class priceDialog(QDialog):
        def __init__(self, dfi, parent=None):
            super().__init__(parent)
            self.dfi = dfi
            self.initUI()
    
        def initUI(self):
            self.setWindowTitle('价格折线图')
            self.setGeometry(300, 300, 600, 400) 
    
            # 检查dfi是否为空
            if not self.dfi.empty:
                # 创建一个matplotlib图表
                self.fig, self.ax = plt.subplots()  # 修改:使用plt.subplots()创建图表和坐标轴
                self.ax.plot(self.dfi)  # 修改:使用ax.plot()绘制折线图
                self.canvas = FigureCanvasQTAgg(self.fig)
            else:
                # 如果dfi为空,则显示错误信息
                self.label = QLabel("没有找到数据。", self)
                self.label.setStyleSheet("color: red;")
    
            # 创建一个垂直布局并添加图表或错误信息
            layout = QVBoxLayout()
            if not self.dfi.empty:
                layout.addWidget(self.canvas)  # 确保添加 canvas 到布局
            else:
                layout.addWidget(self.label)  # 添加错误信息标签
    
            # 设置布局
            self.setLayout(layout)
    

    请注意,我在这里使用了plt.subplots()来创建图表和坐标轴,并使用ax.plot()来绘制折线图。这是因为mplfinance库的plot函数在处理空DataFrame时可能会引发错误。另外,如果dfi为空,我添加了一个QLabel来显示错误信息。

    关于参考资料,您可以参考以下链接来了解更多关于pandasmatplotlib的使用:

    • Pandas官方文档:https://pandas.pydata.org/docs/
    • Matplotlib官方文档:https://matplotlib.org/stable/contents.html

    这些文档提供了关于如何使用这些库进行数据处理和绘图的详细信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日
  • 创建了问题 6月2日

悬赏问题

  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?
  • ¥15 fluentmeshing
  • ¥15 手机/平板的浏览器里如何实现类似荧光笔的效果
  • ¥15 盘古气象大模型调用(python)
  • ¥15 传人记程序做的plc 485从机程序该如何写
  • ¥15 已知手指抓握过程中掌指关节、手指各关节和指尖每一帧的坐标,用贝塞尔曲线可以拟合手指抓握的运动轨迹吗?