myTestFreqAI/fix_dataframe_length.py
2025-08-18 03:10:39 +08:00

99 lines
3.1 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.

#!/usr/bin/env python3
"""
修复DataFrame长度不匹配问题的脚本
错误Dataframe returned from strategy has mismatching length
"""
import pandas as pd
import numpy as np
from typing import Dict, Any
import logging
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def validate_dataframe_length(original_df: pd.DataFrame, processed_df: pd.DataFrame, pair: str) -> pd.DataFrame:
"""
验证并修复DataFrame长度不匹配问题
"""
original_len = len(original_df)
processed_len = len(processed_df)
if original_len != processed_len:
logger.warning(f"长度不匹配: {pair} - 原始: {original_len}, 处理后: {processed_len}")
# 确保索引对齐
if processed_len < original_len:
# 重新索引到原始DataFrame的长度
processed_df = processed_df.reindex(original_df.index)
# 填充NaN值
processed_df = processed_df.fillna(0)
elif processed_len > original_len:
# 截断到原始长度
processed_df = processed_df.iloc[:original_len]
return processed_df
def add_length_validation_to_strategy():
"""
为策略添加长度验证代码
"""
validation_code = '''
def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
"""
添加指标 - 包含长度验证
"""
original_length = len(dataframe)
# 保存原始索引
original_index = dataframe.index
# 你的指标计算代码...
# 验证长度
if len(dataframe) != original_length:
logger.warning(f"{metadata.get('pair', 'Unknown')} - DataFrame长度不匹配正在修复...")
dataframe = dataframe.reindex(original_index)
dataframe = dataframe.fillna(0)
return dataframe
def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
"""
入场信号 - 包含长度验证
"""
original_length = len(dataframe)
# 你的入场信号代码...
# 验证长度
if len(dataframe) != original_length:
dataframe = dataframe.reindex(dataframe.index[:original_length])
return dataframe
def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame:
"""
出场信号 - 包含长度验证
"""
original_length = len(dataframe)
# 你的出场信号代码...
# 验证长度
if len(dataframe) != original_length:
dataframe = dataframe.reindex(dataframe.index[:original_length])
return dataframe
'''
return validation_code
if __name__ == "__main__":
# 测试修复
test_df = pd.DataFrame({'close': [1, 2, 3, 4, 5]})
broken_df = pd.DataFrame({'close': [1, 2, 3]})
fixed_df = validate_dataframe_length(test_df, broken_df, "TEST/USDT")
print(f"修复后长度: {len(fixed_df)}")
print("修复代码已生成,请应用到策略中")