|
1 | 1 | import logging |
2 | 2 |
|
3 | 3 | from pandas import DataFrame, read_feather, to_datetime |
| 4 | +from pyarrow import dataset |
4 | 5 |
|
5 | 6 | from freqtrade.configuration import TimeRange |
6 | 7 | from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS |
@@ -116,17 +117,34 @@ def _trades_load( |
116 | 117 | ) -> DataFrame: |
117 | 118 | """ |
118 | 119 | Load a pair from file, either .json.gz or .json |
119 | | - # TODO: respect timerange ... |
120 | 120 | :param pair: Load trades for this pair |
121 | 121 | :param trading_mode: Trading mode to use (used to determine the filename) |
122 | | - :param timerange: Timerange to load trades for - currently not implemented |
| 122 | + :param timerange: Timerange to load trades for - filters data to this range if provided |
123 | 123 | :return: Dataframe containing trades |
124 | 124 | """ |
125 | 125 | filename = self._pair_trades_filename(self._datadir, pair, trading_mode) |
126 | 126 | if not filename.exists(): |
127 | 127 | return DataFrame(columns=DEFAULT_TRADES_COLUMNS) |
128 | 128 |
|
129 | | - tradesdata = read_feather(filename) |
| 129 | + # Load trades data with optional timerange filtering |
| 130 | + if timerange is None: |
| 131 | + # No timerange filter - load entire file |
| 132 | + logger.debug(f"Loading entire trades file for {pair}") |
| 133 | + tradesdata = read_feather(filename) |
| 134 | + else: |
| 135 | + # Use Arrow dataset with predicate pushdown for efficient filtering |
| 136 | + try: |
| 137 | + dataset_reader = dataset.dataset(filename, format="feather") |
| 138 | + time_filter = (dataset.field("timestamp") >= timerange.startts) & ( |
| 139 | + dataset.field("timestamp") <= timerange.stopts |
| 140 | + ) |
| 141 | + tradesdata = dataset_reader.to_table(filter=time_filter).to_pandas() |
| 142 | + logger.debug(f"Loaded {len(tradesdata)} trades for {pair}") |
| 143 | + |
| 144 | + except (ImportError, AttributeError, ValueError) as e: |
| 145 | + # Fallback: load entire file |
| 146 | + logger.debug(f"Unable to use Arrow filtering, loading entire trades file: {e}") |
| 147 | + tradesdata = read_feather(filename) |
130 | 148 |
|
131 | 149 | return tradesdata |
132 | 150 |
|
|
0 commit comments