sql >> データベース >  >> NoSQL >> MongoDB

matplotlibを使用したMongodbデータ統計の視覚化

    更新:

    私は根本的に問題を誤解しました。 FelixはmongoDBにクエリを実行して、各範囲に含まれるアイテムの数を把握していました。したがって、mongoDBに を要求しようとしていたため、私のアプローチは機能しませんでした。 アイテム。 Felixには大量のデータがあるため、これはまったく無理です。

    フェリックス、これがあなたが望むことをするはずの更新された関数です:

    def getDataFromLast(num, quantum):
        m = my_mongodb()
        all = []
        not_deleted = []
        today = datetime.combine(date.today(), time())
        for i in range(num+1)[-1]: # start from oldest
            day = today - i*quantum
            time_query = {"$gte":day, "$lt": day+quantum}
            all.extend(m.data.find({"time":time_query}).count())
            not_deleted.extend(m.data.find({"deleted":0, "time":time_query}).count())
        return all, not_deleted
    

    クォンタムは振り返る「ステップ」です。たとえば、過去12時間を確認したい場合は、quantum = timedelta(hours=1)を設定します。 およびnum = 12 。過去30日間の使用例を更新すると、次のようになります。

    from datetime import datetime, date, time, timedelta
    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    from my_conn import my_mongodb
    
    #def getDataFromLast(num, quantum) as defined above
    
    def format_date(x, N, pos=None):
        """ This is your format_date function. It now takes N
            (I still don't really understand what it is, though)
            as an argument instead of assuming that it's a global."""
        day = date.today() - timedelta(days=N-x-1)
        return day.strftime('%m%d')
    
    def plotBar(data, color):
        plt.bar(range(len(data)), data, align='center', color=color)
    
    
    N = 30 # define the range that we want to look at
    
    all, valid = getDataFromLast(N, timedelta(days=1)) # get the data
    
    plotBar(all, "#4788d2") # plot both deleted and non-deleted data
    plotBar(valid, "#0c3688") # plot only the valid data
    
    plt.xticks(range(N), [format_date(i) for i in range(N)], size='small', rotation=30)
    plt.grid(axis="y")
    plt.show()  
    

    オリジナル:

    了解しました。これがリファクタリングの試みです。 BlubberはJSとMapReduceを学ぶことを提案しました。彼の他の提案に従う限り、必要はありません。時間フィールドにインデックスを作成し、クエリの数を減らします。これは、わずかなリファクタリングとともに、それに対する私の最善の試みです。でも、たくさんの質問やコメントがあります。

    開始:

    with my_mongodb() as m:
        for i in range(30):
            day = today - timedelta(days = i)
            t1 = [m.data.find({"time": {"$gte": day, "$lt": day + timedelta(days = 1)}}).count()] + t1
            t2 = [m.data.find({"deleted": 0, "time": {"$gte": day, "$lt": day + timedelta(days = 1)}}).count()] + t2
    

    過去30日間の毎日のすべてのデータを検索するmongoDBリクエストを作成しています。 1つのリクエストだけを使用してみませんか?そして、すべてのデータを取得したら、削除されたデータを除外してみませんか?

    with my_mongodb() as m:
        today = date.today() # not sure why you were combining this with time(). It's the datetime representation of the current time.time()
    
        start_date = today -timedelta(days=30)
        t1 = m.find({"time": {"$gte":start_date}}) # all data since start_date (30 days ago)
        t2 = filter(lambda x: x['deleted'] == 0, all_data) # all data since start_date that isn't deleted
    

    なぜ60件のリクエストを行ったのかよくわかりません(30 * 2、すべてのデータに1つ、削除されていないデータに1つ)。毎日データを作成した特別な理由はありますか?

    次に、次のようになります。

    x = range(30)
    N = len(x)
    

    なぜですか:

    N = 30
    x = range(N)
    

    len(range(x) xと等しい 、ただし、計算には時間がかかります。あなたが最初にそれを書いた方法はほんの少し...奇妙です。

    これが私のひび割れです。私が提案した変更は、可能な限り一般的な方法で行われました。

    from datetime import datetime, date, time, timedelta
    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    from my_conn import my_mongodb
    
    def getDataFromLast(delta):
        """ Delta is a timedelta for however long ago you want to look
            back. For instance, to find everything within the last month,
            delta should = timedelta(days=30). Last hour? timedelta(hours=1)."""
        m = my_mongodb() # what exactly is this? hopefully I'm using it correctly.
        today = date.today() # was there a reason you didn't use this originally?
        start_date = today - delta
        all_data = m.data.find({"time": {"$gte": start_date}})
        valid_data = filter(lambda x: x['deleted'] == 0, all) # all data that isn't deleted
        return all_data, valid_data
    
    def format_date(x, N, pos=None):
        """ This is your format_date function. It now takes N
            (I still don't really understand what it is, though)
            as an argument instead of assuming that it's a global."""
        day = date.today() - timedelta(days=N-x-1)
        return day.strftime('%m%d')
    
    def plotBar(data, color):
        plt.bar(range(len(data)), data, align='center', color=color)
    
    N = 30 # define the range that we want to look at
    all, valid = getDataFromLast(timedelta(days=N))
    plotBar(all, "#4788d2") # plot both deleted and non-deleted data
    plotBar(valid, "#0c3688") # plot only the valid data
    
    plt.xticks(range(N), [format_date(i) for i in range(N)], size='small', rotation=30)
    plt.grid(axis="y")
    plt.show()  
    


    1. mongoose'findById'は有効なIDでnullを返します

    2. MongoDB-フィールド内の数字以外の文字を削除します

    3. mongoDb dockerインスタンスのmongodumpを実行するための正しい構文?

    4. .insertOneは関数ではありません