展示一个简单的python类的写法。

例如这个环境监测数据的可视化,之前写的代码是「面向过程」的风格。这种风格的特点是以函数为基本执行单元,从前到后把各种函数组织起一个流程处理完既定的任务即可。

但一个有高复用需求的项目最好都是以「面向对象」的风格来写代码。其风格特点就是以对象为基本单元。对象同时拥有「属性」(或者说数据)和「方法」(或者说函数)。对象还可以继承,如果有新的需求随时可以轻松地增加新的属性和方法,以满足不同任务的需求。

所以这里还是封装成一个 class,以减少代码复用的成本。封装后的代码如下:

import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
import seaborn as sns
import requests 
import os


class EMV():
    '''EMV = Environment Monitor Visualiazation
    用于sheldonxxd自制环境监测仪采集数据的下载,整理和可视化分析
    '''
    def __init__(self):
        self.remote_file = 'https://yourwebsite.cn/recs.txt'
        self.local_file = "recs.txt"

    def download(self):
        '''下载数据到本地'''
        url = self.remote_file
        r = requests.get(url)
        with open(self.local_file, 'wb') as f:
            f.write(r.content)
    
    def read(self):
        '''读取全部数据'''
        assert os.path.exists(self.local_file)
        with open("messages.txt") as f:
            lines = f.readlines()
        box = []
        for a in lines:
            b = a.strip()
            cs =b.split(" ")
            if len(cs)==3:
                date = cs[0]
                time = cs[1]
                info = cs[2]
                ds = info.split("_")
                if len(ds)==5:
                    temp = float(ds[0])
                    humid = int(ds[1])
                    CO2 = int(ds[2])
                    TVOC = int(ds[3])
                    device = ds[4]
                    box.append([device, 
                                temp, 
                                humid, 
                                CO2, 
                                TVOC, 
                                datetime.fromisoformat(date+ " "+time)])
        self.data = pd.DataFrame(box, 
                                 columns=['device', 
                                          'temperature', 
                                          'humidity', 
                                          'CO2', 
                                          'TVOC', 
                                          'time']) 
    
    def display(self, start:str, end:str):
        '''监测数据作图
        start: 数据开始日期时间
        end: 数据结束日期时间
        日期时间格式:如"2024-09-15 07:19:00"
        '''
        data = self.data 
        data2 = data[(data['time']>datetime.fromisoformat(start))&\
             (data['time']<datetime.fromisoformat(end))
             ]
        plt.figure(figsize=(14,4))
        plt.subplot(221)
        sns.lineplot(x='time', y='temperature', c='red', data=data2)
        plt.ylabel('Temperature (℃)')
        plt.xticks(rotation=5)

        plt.subplot(222)
        sns.lineplot(x='time', y='humidity', c='blue', data=data2)
        plt.ylabel('Humidity (%)')
        plt.xticks(rotation=5)

        plt.subplot(223)
        sns.lineplot(x='time', y='CO2', c='green', data=data2)
        plt.ylabel('$CO_{2}$ (ppm)')
        plt.xticks(rotation=5)

        plt.subplot(224)
        sns.lineplot(x='time', y='TVOC', c='orange', data=data2)
        plt.ylabel("TVOC (ppb)")
        plt.xticks(rotation=5)

        plt.tight_layout()
        plt.show()


if __name__=='__main__':
    start = "2024-09-15 07:19:00"
    end = "2024-09-15 08:00:00"
    hwj = EMV()
    hwj.download()
    hwj.read()
    hwj.display(start, end)
最后修改:2024 年 09 月 15 日
请大力赞赏以支持本站持续运行!