myfirspace / stock_and.py
KotVasily's picture
Add application file
d39b93e
raw
history blame
3.92 kB
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