MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Hình ảnh hóa thống kê dữ liệu Mongodb bằng cách sử dụng matplotlib

CẬP NHẬT:

Về cơ bản tôi đã hiểu sai vấn đề. Felix đang truy vấn mongoDB để tìm ra có bao nhiêu mục thuộc mỗi phạm vi; do đó, cách tiếp cận của tôi không hoạt động vì tôi đang cố gắng yêu cầu mongoDB for các mặt hàng. Felix có rất nhiều dữ liệu, vì vậy điều này hoàn toàn không hợp lý.

Felix, đây là một chức năng được cập nhật sẽ làm những gì bạn muốn:

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

Lượng tử là "bước" để nhìn lại quá khứ. Ví dụ:nếu chúng tôi muốn xem 12 giờ qua, tôi sẽ đặt quantum = timedelta(hours=1)num = 12 .Một ví dụ sử dụng cập nhật mà chúng tôi nhận được trong 30 ngày qua sẽ là:

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()  

Bản gốc:

Được rồi, đây là nỗ lực của tôi trong việc cấu trúc lại cho bạn. Blubber đã đề xuất học JS và MapReduce. Không cần miễn là bạn làm theo các đề xuất khác của anh ấy:tạo chỉ mục trên trường thời gian và giảm số lượng truy vấn. Đây là nỗ lực tốt nhất của tôi về điều đó, cùng với một chút cấu trúc lại. Tôi có rất nhiều câu hỏi và nhận xét.

Bắt đầu bằng:

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

Bạn đang thực hiện yêu cầu mongoDB để tìm tất cả dữ liệu từ mỗi ngày trong 30 ngày qua. Tại sao bạn không chỉ sử dụng một yêu cầu? Và khi bạn có tất cả dữ liệu, tại sao không chỉ lọc ra dữ liệu đã xóa?

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

Tôi thực sự không chắc tại sao bạn lại đưa ra 60 yêu cầu (30 * 2, một yêu cầu cho tất cả dữ liệu, một yêu cầu không bị xóa). Có lý do cụ thể nào khiến bạn xây dựng dữ liệu từng ngày không?

Sau đó, bạn có:

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

Tại sao không:

N = 30
x = range(N)

len(range(x) bằng x , nhưng mất thời gian để tính toán. Cách bạn viết nó ban đầu hơi ... kỳ lạ.

Đây là sự cố gắng của tôi về nó, với những thay đổi mà tôi đã đề xuất được thực hiện theo cách tổng quát nhất có thể.

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. NodeJS / ExpressJS gửi phản hồi lượng lớn dữ liệu trong 1 luồng

  2. Không tìm thấy thuộc tính nào cho loại ... Khi sử dụng QueryDslPredicateExecutor với MongoDB và Spring-Data

  3. Cách phân tích mức sử dụng đĩa của vùng chứa Docker

  4. Thông báo lỗi tùy chỉnh với Mongoose

  5. Tại sao không nên đóng kết nối MongoDB ở bất kỳ đâu trong mã Node.js?