- Добавлен yfinance в requirements.txt - Расширен .gitignore для исключения служебных файлов Python - Исправлен импорт в currency.py для корректной работы с модулями
101 lines
3.7 KiB
Python
101 lines
3.7 KiB
Python
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])) |