[PYTHON] Arbeitsmemorandum (Pymongo) Teil 3. Ich möchte es nicht noch einmal überprüfen, also notieren Sie es sich (Aggregat)

Über diesen Artikel

Dieser Artikel ist eine Fortsetzung des Artikels, den ich neulich gepostet habe.

  1. Arbeitsmemorandum (Pymongo) Teil 1. Grundlegende Operation
  2. Arbeitsmemorandum (Pymongo) Teil 2. Bequemer Betrieb (Bulk_write)

Dieses Mal habe ich persönlich BitCoint-Preisschwankungsdaten mit einer bestimmten Rest-API gesammelt und diese wurden zu umfangreich. Daher werde ich darüber schreiben, wann ich die Anzahl der Dokumente heruntergerechnet und reduziert habe.

Was ist Aggregat

Es ist ein Aggregationsprozess. In Pymongo wird die Aggregationsverarbeitung ausgeführt, indem eine Pipeline (bedingte Anweisung) an die Aggregatfunktion übergeben wird. Die Pileline besteht aus Stufe und Operator, und jede Stufe entspricht "Auswählen", "Gruppieren nach", "Wobei" usw. für SQL, und der Operator entspricht "Summe", "Max", "Min" usw. ..

Referenz: Aggregate Pipeline (Stufe) Referenz: Aggregate Pileline (Operator)


Hintergrund

Als Ergebnis der Aufnahme des Erfassungsergebnisses von Rest API in die Sammlung, wie es ist, Ich habe viele Daten wie die folgenden vergeblich gestellt (51240). (Wenn ich es mehrere Tage im Abstand von 10 Minuten stehen gelassen hätte, hätte es sich angesammelt, bevor ich es wusste ...) Da es ärgerlich ist, habe ich es heruntergesampelt, um die Anzahl der Daten zu reduzieren.

In der Sammlung gespeicherte Dokumente


client = MongoClient()
db = client["BitCoin"]["document"]
pprint(db.count()) #Funktion zum Abrufen der Anzahl der Dokumente in der Sammlung
pprint(db.find_one())

"""
#Ausgabeergebnis
51240
{'_id': ObjectId('5f328ad85ae5ac59aee515cb'),
 'best_ask': 1245419.0,
 'best_ask_size': 0.02,
 'best_bid': 1244658.0,
 'best_bid_size': 0.05,
 'ltp': 1245615.0,
 'product_code': 'BTC_JPY',
 'tick_id': 10956004,
 'timestamp': 1597115465.0,
 'total_ask_depth': 1364.44898005,
 'total_bid_depth': 1637.4300907,
 'volume': 126756.67774321,
 'volume_by_product': 6571.45287901
}
"""

Die Grafik sieht so aus ... Es gibt zu viele Punkte und es ist wirklich nervig test.jpg


Pipeline-Einstellungen für Aggregat

Vorläufig haben wir die Daten in Intervallen von 10 Minuten in tägliche Daten gruppiert, jeden Wert gemittelt und ein Downsampling durchgeführt.

Unten sehen Sie die in Pymongo verwendete aggregierte Pipeline.

pipeline


coin = "BTC_JPY"
interval = 60*60*24 # 24hour 
pipeline = [
    # match stage 
    {"$match": {"product_code": coin} },
    # group stage
    {"$group": {
        "_id":
        {"timestamp":
            {"$subtract":  ["$timestamp", { "$mod": ["$timestamp", interval]}]
             }
         ,
        "product_code": "$product_code"
        },
        "timestamp":{"$avg": "$timestamp"},
        "ltp": {"$avg": "$ltp"},
        "best_ask": {"$avg": "$best_ask"},
        "best_ask_size": {"$avg": "$best_ask_size"},
        "best_bid_size": {"$avg": "$best_bid_size"},
        "total_ask_depth": {"$avg": "$total_ask_depth"},
        "total_bid_depth": {"$avg": "$total_bid_depth"},
        "volume": {"$avg": "$volume"},
        "volume_by_product": {"$avg": "$volume_by_product"},
    }},
    # presentation stage
    {"$project": {
        "product_code": "$_id.product_code",
        "_id": 0, "timestamp": 1,"ltp": 1,
        "best_ask": 1,"best_ask_size":   1,
        "best_bid_size": 1,
        "total_ask_depth": 1,
        "total_bid_depth": 1,
        "volume": 1, "volume_by_product": 1,
        }
    }
]

Ich werde die Pipeline erklären.

  1. Holen Sie sich das zu aggregierende Ziel ($ match) Dieses Mal habe ich diejenigen mit dem gleichen "Produktcode" bekommen. (Sie können es genauso angeben wie find.)

