import pandas as pd import requests import time import apimoex from datetime import datetime, timedelta from news import NewsData class GetNewData: def __init__(self, stock_name) -> None: """Этот класс парсит данные""" self.news = NewsData() self.stock_name = stock_name # Название акции def downolad_stock(self): # Исправляем название акции, просто акция поменяла свое названия if self.stock_name == 'YNDX': self.stock_name = 'YDEX' # Тут мы будем делать до 5 итерацыя, если возниканет ошибка с сервером московской биржы, иногда он просто не находит акции for _ in range(5): try: # Дата с которой будет начинатся наш датасет new_date = datetime.now().replace(minute=0, second=0, microsecond=0) - timedelta(days=24*30) new_date = str(new_date.strftime('%Y-%m-%d %H:%M')) # Запросы к московской бирже, и создания датасета with requests.Session() as session: # Получаем данные с биржи market_data = apimoex.get_board_candles(session, security=self.stock_name, market='shares', columns=['close', 'begin', 'volume'], start=new_date, interval=60) df = pd.DataFrame(market_data) df.columns = ['CLOSE', 'DATE', 'VOL'] df['DATE'] = pd.to_datetime(df['DATE']) df['day'] = df['DATE'].dt.day df['year'] = df['DATE'].dt.year df['month'] = df['DATE'].dt.month df['hour'] = df['DATE'].dt.hour # Генерим лаги для модели for i in range(1, 10+1): df[f'lag_{i+24}'] = df['CLOSE'].shift(i) df['lag_24'] = df['CLOSE'] break except: # Если возникнет ошибка, то мы будем ждать 5 секунд и повторять все действия снова time.sleep(5) return df def get_full_data(self): """Функция для получения полного датасета""" articles_data = self.news.get_data() # Получаем данные о новостями stock = self.downolad_stock() # Получаем данные о биржи # Обеденяем датасеты news_ = articles_data.drop(columns=['DATE']).groupby(['day', 'month', 'year', 'hour']).agg({ 'sentiment_negative': 'mean', 'sentiment_neutral': 'mean', 'sentiment_positive': 'mean', 'url': lambda x: list(x), 'title': lambda x: list(x) }).reset_index() merged_df = pd.merge(stock, news_, how='left', on=['year', 'month', 'day', 'hour'], suffixes=('', '_y')).bfill().ffill() merged_df = merged_df.sort_values(by=['DATE']) # Расчитываем важность статей merged_df['super'] = merged_df['sentiment_positive'] + merged_df['sentiment_neutral'] string = '' string += '\n Самые полезные статьи для прогнозов: \n' for url, v, title in merged_df[-72:].sort_values('super', ascending=False)[['url', 'super', 'title']].values[:10]: for u, t in zip(url, title): string += f'- [New: {t}]({u}), важность признака: {v} \n' return merged_df, string