import pandas as pd import os import sys import sqlite3 from datetime import datetime, timedelta import asyncio # Добавляем путь к родительской директории sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from classes.moex_history import MOEXHistoricalData from config import sector_tickers class DataLoader: def __init__(self, db_path: str): """ Инициализация загрузчика данных. Args: db_path: Путь к файлу базы данных SQLite """ self.db_path = db_path self.moex_data_handler = MOEXHistoricalData() def _get_connection(self): """ Создает и возвращает соединение с базой данных. Returns: sqlite3.Connection: Объект соединения с базой данных """ return sqlite3.connect(self.db_path) async def load_sector_data(self, sector: str): """ Получение и сохранение исторических данных по сектору. Args: sector: Название сектора """ end_date = datetime.now() start_date = end_date - timedelta(days=730) # За последние 2 года # Получаем данные по официальному секторному индексу sector_df = await self.moex_data_handler.get_official_sector_index( sector, start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d') ) # Сохраняем данные в таблицу with self._get_connection() as conn: sector_df.to_sql(sector, conn, if_exists='replace', index=False) print(f"Данные для сектора '{sector}' сохранены в таблице '{sector}'.") async def load_ticker_data(self, tickers: list): """ Получение и сохранение исторических данных по тикерам. Args: tickers: Список тикеров """ end_date = datetime.now() start_date = end_date - timedelta(days=730) # За последние 2 года tasks = [] for ticker in tickers: task = self.moex_data_handler.get_security_history( ticker, start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d') ) tasks.append(task) results = await asyncio.gather(*tasks) with self._get_connection() as conn: for ticker, df in zip(tickers, results): df.to_sql(ticker, conn, if_exists='replace', index=False) print(f"Данные для тикера '{ticker}' сохранены в таблице '{ticker}'.") async def load_data(self, sector: str, tickers: list): """ Загрузка данных по сектору и тикерам. Args: sector: Название сектора tickers: Список тикеров """ await asyncio.gather( self.load_sector_data(sector), self.load_ticker_data(tickers) ) # Пример использования if __name__ == "__main__": db_path = 'moex_data.db' # Путь к файлу базы данных SQLite data_loader = DataLoader(db_path) for sector in sector_tickers.keys(): asyncio.run(data_loader.load_data(sector, sector_tickers[sector]))