64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
|
|
import pandas as pd
|
|||
|
|
import numpy as np
|
|||
|
|
|
|||
|
|
class FixedLengthQueueDataFrame(pd.DataFrame):
|
|||
|
|
"""一个固定长度的队列式DataFrame"""
|
|||
|
|
|
|||
|
|
def __init__(self, data=None, max_size=100, **kwargs):
|
|||
|
|
if data is not None and len(data) > max_size:
|
|||
|
|
# 如果初始数据就超过最大长度,只保留最后max_size行
|
|||
|
|
data = data[-max_size:]
|
|||
|
|
super().__init__(data=data, **kwargs)
|
|||
|
|
self._max_size = max_size
|
|||
|
|
|
|||
|
|
# 如果初始化后长度仍超过max_size,进行截断
|
|||
|
|
if len(self) > self._max_size:
|
|||
|
|
self._truncate()
|
|||
|
|
|
|||
|
|
def enqueue(self, item):
|
|||
|
|
"""入队:添加一行新数据"""
|
|||
|
|
# 将新数据(字典)转换为DataFrame,确保列对齐
|
|||
|
|
new_row = pd.DataFrame([item], columns=self.columns)
|
|||
|
|
# 连接DataFrame
|
|||
|
|
updated_df = pd.concat([self, new_row], ignore_index=True)
|
|||
|
|
|
|||
|
|
# 检查长度并截断
|
|||
|
|
if len(updated_df) > self._max_size:
|
|||
|
|
updated_df = updated_df.iloc[-self._max_size:].reset_index(drop=True)
|
|||
|
|
|
|||
|
|
# 直接替换当前DataFrame的数据
|
|||
|
|
self._replace_data(updated_df)
|
|||
|
|
|
|||
|
|
def _truncate(self):
|
|||
|
|
"""如果超过最大长度,截断DataFrame(保留最后max_size行)"""
|
|||
|
|
if len(self) > self._max_size:
|
|||
|
|
# 获取最后max_size行
|
|||
|
|
truncated_data = self.iloc[-self._max_size:].copy().reset_index(drop=True)
|
|||
|
|
self._replace_data(truncated_data)
|
|||
|
|
|
|||
|
|
def _replace_data(self, new_data):
|
|||
|
|
"""替换当前DataFrame的所有数据"""
|
|||
|
|
# 清空当前数据
|
|||
|
|
self.drop(self.index, inplace=True)
|
|||
|
|
# 添加新数据
|
|||
|
|
for idx, row in new_data.iterrows():
|
|||
|
|
self.loc[idx] = row
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 使用示例
|
|||
|
|
# 初始化一个固定长度为5的队列DataFrame
|
|||
|
|
queue_df = FixedLengthQueueDataFrame(columns=['温度', '湿度'], max_size=5)
|
|||
|
|
|
|||
|
|
# 添加数据
|
|||
|
|
for i in range(10):
|
|||
|
|
new_data = {'温度': 20 + i, '湿度': 50 + i}
|
|||
|
|
queue_df.enqueue(new_data)
|
|||
|
|
|
|||
|
|
print("队列当前内容:")
|
|||
|
|
print(queue_df)
|
|||
|
|
print("\n队列大小:", len(queue_df))
|
|||
|
|
|
|||
|
|
# 直接使用所有Pandas统计函数
|
|||
|
|
print("\n描述性统计:")
|
|||
|
|
print(queue_df.describe())
|
|||
|
|
print("\n温度均值:", queue_df['温度'].mean())
|