PyQt개발강좌, 데이터 필터링과 커스텀 플롯

PyQt는 Python을 위한 Qt 라이브러리로서, 다양한 GUI 응용 프로그램을 쉽게 개발할 수 있는 강력한 도구입니다. 본 강좌에서는 PyQt를 사용하여 데이터 필터링과 커스텀 플롯을 만드는 방법을 알아보겠습니다. 데이터 분석과 시각화는 현대 소프트웨어 개발에서 중요한 부분으로, 이 강좌를 통해 여러분은 실제 어플리케이션에서 유용하게 사용할 수 있는 기술을 배우게 될 것입니다.

1. PyQt 소개

PyQt는 PyQt5와 PyQt6로 나뉘며, 각각 Qt5와 Qt6을 기반으로 합니다. 이 프레임워크는 다양한 위젯, 레이아웃, 그리고 시그널과 슬롯 메커니즘을 제공하여 GUI를 쉽게 구축할 수 있도록 도와줍니다.

2. 데이터 필터링

데이터 필터링은 대량의 정보를 사용자가 이해할 수 있는 형식으로 정제하는 과정입니다. 이를 통해 사용자는 관심 있는 데이터만을 선택하고, 데이터 분석에 집중할 수 있습니다. 본 예제에서는 Pandas와 PyQt를 활용하여 데이터 필터링 기능을 구현합니다.

2.1 데이터 준비

먼저 간단한 샘플 데이터를 생성합니다. 데이터를 CSV 파일로 저장하여 Pandas를 통해 불러올 것입니다.

import pandas as pd

data = {
    '이름': ['홍길동', '김철수', '이영희', '박지민'],
    '나이': [25, 32, 28, 35],
    '점수': [88, 92, 95, 85]
}

df = pd.DataFrame(data)
df.to_csv('sample_data.csv', index=False)

2.2 PyQt 애플리케이션 구조

이제 PyQt를 사용하여 GUI를 설계하고, 사용자가 입력한 값에 따라 데이터를 필터링할 수 있는 기능을 구현하겠습니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QLineEdit, QPushButton, QTextEdit
import pandas as pd

class FilterApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('데이터 필터링 애플리케이션')
        
        self.df = pd.read_csv('sample_data.csv')

        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        
        self.label = QLabel('나이로 필터링: ')
        self.input_age = QLineEdit()
        self.button = QPushButton('필터링')
        self.result_area = QTextEdit()
        
        self.button.clicked.connect(self.filter_data)
        
        layout.addWidget(self.label)
        layout.addWidget(self.input_age)
        layout.addWidget(self.button)
        layout.addWidget(self.result_area)
        
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def filter_data(self):
        age = self.input_age.text()
        filtered_data = self.df[self.df['나이'] == int(age)]
        self.result_area.setText(filtered_data.to_string(index=False))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = FilterApp()
    mainWin.show()
    sys.exit(app.exec_())

위 코드는 사용자가 나이를 입력할 수 있는 QLineEdit와 필터링 버튼을 제공하여 입력된 나이에 해당하는 데이터만을 표시하는 간단한 애플리케이션입니다.

3. 커스텀 플롯

데이터를 시각화하는 것은 매우 중요한 작업입니다. 우리가 만든 데이터 필터링 애플리케이션을 확장하여 matplotlib를 사용해 필터링된 데이터를 시각화하는 기능을 추가해보겠습니다.

3.1 matplotlib 설치

pip install matplotlib

3.2 커스텀 플롯 구현

기존 애플리케이션에 그래프를 추가하기 위해 아래와 같이 코드를 수정합니다.

from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QLineEdit, QPushButton, QTextEdit, QHBoxLayout
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

# 다른 코드 생략...

class FilterApp(QMainWindow):
    # 이전 코드 생략...

    def initUI(self):
        layout = QVBoxLayout()
        
        self.label = QLabel('나이로 필터링: ')
        self.input_age = QLineEdit()
        self.button = QPushButton('필터링')
        self.result_area = QTextEdit()
        
        self.button.clicked.connect(self.filter_data)
        
        layout.addWidget(self.label)
        layout.addWidget(self.input_age)
        layout.addWidget(self.button)
        layout.addWidget(self.result_area)

        # matplotlib FigureCanvas 추가
        self.figure = plt.Figure()
        self.canvas = FigureCanvas(self.figure)
        layout.addWidget(self.canvas)

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

    def filter_data(self):
        age = self.input_age.text()
        filtered_data = self.df[self.df['나이'] == int(age)]
        self.result_area.setText(filtered_data.to_string(index=False))

        # 커스텀 플롯 생성
        self.figure.clear()
        ax = self.figure.add_subplot(111)
        ax.bar(filtered_data['이름'], filtered_data['점수'])
        ax.set_title('점수 시각화')
        ax.set_xlabel('이름')
        ax.set_ylabel('점수')
        self.canvas.draw()

# main 부분 생략...

4. 결론

이번 강좌에서는 PyQt를 이용하여 데이터 필터링과 커스텀 플롯을 구현하는 방법을 살펴보았습니다. 이 기술들은 데이터 분석 및 시각화 실무에서 매우 유용하며, 여러분의 실제 프로젝트에 적용할 수 있습니다. 앞으로도 다양한 기능을 추가해가며 PyQt에 대한 이해를 더욱 깊이 쌓아나가길 바랍니다.

감사합니다. 다음 강좌에서도 유익한 내용으로 찾아뵙겠습니다!