Source code for spectral.utils.io
"""I/O utilities for loading and saving simulation data."""
from __future__ import annotations
from pathlib import Path
from typing import Literal
import pandas as pd
[docs]
def load_simulation_data(
data_dir: Path | str,
filename_base: str,
prefer: Literal["parquet", "pickle"] = "parquet",
) -> pd.DataFrame:
"""Load simulation data with automatic fallback between parquet and pickle.
Parameters
----------
data_dir : Path or str
Directory containing the data files
filename_base : str
Base filename without extension (e.g., 'kdv_two_soliton')
prefer : {'parquet', 'pickle'}
Preferred format to try first
Returns
-------
pd.DataFrame
Loaded dataframe
Raises
------
FileNotFoundError
If neither parquet nor pickle file exists
"""
data_dir = Path(data_dir)
parquet_path = data_dir / f"{filename_base}.parquet"
pickle_path = data_dir / f"{filename_base}.pkl"
if prefer == "parquet":
primary, secondary = parquet_path, pickle_path
primary_loader, secondary_loader = pd.read_parquet, pd.read_pickle
primary_fmt, secondary_fmt = "parquet", "pickle"
else:
primary, secondary = pickle_path, parquet_path
primary_loader, secondary_loader = pd.read_pickle, pd.read_parquet
primary_fmt, secondary_fmt = "pickle", "parquet"
if primary.exists():
print(f"Loading {primary_fmt} data: {primary}")
return primary_loader(primary)
elif secondary.exists():
print(
f"{primary_fmt.capitalize()} not found; loading {secondary_fmt} data: {secondary}"
)
return secondary_loader(secondary)
else:
raise FileNotFoundError(
f"No dataset found at {data_dir / filename_base}.{{parquet,pkl}}. "
f"Run the corresponding compute script first."
)
[docs]
def save_simulation_data(
df: pd.DataFrame,
output_path: Path | str,
format: Literal["parquet", "pickle"] = "parquet",
) -> None:
"""Save simulation data to disk.
Parameters
----------
df : pd.DataFrame
DataFrame to save
output_path : Path or str
Output file path (should include extension)
format : {'parquet', 'pickle'}
Output format
"""
output_path = Path(output_path)
if format == "parquet":
df.to_parquet(output_path, index=False)
elif format == "pickle":
df.to_pickle(output_path)
else:
raise ValueError(f"Unsupported format: {format}")
print(f"Saved {format} data → {output_path} ({df.shape})")
[docs]
def ensure_output_dir(path: Path | str) -> Path:
"""Ensure output directory exists, creating it if necessary.
Parameters
----------
path : Path or str
Directory path to create
Returns
-------
Path
The created/existing directory path
"""
path = Path(path)
path.mkdir(parents=True, exist_ok=True)
return path