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