ZenoEconomicus
Initial release — Australian Treasury Bond Analytics
f993922
Raw
History Blame Contribute Delete
3.27 kB
import pandas as pd
from typing import List, Dict, Any
class DataLoader:
@staticmethod
def load_bond_data(csv_path: str) -> pd.DataFrame:
"""
Load bond data from a CSV file
Args:
csv_path: Path to the CSV file containing bond data
Returns:
pd.DataFrame: DataFrame containing the bond data
"""
try:
df = pd.read_csv(csv_path)
required_columns = ['ISIN', 'Maturity_Date', 'Coupon_Rate', 'Market_Yield']
# Verify all required columns are present
missing_columns = [col for col in required_columns if col not in df.columns]
if missing_columns:
raise ValueError(f"Missing required columns: {missing_columns}")
return df
except Exception as e:
raise Exception(f"Error loading bond data: {str(e)}")
@staticmethod
def validate_data(df: pd.DataFrame) -> List[Dict[str, Any]]:
"""
Validate the bond data and return any validation errors
Args:
df: DataFrame containing the bond data
Returns:
List[Dict]: List of validation errors with row numbers and error messages
"""
validation_errors = []
for index, row in df.iterrows():
# Check for missing values
for column in df.columns:
if pd.isna(row[column]):
validation_errors.append({
'row': index + 2, # Adding 2 to account for 0-based index and header row
'column': column,
'error': 'Missing value'
})
# Check if coupon rate and market yield are numeric and within reasonable ranges
if not pd.isna(row['Coupon_Rate']):
try:
rate = float(row['Coupon_Rate'])
if not (0 <= rate <= 100):
validation_errors.append({
'row': index + 2,
'column': 'Coupon_Rate',
'error': 'Coupon rate must be between 0 and 100'
})
except ValueError:
validation_errors.append({
'row': index + 2,
'column': 'Coupon_Rate',
'error': 'Invalid numeric value'
})
if not pd.isna(row['Market_Yield']):
try:
rate = float(row['Market_Yield'])
if not (0 <= rate <= 100):
validation_errors.append({
'row': index + 2,
'column': 'Market_Yield',
'error': 'Market yield must be between 0 and 100'
})
except ValueError:
validation_errors.append({
'row': index + 2,
'column': 'Market_Yield',
'error': 'Invalid numeric value'
})
return validation_errors