Really-amin commited on
Commit
f86205e
·
verified ·
1 Parent(s): 4dcbbcb

Delete backend/services/dataset_loader.py

Browse files
Files changed (1) hide show
  1. backend/services/dataset_loader.py +0 -438
backend/services/dataset_loader.py DELETED
@@ -1,438 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- HuggingFace Dataset Loader - Direct Loading
4
- Loads cryptocurrency datasets directly from Hugging Face
5
- """
6
-
7
- import logging
8
- import os
9
- from typing import Dict, Any, Optional, List
10
- from datetime import datetime
11
- import pandas as pd
12
- from pathlib import Path
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- # Try to import datasets
17
- try:
18
- from datasets import load_dataset, Dataset, DatasetDict
19
- DATASETS_AVAILABLE = True
20
- except ImportError:
21
- DATASETS_AVAILABLE = False
22
- logger.error("❌ Datasets library not available. Install with: pip install datasets")
23
-
24
-
25
- class CryptoDatasetLoader:
26
- """
27
- Direct Cryptocurrency Dataset Loader
28
- Loads crypto datasets from Hugging Face without using pipelines
29
- """
30
-
31
- def __init__(self, cache_dir: Optional[str] = None):
32
- """
33
- Initialize Dataset Loader
34
-
35
- Args:
36
- cache_dir: Directory to cache datasets (default: ~/.cache/huggingface/datasets)
37
- """
38
- if not DATASETS_AVAILABLE:
39
- logger.warning("⚠️ Dataset Loader disabled: datasets library not available")
40
- self.enabled = False
41
- else:
42
- self.enabled = True
43
-
44
- self.cache_dir = cache_dir or os.path.expanduser("~/.cache/huggingface/datasets")
45
- self.datasets = {}
46
-
47
- logger.info(f"🚀 Crypto Dataset Loader initialized")
48
- logger.info(f" Cache directory: {self.cache_dir}")
49
-
50
- # Dataset configurations
51
- self.dataset_configs = {
52
- "cryptocoin": {
53
- "dataset_id": "linxy/CryptoCoin",
54
- "description": "CryptoCoin dataset by Linxy",
55
- "loaded": False
56
- },
57
- "bitcoin_btc_usdt": {
58
- "dataset_id": "WinkingFace/CryptoLM-Bitcoin-BTC-USDT",
59
- "description": "Bitcoin BTC-USDT market data",
60
- "loaded": False
61
- },
62
- "ethereum_eth_usdt": {
63
- "dataset_id": "WinkingFace/CryptoLM-Ethereum-ETH-USDT",
64
- "description": "Ethereum ETH-USDT market data",
65
- "loaded": False
66
- },
67
- "solana_sol_usdt": {
68
- "dataset_id": "WinkingFace/CryptoLM-Solana-SOL-USDT",
69
- "description": "Solana SOL-USDT market data",
70
- "loaded": False
71
- },
72
- "ripple_xrp_usdt": {
73
- "dataset_id": "WinkingFace/CryptoLM-Ripple-XRP-USDT",
74
- "description": "Ripple XRP-USDT market data",
75
- "loaded": False
76
- }
77
- }
78
-
79
- async def load_dataset(
80
- self,
81
- dataset_key: str,
82
- split: Optional[str] = None,
83
- streaming: bool = False
84
- ) -> Dict[str, Any]:
85
- """
86
- Load a specific dataset directly
87
-
88
- Args:
89
- dataset_key: Key of the dataset to load
90
- split: Dataset split to load (train, test, validation, etc.)
91
- streaming: Whether to stream the dataset
92
-
93
- Returns:
94
- Status dict with dataset info
95
- """
96
- if dataset_key not in self.dataset_configs:
97
- raise ValueError(f"Unknown dataset: {dataset_key}")
98
-
99
- config = self.dataset_configs[dataset_key]
100
-
101
- # Check if already loaded
102
- if dataset_key in self.datasets:
103
- logger.info(f"✅ Dataset {dataset_key} already loaded")
104
- config["loaded"] = True
105
- return {
106
- "success": True,
107
- "dataset_key": dataset_key,
108
- "dataset_id": config["dataset_id"],
109
- "status": "already_loaded",
110
- "num_rows": len(self.datasets[dataset_key]) if hasattr(self.datasets[dataset_key], "__len__") else "unknown"
111
- }
112
-
113
- try:
114
- logger.info(f"📥 Loading dataset: {config['dataset_id']}")
115
-
116
- # Load dataset directly
117
- dataset = load_dataset(
118
- config["dataset_id"],
119
- split=split,
120
- cache_dir=self.cache_dir,
121
- streaming=streaming
122
- )
123
-
124
- # Store dataset
125
- self.datasets[dataset_key] = dataset
126
- config["loaded"] = True
127
-
128
- # Get dataset info
129
- if isinstance(dataset, Dataset):
130
- num_rows = len(dataset)
131
- columns = dataset.column_names
132
- elif isinstance(dataset, DatasetDict):
133
- num_rows = {split: len(dataset[split]) for split in dataset.keys()}
134
- columns = list(dataset[list(dataset.keys())[0]].column_names)
135
- else:
136
- num_rows = "unknown"
137
- columns = []
138
-
139
- logger.info(f"✅ Dataset loaded successfully: {config['dataset_id']}")
140
-
141
- return {
142
- "success": True,
143
- "dataset_key": dataset_key,
144
- "dataset_id": config["dataset_id"],
145
- "status": "loaded",
146
- "num_rows": num_rows,
147
- "columns": columns,
148
- "streaming": streaming
149
- }
150
-
151
- except Exception as e:
152
- logger.error(f"❌ Failed to load dataset {dataset_key}: {e}")
153
- raise Exception(f"Failed to load dataset {dataset_key}: {str(e)}")
154
-
155
- async def load_all_datasets(self, streaming: bool = False) -> Dict[str, Any]:
156
- """
157
- Load all configured datasets
158
-
159
- Args:
160
- streaming: Whether to stream the datasets
161
-
162
- Returns:
163
- Status dict with all datasets
164
- """
165
- results = []
166
- success_count = 0
167
-
168
- for dataset_key in self.dataset_configs.keys():
169
- try:
170
- result = await self.load_dataset(dataset_key, streaming=streaming)
171
- results.append(result)
172
- if result["success"]:
173
- success_count += 1
174
- except Exception as e:
175
- logger.error(f"❌ Failed to load {dataset_key}: {e}")
176
- results.append({
177
- "success": False,
178
- "dataset_key": dataset_key,
179
- "error": str(e)
180
- })
181
-
182
- return {
183
- "success": True,
184
- "total_datasets": len(self.dataset_configs),
185
- "loaded_datasets": success_count,
186
- "failed_datasets": len(self.dataset_configs) - success_count,
187
- "results": results,
188
- "timestamp": datetime.utcnow().isoformat()
189
- }
190
-
191
- async def get_dataset_sample(
192
- self,
193
- dataset_key: str,
194
- num_samples: int = 10,
195
- split: Optional[str] = None
196
- ) -> Dict[str, Any]:
197
- """
198
- Get sample rows from a dataset
199
-
200
- Args:
201
- dataset_key: Key of the dataset
202
- num_samples: Number of samples to return
203
- split: Dataset split to sample from
204
-
205
- Returns:
206
- Sample data
207
- """
208
- # Ensure dataset is loaded
209
- if dataset_key not in self.datasets:
210
- await self.load_dataset(dataset_key, split=split)
211
-
212
- try:
213
- dataset = self.datasets[dataset_key]
214
-
215
- # Handle different dataset types
216
- if isinstance(dataset, DatasetDict):
217
- # Get first split if not specified
218
- split_to_use = split or list(dataset.keys())[0]
219
- dataset = dataset[split_to_use]
220
-
221
- # Get samples
222
- samples = dataset.select(range(min(num_samples, len(dataset))))
223
-
224
- # Convert to list of dicts
225
- samples_list = [dict(sample) for sample in samples]
226
-
227
- logger.info(f"✅ Retrieved {len(samples_list)} samples from {dataset_key}")
228
-
229
- return {
230
- "success": True,
231
- "dataset_key": dataset_key,
232
- "dataset_id": self.dataset_configs[dataset_key]["dataset_id"],
233
- "num_samples": len(samples_list),
234
- "samples": samples_list,
235
- "columns": list(samples_list[0].keys()) if samples_list else [],
236
- "timestamp": datetime.utcnow().isoformat()
237
- }
238
-
239
- except Exception as e:
240
- logger.error(f"❌ Failed to get samples from {dataset_key}: {e}")
241
- raise Exception(f"Failed to get samples: {str(e)}")
242
-
243
- async def query_dataset(
244
- self,
245
- dataset_key: str,
246
- filters: Optional[Dict[str, Any]] = None,
247
- limit: int = 100
248
- ) -> Dict[str, Any]:
249
- """
250
- Query dataset with filters
251
-
252
- Args:
253
- dataset_key: Key of the dataset
254
- filters: Dictionary of column filters
255
- limit: Maximum number of results
256
-
257
- Returns:
258
- Filtered data
259
- """
260
- # Ensure dataset is loaded
261
- if dataset_key not in self.datasets:
262
- await self.load_dataset(dataset_key)
263
-
264
- try:
265
- dataset = self.datasets[dataset_key]
266
-
267
- # Handle DatasetDict
268
- if isinstance(dataset, DatasetDict):
269
- dataset = dataset[list(dataset.keys())[0]]
270
-
271
- # Apply filters if provided
272
- if filters:
273
- for column, value in filters.items():
274
- dataset = dataset.filter(lambda x: x[column] == value)
275
-
276
- # Limit results
277
- result_dataset = dataset.select(range(min(limit, len(dataset))))
278
-
279
- # Convert to list of dicts
280
- results = [dict(row) for row in result_dataset]
281
-
282
- logger.info(f"✅ Query returned {len(results)} results from {dataset_key}")
283
-
284
- return {
285
- "success": True,
286
- "dataset_key": dataset_key,
287
- "filters_applied": filters or {},
288
- "count": len(results),
289
- "results": results,
290
- "timestamp": datetime.utcnow().isoformat()
291
- }
292
-
293
- except Exception as e:
294
- logger.error(f"❌ Failed to query dataset {dataset_key}: {e}")
295
- raise Exception(f"Failed to query dataset: {str(e)}")
296
-
297
- async def get_dataset_stats(self, dataset_key: str) -> Dict[str, Any]:
298
- """
299
- Get statistics about a dataset
300
-
301
- Args:
302
- dataset_key: Key of the dataset
303
-
304
- Returns:
305
- Dataset statistics
306
- """
307
- # Ensure dataset is loaded
308
- if dataset_key not in self.datasets:
309
- await self.load_dataset(dataset_key)
310
-
311
- try:
312
- dataset = self.datasets[dataset_key]
313
-
314
- # Handle DatasetDict
315
- if isinstance(dataset, DatasetDict):
316
- splits_info = {}
317
- for split_name, split_dataset in dataset.items():
318
- splits_info[split_name] = {
319
- "num_rows": len(split_dataset),
320
- "columns": split_dataset.column_names,
321
- "features": str(split_dataset.features)
322
- }
323
-
324
- return {
325
- "success": True,
326
- "dataset_key": dataset_key,
327
- "dataset_id": self.dataset_configs[dataset_key]["dataset_id"],
328
- "type": "DatasetDict",
329
- "splits": splits_info,
330
- "timestamp": datetime.utcnow().isoformat()
331
- }
332
- else:
333
- return {
334
- "success": True,
335
- "dataset_key": dataset_key,
336
- "dataset_id": self.dataset_configs[dataset_key]["dataset_id"],
337
- "type": "Dataset",
338
- "num_rows": len(dataset),
339
- "columns": dataset.column_names,
340
- "features": str(dataset.features),
341
- "timestamp": datetime.utcnow().isoformat()
342
- }
343
-
344
- except Exception as e:
345
- logger.error(f"❌ Failed to get stats for {dataset_key}: {e}")
346
- raise Exception(f"Failed to get dataset stats: {str(e)}")
347
-
348
- def get_loaded_datasets(self) -> Dict[str, Any]:
349
- """
350
- Get list of loaded datasets
351
-
352
- Returns:
353
- Dict with loaded datasets info
354
- """
355
- datasets_info = []
356
- for dataset_key, config in self.dataset_configs.items():
357
- info = {
358
- "dataset_key": dataset_key,
359
- "dataset_id": config["dataset_id"],
360
- "description": config["description"],
361
- "loaded": dataset_key in self.datasets
362
- }
363
-
364
- # Add size info if loaded
365
- if dataset_key in self.datasets:
366
- dataset = self.datasets[dataset_key]
367
- if isinstance(dataset, DatasetDict):
368
- info["num_rows"] = {split: len(dataset[split]) for split in dataset.keys()}
369
- elif hasattr(dataset, "__len__"):
370
- info["num_rows"] = len(dataset)
371
- else:
372
- info["num_rows"] = "unknown"
373
-
374
- datasets_info.append(info)
375
-
376
- return {
377
- "success": True,
378
- "total_configured": len(self.dataset_configs),
379
- "total_loaded": len(self.datasets),
380
- "datasets": datasets_info,
381
- "timestamp": datetime.utcnow().isoformat()
382
- }
383
-
384
- def unload_dataset(self, dataset_key: str) -> Dict[str, Any]:
385
- """
386
- Unload a specific dataset from memory
387
-
388
- Args:
389
- dataset_key: Key of the dataset to unload
390
-
391
- Returns:
392
- Status dict
393
- """
394
- if dataset_key not in self.datasets:
395
- return {
396
- "success": False,
397
- "dataset_key": dataset_key,
398
- "message": "Dataset not loaded"
399
- }
400
-
401
- try:
402
- # Remove dataset
403
- del self.datasets[dataset_key]
404
-
405
- # Update config
406
- self.dataset_configs[dataset_key]["loaded"] = False
407
-
408
- logger.info(f"✅ Dataset unloaded: {dataset_key}")
409
-
410
- return {
411
- "success": True,
412
- "dataset_key": dataset_key,
413
- "message": "Dataset unloaded successfully"
414
- }
415
-
416
- except Exception as e:
417
- logger.error(f"❌ Failed to unload dataset {dataset_key}: {e}")
418
- return {
419
- "success": False,
420
- "dataset_key": dataset_key,
421
- "error": str(e)
422
- }
423
-
424
-
425
- # Global instance - only create if datasets is available
426
- crypto_dataset_loader = None
427
- if DATASETS_AVAILABLE:
428
- try:
429
- crypto_dataset_loader = CryptoDatasetLoader()
430
- except Exception as e:
431
- logger.warning(f"Failed to initialize CryptoDatasetLoader: {e}")
432
- crypto_dataset_loader = None
433
- else:
434
- logger.warning("CryptoDatasetLoader not available - datasets library not installed")
435
-
436
-
437
- # Export
438
- __all__ = ["CryptoDatasetLoader", "crypto_dataset_loader"]