ali_ssssa 2024-06-02 18:35 采纳率: 9.1%
浏览 0

我这里的dfi表为什么为空?

为什么我的dfi表为空?


```python

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.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)  # 添加错误信息标签
 





```

  • 写回答

3条回答 默认 最新

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

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


    根据您提供的代码和问题描述,以下是可能导致dfi表为空的几个原因,以及相应的解决建议:

    1. Excel文件中数据的准确性

      • 确保Excel文件中确实存在数据,并且股票代码列的名称与代码中的'股票代码'相匹配。
      • 检查Excel文件中的数据格式是否正确,特别是股票代码是否为文本格式。
    2. pd.read_excel(filename)读取文件

      • 检查loadExcelData方法中pd.read_excel(filename)是否成功执行,并且DataFrame df不是空的。
      • 可以在loadExcelData方法中添加打印语句,例如print(df.head()),来查看读取的DataFrame的前几行数据。
    3. on_search_clicked方法中的代码执行

      • 确保SearchScreen类中的on_search_clicked方法正确执行,并且code变量是否与Excel文件中的股票代码格式一致。
      • 检查code变量是否正确转换为字符串,例如,如果Excel中的股票代码是1001,确保在on_search_clicked方法中code变量也是'1001'
    4. individual方法筛选数据

      • 检查show_details类中的individual方法是否正确地筛选出了数据。
      • 可以在individual方法中添加打印语句,例如print(dfi.head()),来查看筛选后的DataFrame的前几行数据。
    5. priceDialog类中的错误信息显示

      • 确保当dfi为空时,priceDialog类中的initUI方法能够正确显示错误信息。
      • 检查initUI方法中的条件判断是否正确,以及是否正确地添加了错误信息标签。
    6. 代码逻辑错误

      • 检查individual方法中筛选DataFrame的逻辑是否正确。例如,确保使用的是self.df而不是局部变量df
    7. 代码实现

      • 您提供的代码中,individual方法在show_details类中定义,但在priceDialog类中也使用了dfi变量。请确保在show_details类中正确设置了dfi变量,并在priceDialog中正确引用。
    8. 参考资料

    通过以上步骤,您应该能够定位问题所在,并采取相应的措施进行修复。如果问题仍然存在,建议逐步调试代码,检查每个环节的输出,以进一步缩小问题范围。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥15 俄罗斯方块中无法同时消除多个满行
  • ¥15 c#转安卓 java html
  • ¥15 os.listdir文件路径找不到
  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低
  • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777
  • ¥50 医院HIS系统代码、逻辑学习
  • ¥30 docker离线安装mysql报错,如何解决?
  • ¥15 构建工单的总账影响在哪里查询或修改
  • ¥15 三个简单项目写完之后有重赏之后联系我