My_Redis.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from Config.paths import Path_FichierAction, SysExploite
  2. from Model.profil import profile
  3. import redis
  4. from datetime import datetime, timedelta, date
  5. import yfinance as yf
  6. from ta import add_all_ta_features
  7. import json
  8. import warnings
  9. warnings.simplefilter("ignore", FutureWarning)
  10. # Initialisation de Redis
  11. redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
  12. Gl_DebutEnresitrement = "2016-01-01"
  13. @profile
  14. def BaseOK():
  15. nombre_cles = redis_client.dbsize()
  16. # Vérifier si inférieur à 90 000
  17. if nombre_cles < 90000:
  18. EnregistreTout()
  19. @profile
  20. def EnregistreTout():
  21. date_aujourdhui = datetime.now().strftime("%Y-%m-%d")
  22. try:
  23. # Lecture du fichier contenant les noms des actions
  24. with open(Path_FichierAction, 'r') as file:
  25. actions = [line.strip() for line in file.readlines()]
  26. # Vérification que le fichier contient des actions
  27. if not actions:
  28. print("Le fichier ne contient aucune action à traiter.")
  29. return
  30. # Boucle sur toutes les actions pour appeler Enregistre
  31. for action in actions:
  32. Enregistre(action, Gl_DebutEnresitrement, date_aujourdhui)
  33. print("Enregistrement terminé pour toutes les actions.")
  34. except FileNotFoundError:
  35. print(f"Erreur : Le fichier {Path_FichierAction} est introuvable.")
  36. except Exception as e:
  37. print(f"Erreur lors de l'exécution de EnregistreTout : {e}")
  38. @profile
  39. def Enregistre(Action, DateDebut, DateFin):
  40. """
  41. Télécharge les données d'une action sur une période donnée,
  42. calcule les indicateurs techniques et les enregistre dans Redis.
  43. """
  44. try:
  45. data = yf.download(Action, start=DateDebut, end=DateFin,auto_adjust=False)
  46. if data.empty:
  47. print("Aucune donnée récupérée pour cette période.")
  48. return
  49. data.columns = data.columns.droplevel(1)
  50. # Ajout des colonnes avec des indicateurs techniques
  51. data = add_all_ta_features(
  52. data, open="Open", high="High", low="Low", close="Close", volume="Volume", fillna=True
  53. )
  54. # Convertir les données en dictionnaire
  55. data_dict = data.to_dict(orient='index')
  56. # Enregistrement dans Redis
  57. for date, valeurs in data_dict.items():
  58. key = f"{Action}:{date.strftime('%Y-%m-%d')}"
  59. redis_client.set(key, json.dumps(valeurs)) # Sérialise les données en JSON pour les stocker
  60. except Exception as e:
  61. print(f"Erreur lors de l'enregistrement des données de {Action}: {e}")
  62. @profile
  63. def LireRedis(Action, Date):
  64. cle = Action + ":" + str(Date)
  65. return redis_client.get(cle)
  66. """"
  67. Fonction qui renvoie la liste des jours pour la preparation des donnéee
  68. """
  69. @profile
  70. def ListeJour(Date, NbJour):
  71. liste = [Date]
  72. if isinstance(Date, date):
  73. date_obj = Date
  74. else:
  75. date_obj = datetime.strptime(Date, "%Y-%m-%d").date()
  76. i = 1
  77. while (i < NbJour):
  78. date_obj = date_obj + timedelta(days=+1)
  79. cle = "MT.AS" + ":" + date_obj.strftime("%Y-%m-%d")
  80. valeur1 = redis_client.get(cle)
  81. cle = "AC.PA" + ":" + date_obj.strftime("%Y-%m-%d")
  82. valeur2 = redis_client.get(cle)
  83. if valeur1 is not None and valeur2 is not None:
  84. liste.append(date_obj.strftime("%Y-%m-%d"))
  85. i = i + 1
  86. else :
  87. #print(f"erreur Liste jour : {date_obj}")
  88. today = datetime.now().date()
  89. if date_obj > today:
  90. raise ValueError("La date est dans le futur")
  91. return liste
  92. @profile
  93. def DernierJour(Date,Nbjour):
  94. return ListeJour(Date,Nbjour)[-1]
  95. """
  96. La fonction BaseOk est executer a chaque fois que l'on appel le fichier donnée
  97. """
  98. if SysExploite == "linux" :
  99. BaseOK()