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