[PYTHON] Mémorandum de travail (pymongo) Partie 3. Je ne veux pas le réexaminer, alors prenez-en note (agrégé)

À propos de cet article

Cet article est la suite de celui que j'ai publié l'autre jour.

  1. Mémorandum de travail (pymongo) Partie 1. Fonctionnement de base
  2. Mémorandum de travail (pymongo) Partie 2. Fonctionnement pratique (bulk_write)

Cette fois, j'ai personnellement collecté des données de fluctuation de prix BitCoint avec une certaine API Rest et elles sont devenues trop lourdes, donc j'écrirai quand j'ai sous-échantillonné et réduit le nombre de documents.

Qu'est-ce que l'agrégat

C'est un processus d'agrégation. Dans pymongo, le traitement d'agrégation est exécuté en passant un pipeline (instruction conditionnelle) à la fonction d'agrégation. La ligne de base se compose d'une étape et d'un opérateur, et l'étape correspond à "sélectionner", "grouper par", "où", etc. pour SQL, et l'opérateur correspond à "somme", "max", "min", etc. ..

Référence: Aggregate Pipeline (stage) Référence: Aggregate Pileline (opérateur)


Contexte

Suite à la mise en l'état du résultat de l'acquisition de l'API Rest dans la collection, J'ai mis beaucoup de données comme les suivantes en vain (51240). (Si je l'ai laissé plusieurs jours à 10 minutes d'intervalle, il se serait accumulé avant que je ne le sache ...) Comme c'est ennuyeux, je l'ai sous-échantillonné pour réduire le nombre de données.

Documents stockés dans la collection


client = MongoClient()
db = client["BitCoin"]["document"]
pprint(db.count()) #Fonction pour obtenir le nombre de documents de la collection
pprint(db.find_one())

"""
#Résultat de sortie
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
}
"""

Le graphique ressemble à ceci ... Il y a trop de points et c'est vraiment ennuyeux test.jpg


Paramètres de pipeline pour l'agrégat

Pour le moment, nous avons regroupé les données à intervalles de 10 minutes en données quotidiennes, moyenné chaque valeur et sous-échantillonné.

Vous trouverez ci-dessous le pipeline d'agrégats utilisé dans pymongo.

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,
        }
    }
]

Je vais expliquer le pipeline.

  1. Obtenez la cible à agréger («$ match») Cette fois, j'ai ceux avec le même product_code. (Vous pouvez le spécifier de la même manière que find.)

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

  1. Regroupement ($ group) Le code_produit et l'horodatage ont été regroupés de manière à correspondre à l'heure unix à des intervalles d'un jour, et les autres valeurs ont été moyennées. Les deux points suivants peuvent être mentionnés.

  2. Définissez la cible à regrouper dans _id

  3. Après _id, spécifiez la clé que vous souhaitez obtenir, la valeur maximale, etc. et la méthode de calcul (opérateur).

    {"$group": {
        "_id": #Définissez ici la cible à regrouper
        {"timestamp":
            {"$subtract":  
                ["$timestamp", 
                    { "$mod": ["$timestamp", interval]}]
             }
         ,
        "product_code": "$product_code"
        },
        "timestamp":{"$avg": "$timestamp"},
        "ltp": {"$avg": "$ltp"},
    
    
  4. Spécifiez les données à afficher ($ project) (Vous pouvez le faire avec la même opération que le projet dans find)

 {"$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,
     }
 }

Résultat sous-échantillonné

J'ai comparé les données sous-échantillonnées par le pipeline plus tôt avec les données d'origine. Le point rouge est avant le sous-échantillonnage et le bleu après le sous-échantillonnage. Vous pouvez voir que les données sont bien éclaircies.

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


Eh bien, il y a encore beaucoup de choses sur les agrégats, mais il y en a trop, donc cette fois je vais m'arrêter ici. J'ajouterai des corrections, des questions et tout ce que je veux que vous écriviez.

Recommended Posts

Mémorandum de travail (pymongo) Partie 3. Je ne veux pas le réexaminer, alors prenez-en note (agrégé)
Notez que j'étais accro à la configuration de TensowFlow
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
[Python] J'ai essayé d'implémenter un tri stable, alors notez
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
Je ne veux pas l'admettre ... Représentation dynamique du système de Neural Network
Je veux colorer une partie de la chaîne Excel avec Python
[Salut Py (Partie 1)] Je veux faire quelque chose pour le moment, alors commencez par fixer un objectif.
Notes J'ai recherché la création d'outils de ligne de commande en Python
J'étais accro à essayer Cython avec PyCharm, alors prenez note
Soudain, j'avais besoin de travailler sur un projet utilisant Python et Pyramid, donc une note sur la façon dont j'étudie
Je veux faire un jeu avec Python
Je ne veux pas passer un test de codage
Je voulais collecter beaucoup d'images, j'ai donc essayé d'utiliser "google image download"
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
Je suis tombé sur l'utilisation de MoviePy, alors prenez note
Je veux travailler avec un robot en python.
Je souhaite installer un package de Php Redis
[Python] Je veux faire d'une liste imbriquée un taple
Je n'aime pas être frustré par la sortie de Pokemon Go, j'ai donc créé un script pour détecter la sortie et le tweeter
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 1)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer beaucoup de processus à partir de python
Je veux faire une macro de clic avec pyautogui (désir)
Je veux faire une macro de clic avec pyautogui (Outlook)
J'ai trébuché lorsque j'ai essayé d'installer Basemap, donc un mémorandum
Je veux connaître la légende du monde des technologies informatiques
Je veux ajouter un joli complément à input () en python
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
[Twitter] Je veux faire des tweets téléchargés (de mon compte) dans un beau CSV
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
N'écrivez pas Python si vous voulez l'accélérer avec Python
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
Comparaison des services informatiques GCP [Je souhaite l'utiliser sans serveur]
Gratter et manger des bûches - je veux trouver un bon restaurant! ~ (Travail)
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux créer un fichier pip et le refléter dans le menu fixe
Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
Je suis resté coincé quand j'ai essayé d'installer diverses choses avec Mac El capitaine pip, alors notez