fix: Enhance data validation and debugging in ATR EMA screener
This commit is contained in:
parent
02a26636e3
commit
9f95ee14fc
@ -88,32 +88,55 @@ def run_atr_ema_target_scanner(min_price: float, max_price: float, min_volume: i
|
|||||||
print(f"⚠️ {ticker}: Empty DataFrame")
|
print(f"⚠️ {ticker}: Empty DataFrame")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Ensure DataFrame has required columns and proper types
|
# Debug data
|
||||||
required_columns = ['date', 'open', 'high', 'low', 'close', 'volume']
|
|
||||||
|
|
||||||
# Print column info for debugging
|
|
||||||
print(f"\nProcessing {ticker}")
|
print(f"\nProcessing {ticker}")
|
||||||
print(f"Columns present: {df.columns.tolist()}")
|
print(f"Columns present: {df.columns.tolist()}")
|
||||||
|
print(f"Data types: {df.dtypes}")
|
||||||
|
print(f"First row: {df.iloc[0]}")
|
||||||
|
print(f"Last row: {df.iloc[-1]}")
|
||||||
|
|
||||||
# Convert columns to numeric if needed
|
# Ensure DataFrame has required columns and proper types
|
||||||
|
required_columns = ['date', 'open', 'high', 'low', 'close', 'volume']
|
||||||
|
if not all(col in df.columns for col in required_columns):
|
||||||
|
missing = set(required_columns) - set(df.columns)
|
||||||
|
print(f"⚠️ {ticker}: Missing columns: {missing}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Convert columns to numeric and handle any conversion errors
|
||||||
for col in ['open', 'high', 'low', 'close', 'volume']:
|
for col in ['open', 'high', 'low', 'close', 'volume']:
|
||||||
if col in df.columns:
|
try:
|
||||||
df[col] = pd.to_numeric(df[col], errors='coerce')
|
df[col] = pd.to_numeric(df[col], errors='coerce')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ {ticker}: Error converting {col} to numeric: {str(e)}")
|
||||||
|
print(f"Sample of problematic column: {df[col].head()}")
|
||||||
|
raise ValueError(f"Data conversion error in {col}")
|
||||||
|
|
||||||
# Verify data validity
|
# Verify data validity after conversion
|
||||||
if df['close'].isnull().any():
|
if df['close'].isnull().any():
|
||||||
print(f"⚠️ {ticker}: Contains null values in close price")
|
null_rows = df[df['close'].isnull()]
|
||||||
|
print(f"⚠️ {ticker}: Contains {len(null_rows)} null values in close price")
|
||||||
|
print("First few null rows:")
|
||||||
|
print(null_rows.head())
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if len(df) < 50:
|
if len(df) < 50:
|
||||||
print(f"⚠️ {ticker}: Insufficient data points ({len(df)})")
|
print(f"⚠️ {ticker}: Insufficient data points ({len(df)})")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Calculate indicator with validated data
|
# Make a clean copy for indicator calculation
|
||||||
results = indicator.calculate(df.copy()) # Use copy to prevent modifications
|
calc_df = df.copy()
|
||||||
|
|
||||||
if results.empty:
|
# Calculate indicator with validated data
|
||||||
print(f"⚠️ {ticker}: No valid indicator results")
|
try:
|
||||||
|
results = indicator.calculate(calc_df)
|
||||||
|
if results.empty:
|
||||||
|
print(f"⚠️ {ticker}: No valid indicator results")
|
||||||
|
continue
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ {ticker}: Error calculating indicator:")
|
||||||
|
print(f"Error details: {str(e)}")
|
||||||
|
print(f"Data shape: {calc_df.shape}")
|
||||||
|
print(f"Sample data:\n{calc_df.head()}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
results = indicator.calculate(df)
|
results = indicator.calculate(df)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user