展示一个简单的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)
此处评论已关闭