borsa / data /utils.py
onerozbey
Add missing API endpoints: stocks, movers, scanner, backtest, sentiment, news
32f16c2
import streamlit as st
import logging
import traceback
from datetime import datetime, timedelta
import pytz
import random
from data.announcements import get_all_announcements, add_announcement, get_session_announcements, delete_announcement, format_time_ago
from data.db_utils import (
save_analysis_result as db_save_analysis_result,
get_analysis_results,
save_favorite_stock,
remove_favorite_stock,
is_favorite_stock,
get_favorite_stocks,
save_ml_prediction,
get_ml_predictions,
update_ml_prediction_result,
get_ml_prediction_stats,
save_announcement,
get_announcements,
delete_announcement as db_delete_announcement,
save_user_note,
get_user_notes,
create_database,
save_ml_model,
load_ml_model,
get_model_update_status
)
# Loglama yapılandırması
logger = logging.getLogger(__name__)
# Veritabanını başlangıçta oluştur
try:
create_database()
except Exception as e:
logger.error(f"Veritabanı oluşturulurken hata: {str(e)}")
def save_analysis_result(stock_symbol, analysis_data, analysis_type=None, price=None, indicators=None, notes=None):
"""
Belirli bir hisse senedi için yapılan analiz sonucunu depolar.
Args:
stock_symbol (str): Hisse senedi sembolü
analysis_data (dict): Analiz sonuç verisi
analysis_type (str, optional): Analiz tipi, belirtilmezse veri içinden alınır
price (float, optional): Hisse fiyatı, belirtilmezse veri içinden alınır
indicators (dict, optional): Teknik göstergeler
notes (str, optional): Notlar
"""
try:
# Tarihi ekle
now = datetime.now()
analysis_data["analysis_time"] = now.strftime("%d.%m.%Y %H:%M")
# Backward compatibility - session state'e de kaydet
if 'stock_analysis_results' not in st.session_state:
st.session_state.stock_analysis_results = {}
# Session state'e kaydet
st.session_state.stock_analysis_results[stock_symbol] = analysis_data
# Analiz geçmişine ekle (eğer yoksa)
if 'analysis_history' not in st.session_state:
st.session_state.analysis_history = []
# Zaten varsa önce kaldır (hisse senedi sembolü aynı olduğunda)
if stock_symbol in st.session_state.analysis_history:
st.session_state.analysis_history.remove(stock_symbol)
# Listeye en başa ekle
st.session_state.analysis_history.insert(0, stock_symbol)
# Maksimum 20 kayıt tut
if len(st.session_state.analysis_history) > 20:
st.session_state.analysis_history = st.session_state.analysis_history[:20]
# Veritabanına kaydet - parametreleri kontrol et
if analysis_type is None:
analysis_type = analysis_data.get("analysis_type", "teknik")
if price is None:
# Önce last_price'ı kontrol et (ML için)
price = analysis_data.get("last_price", None)
# Eğer yoksa current_price'ı dene
if price is None:
price = analysis_data.get("current_price", 0)
if indicators is None:
indicators = analysis_data.get("indicators", {})
if notes is None:
notes = analysis_data.get("notes", "")
# Veritabanına kaydet (kalıcı depolama)
db_result = db_save_analysis_result(
stock_symbol,
analysis_type,
price,
analysis_data,
indicators,
notes
)
logger.info(f"{stock_symbol} için analiz sonucu başarıyla kaydedildi")
return db_result
except Exception as e:
logger.error(f"Analiz sonucu kaydedilirken hata: {str(e)}")
logger.error(traceback.format_exc())
return False
def get_analysis_result(stock_symbol):
"""
Belirli bir hisse senedi için kaydedilmiş analiz sonucunu getirir.
Args:
stock_symbol (str): Hisse senedi sembolü
Returns:
dict: Analiz sonuç verisi, yoksa None
"""
try:
# Önce veritabanından getir
results = get_analysis_results(stock_symbol, limit=1)
if results and len(results) > 0:
return results[0]
# Eğer veritabanında yoksa session state'ten kontrol et (eski veriler için)
if 'stock_analysis_results' not in st.session_state:
return None
return st.session_state.stock_analysis_results.get(stock_symbol)
except Exception as e:
logger.error(f"Analiz sonucu alınırken hata: {str(e)}")
logger.error(traceback.format_exc())
return None
def load_analysis_results(analysis_type=None):
"""
Kaydedilmiş tüm analiz sonuçlarını getirir.
Args:
analysis_type (str, optional): Analiz tipi (örn: "teknik", "ml")
Returns:
list: Analiz sonuçlarının listesi
"""
try:
# Doğrudan veritabanından getir
return get_analysis_results(analysis_type=analysis_type)
except Exception as e:
logger.error(f"Analiz sonuçları yüklenirken hata: {str(e)}")
logger.error(traceback.format_exc())
return []
def add_to_favorites(stock_symbol):
"""
Bir hisse senedini favorilere ekler.
Args:
stock_symbol (str): Eklenecek hisse senedi sembolü
Returns:
bool: İşlem başarılıysa True, aksi halde False
"""
try:
# Sembolü düzenle
stock_symbol = stock_symbol.upper().strip()
# Backward compatibility - session state'e de kaydet
if 'favorite_stocks' not in st.session_state:
st.session_state.favorite_stocks = []
if stock_symbol not in st.session_state.favorite_stocks:
st.session_state.favorite_stocks.append(stock_symbol)
# Veritabanına kaydet
result = save_favorite_stock(stock_symbol)
logger.info(f"{stock_symbol} favorilere eklendi")
return result
except Exception as e:
logger.error(f"Favori eklenirken hata: {str(e)}")
logger.error(traceback.format_exc())
return False
def remove_from_favorites(stock_symbol):
"""
Bir hisseyi favorilerden çıkarır.
Args:
stock_symbol (str): Çıkarılacak hisse sembolü
"""
try:
# Backward compatibility - session state'ten de çıkar
if 'favorite_stocks' in st.session_state and stock_symbol in st.session_state.favorite_stocks:
st.session_state.favorite_stocks.remove(stock_symbol)
# Veritabanından çıkar
result = remove_favorite_stock(stock_symbol)
logger.info(f"{stock_symbol} favorilerden çıkarıldı")
return result
except Exception as e:
logger.error(f"Favori çıkarılırken hata: {str(e)}")
return False
def is_favorite(stock_symbol):
"""
Bir hisse senedinin favorilerde olup olmadığını kontrol eder.
Args:
stock_symbol (str): Hisse senedi sembolü
Returns:
bool: Favorilerde ise True, değilse False
"""
return is_favorite_stock(stock_symbol.upper().strip())
def get_favorites():
"""
Tüm favori hisse senetlerini getirir.
Returns:
list: Favori hisse senetlerinin listesi
"""
try:
# Önce veritabanından getir
favorites = get_favorite_stocks()
# Backward compatibility - session state'i de güncelle
if 'favorite_stocks' not in st.session_state:
st.session_state.favorite_stocks = []
# Session state'teki favorilerle senkronize et
for favorite in favorites:
if favorite not in st.session_state.favorite_stocks:
st.session_state.favorite_stocks.append(favorite)
return favorites
except Exception as e:
logger.error(f"Favoriler getirilirken hata: {str(e)}")
logger.error(traceback.format_exc())
# Hata durumunda session state'ten döndür
return st.session_state.get('favorite_stocks', [])