Projet algorithmique et programmation avancée
Structure du projet
Back-end
Algo
Flask
Database
Front-end
React.js
Network
apexcharts.js
Structure du back



Import des données
(Modèle)
class RawData(db.Model):
__tablename__ = "allData"
id = db.Column(db.Integer, primary_key=True)
opening = db.Column(db.Float)
high = db.Column(db.Float)
low = db.Column(db.Float)
closing = db.Column(db.Float)
date = db.Column(db.Date, unique=True)
"Date","Price","Open","High","Low","Vol.","Change %"
"Oct 16, 2021","61,749.0","61,680.0","62,134.0","61,100.7","10.25K","0.06%"
"Oct 15, 2021","61,709.0","57,354.0","62,897.0","56,889.0","11.88K","7.59%"
Import des données
(La requête)
def insert_data_from_file(file: str):
file = open(file, encoding='utf-8')
csvreader = csv.reader(file)
rows = [row for row in csvreader]
for date, closing, opening, high, low, *_ in rows[1:]:
rawData = RawData(
date=datetime.datetime.strptime(date, '%b %d, %Y').date(),
opening=float(opening.replace(',', '')),
high=float(high.replace(',', '')),
low=float(low.replace(',', '')),
closing=float(closing.replace(',', '')))
db.session.add(rawData)
db.session.commit()
Import des données
(Flask)
@app.route("/init-db", methods=["POST"])
def send_data_to_db():
create_db()
insert_data_from_file(CSV_FILE_PATH)
return "DB successfully created."
Structure des données (part 1)
Construction de l'arbre : O(n)
Récupérer une donnée : O(1)

Arbre de hashtable
Récupérer une donnée à une date précise
def get_data_by_date(date):
try:
return ht_by_year_and_month[date.year][date.month][date.day].data
except KeyError:
raise ValueError(f"Date '{date}' not found")
@app.route("/data/db", methods=["GET"])
def get_data_interval():
begin = request.args.get('begin')
end = request.args.get('end')
k = request.args.get('k')
if end == 'null':
end = begin
try:
begin = int(begin)
end = int(end)
k = int(k)
except ValueError:
raise Exception("Invalid params")
if begin == end:
return jsonify_models(select_data_at_date(begin))
if k > 0:
return jsonify_models(select_data_between_dates(begin, end, k))
return jsonify_models(select_data_between_dates(begin, end))
O(1)
Récupérer des données entre 2 dates
def get_data_between_date(begin, end, k=None):
try:
begin_index = ht_by_year_and_month[begin.year][begin.month][begin.day].index
except KeyError:
begin_index = 0
try:
end_index = ht_by_year_and_month[end.year][end.month][end.day].index
except KeyError:
end_index = len(sorted_array) - 1
if k is None:
return sorted_array[begin_index:end_index + 1]
return sorted_array[max(begin_index, end_index - k + 1):end_index + 1]
O(k) ou O(m)
Structure des données (part 1)
k = nombre de noeuds autorisés
Insertion d'éléments : O(log(k))
Récupérer le min : O(1)

Priority queue
Explication de code
Récupérer les meilleurs données entre 2 dates
def get_k_best_data_between_date_with_queue(begin: datetime, end: datetime, k: int) -> List[RawData]:
data = get_data_between_date(begin, end)
k = min(k, len(data))
pq = PriorityQueue(k)
for row in data:
pq.insert(RawDataOrderedByClosingPrice(row))
return [pq.pop().data for _ in range(k)]
O(k*log(k))
deck
By kysterdraw
deck
- 41