Spaces:
Sleeping
Sleeping
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 | |