eis/py/glitch/flqd.py

64 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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