incremental_update.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import pandas as pd
  2. class IncrementalUpdater:
  3. def __init__(self, processor):
  4. """
  5. 初始化增量更新模块
  6. :param processor: KlineProcessor 实例
  7. """
  8. self.processor = processor
  9. def update_with_new_kline(self, new_kline):
  10. """
  11. 增量处理新增的 K 线
  12. """
  13. new_kline = pd.DataFrame([new_kline])
  14. self.processor.df = pd.concat([self.processor.df, new_kline], ignore_index=True)
  15. i = len(self.processor.df) - 1
  16. while i > 0:
  17. # 检查包含关系
  18. if (self.processor.df.loc[i, 'High'] <= self.processor.df.loc[i-1, 'High'] and
  19. self.processor.df.loc[i, 'Low'] >= self.processor.df.loc[i-1, 'Low']) or \
  20. (self.processor.df.loc[i, 'High'] >= self.processor.df.loc[i-1, 'High'] and
  21. self.processor.df.loc[i, 'Low'] <= self.processor.df.loc[i-1, 'Low']):
  22. # 找到更早的无包含关系的 K 线
  23. j = i - 1
  24. while j > 0 and \
  25. ((self.processor.df.loc[j, 'High'] <= self.processor.df.loc[j-1, 'High'] and
  26. self.processor.df.loc[j, 'Low'] >= self.processor.df.loc[j-1, 'Low']) or \
  27. (self.processor.df.loc[j, 'High'] >= self.processor.df.loc[j-1, 'High'] and
  28. self.processor.df.loc[j, 'Low'] <= self.processor.df.loc[j-1, 'Low'])):
  29. j -= 1
  30. # 确定处理方向
  31. if self.processor.df.loc[j, 'High'] < self.processor.df.loc[i-1, 'High']:
  32. # 当前包含关系为向上处理
  33. self.processor.df.loc[j, 'High'] = max(self.processor.df.loc[i, 'High'],
  34. self.processor.df.loc[j, 'High'])
  35. self.processor.df.loc[j, 'Low'] = max(self.processor.df.loc[i, 'Low'],
  36. self.processor.df.loc[j, 'Low'])
  37. else:
  38. # 当前包含关系为向下处理
  39. self.processor.df.loc[j, 'High'] = min(self.processor.df.loc[i, 'High'],
  40. self.processor.df.loc[j, 'High'])
  41. self.processor.df.loc[j, 'Low'] = min(self.processor.df.loc[i, 'Low'],
  42. self.processor.df.loc[j, 'Low'])
  43. # 删除当前 K 线
  44. self.processor.df = self.processor.df.drop(index=i).reset_index(drop=True)
  45. else:
  46. break
  47. i -= 1