eis/py/glitch/flqd.py

64 lines
2.3 KiB
Python
Raw Permalink Normal View History

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())