{"$match": {"product_code": coin} }, ```

  1. Gruppierung ($ group) Der Produktcode und der Zeitstempel wurden so gruppiert, dass sie zur Unixtime in Intervallen von 1 Tag übereinstimmen, und die anderen Werte wurden gemittelt. Die folgenden zwei Punkte können erwähnt werden.

  2. Legen Sie das zu gruppierende Ziel in "_id" fest

  3. Geben Sie nach _id den gewünschten Schlüssel, den Maximalwert usw. und die Berechnungsmethode (Operator) an.

    {"$group": {
        "_id": #Legen Sie hier das zu gruppierende Ziel fest
        {"timestamp":
            {"$subtract":  
                ["$timestamp", 
                    { "$mod": ["$timestamp", interval]}]
             }
         ,
        "product_code": "$product_code"
        },
        "timestamp":{"$avg": "$timestamp"},
        "ltp": {"$avg": "$ltp"},
    
    
  4. Geben Sie die anzuzeigenden Daten an ($ project) (Sie können dies mit der gleichen Operation wie das Projekt in find tun.)

 {"$project": {
     "product_code": "$_id.product_code",
     "_id": 0, "timestamp": 1,"ltp": 1,
     "best_ask": 1,"best_ask_size":   1,
     "best_bid_size": 1,
     "total_ask_depth": 1,
     "total_bid_depth": 1,
     "volume": 1, "volume_by_product": 1,
     }
 }

Downsampled-Ergebnis

Ich habe die von der Pipeline zuvor heruntergetasteten Daten mit den Originaldaten verglichen. Der rote Punkt steht vor dem Downsampling und der blaue Punkt nach dem Downsampling. Sie können sehen, dass die Daten gut ausgedünnt sind.

import matplotlib.pyplot as plt

plt.figure()
for i in db.find( filter= {"product_code": coin
                          } ):
    plt.scatter(i["timestamp"], i["ltp"], marker=".", color="r")
for i in  db.aggregate(pipeline=pipeline):
    plt.scatter(i["timestamp"], i["ltp"], marker=".", color="b")
plt.grid()
plt.xlabel("Data[unixtime]")
plt.ylabel(coin)
plt.savefig("test2.jpg ")
plt.show()

test2.jpg


Nun, es gibt immer noch viele Dinge über Aggregate, aber es gibt zu viele, also werde ich dieses Mal hier enden. Ich werde Korrekturen, Fragen und alles hinzufügen, was Sie schreiben sollen.

Recommended Posts

Arbeitsmemorandum (Pymongo) Teil 3. Ich möchte es nicht noch einmal überprüfen, also notieren Sie es sich (Aggregat)
Beachten Sie, dass ich süchtig danach war, TensowFlow einzurichten
Ich wollte das Suchmodul von Ansible2 verwenden, aber es hat einige Zeit gedauert, machen Sie sich also eine Notiz
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Ich möchte es nicht zugeben ... Die dynamische Systemdarstellung von Neural Network
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
[Hi Py (Teil 1)] Ich möchte vorerst etwas machen, also setze zuerst ein Ziel.
Hinweise Ich habe nachgeschlagen, um Befehlszeilentools in Python zu erstellen
Ich war süchtig danach, Cython mit PyCharm auszuprobieren, also machen Sie sich eine Notiz
Plötzlich musste ich mit Python und Pyramid an einem Projekt arbeiten, also eine Notiz darüber, wie ich lerne
Ich möchte ein Spiel mit Python machen
Ich möchte keinen Codierungstest machen
Ich wollte viele Bilder sammeln, also habe ich versucht, "Google Image Download" zu verwenden.
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Ich bin auf MoviePy gestoßen, machen Sie sich also eine Notiz
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte ein Paket von Php Redis installieren
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich mag es nicht, mit der Veröffentlichung von Pokemon Go frustriert zu sein, deshalb habe ich ein Skript erstellt, um die Veröffentlichung zu erkennen und zu twittern
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 1)
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte viele Prozesse von Python aus starten
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich bin gestolpert, als ich versucht habe, Basemap zu installieren, also ein Memorandum
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
[Twitter] Ich möchte die heruntergeladenen vergangenen Tweets (meines Kontos) in eine schöne CSV verwandeln
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Vergleich von GCP-Computerdiensten [Ich möchte es serverlos verwenden]
Holz kratzen und essen - ich möchte ein gutes Restaurant finden! ~ (Arbeit)
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich blieb stecken, als ich versuchte, verschiedene Dinge mit Mac El Captain Pip zu installieren