AKTUALIZACE:
Zásadně jsem špatně pochopil problém. Felix se dotazoval mongoDB, aby zjistil, kolik položek spadá do každého rozsahu; proto můj přístup nefungoval, protože jsem se snažil požádat mongoDB o předměty. Felix má spoustu dat, takže je to naprosto nerozumné.
Felixi, zde je aktualizovaná funkce, která by měla dělat, co chcete:
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
Kvantové je „krok“, kterým se lze ohlédnout. Pokud bychom se například chtěli podívat na posledních 12 hodin, nastavil bych quantum = timedelta(hours=1)
a num = 12
.Aktualizovaný příklad použití, kde získáme posledních 30 dní, by byl:
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()
Originál:
Dobře, toto je můj pokus o refaktorizaci pro vás. Blubber navrhl naučit se JS a MapReduce. Není potřeba, pokud se budete řídit jeho dalšími návrhy:vytvořte index v poli času a snižte počet dotazů. Toto je můj nejlepší pokus o to, spolu s mírnou refaktorizací. Přesto mám spoustu otázek a připomínek.
Začátek:
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
Zadáváte požadavek mongoDB, abyste našli všechna data z každého dne za posledních 30 dní. Proč nepoužiješ jeden požadavek? A jakmile budete mít všechna data, proč smazaná data jednoduše neodfiltrovat?
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
Opravdu si nejsem jistý, proč jste dělali 60 požadavků (30 * 2, jeden pro všechna data, jeden pro nesmazaná). Existuje nějaký konkrétní důvod, proč jste shromažďovali data každý den?
Pak máte:
x = range(30)
N = len(x)
Proč ne:
N = 30
x = range(N)
len(range(x)
je rovno x
, ale výpočet zabere čas. Způsob, jakým jste to původně napsal, je jen trochu... divný.
Zde je můj názor na to, se změnami, které jsem navrhl, provedenými způsobem, který je co nejobecnější.
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()