sql >> Databáze >  >> NoSQL >> MongoDB

Vizualizace statistik dat Mongodb pomocí matplotlib

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


  1. MongoDB CursorNotFound Chyba na collection.find() pro několik stovek malých záznamů

  2. Java&Mongo:získat objekt tam, kde existuje pole

  3. MongoDB, výkon dotazu regulárním výrazem na indexovaných polích

  4. Jak aktualizovat vložený dokument v MongoDB pomocí Doctrine ODM