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