(df: pl.DataFrame)
| 77 | |
| 78 | |
| 79 | def _prepare_ohlcv_lf(df: pl.DataFrame) -> pl.LazyFrame: |
| 80 | frame = _canonicalize_columns(df) |
| 81 | _validate_required_columns(frame) |
| 82 | |
| 83 | lf = frame.lazy().with_columns( |
| 84 | pl.col("ts").cast(pl.Utf8).str.strptime(pl.Datetime, strict=False), |
| 85 | pl.col("symbol").cast(pl.Utf8), |
| 86 | pl.col("open").cast(pl.Float64), |
| 87 | pl.col("high").cast(pl.Float64), |
| 88 | pl.col("low").cast(pl.Float64), |
| 89 | pl.col("close").cast(pl.Float64), |
| 90 | pl.col("volume").cast(pl.Float64), |
| 91 | ) |
| 92 | if "adj_close" in frame.columns: |
| 93 | lf = lf.with_columns(pl.col("adj_close").cast(pl.Float64)) |
| 94 | else: |
| 95 | lf = lf.with_columns(pl.col("close").alias("adj_close")) |
| 96 | return lf.select(CANONICAL_OHLCV_COLUMNS).drop_nulls(CANONICAL_OHLCV_COLUMNS) |
| 97 | |
| 98 | |
| 99 | def _format_ts(v: Any) -> str | None: |
no test coverage detected