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