MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wizualizacja statystyk danych Mongodb za pomocą matplotlib

AKTUALIZACJA:

Zasadniczo źle zrozumiałem problem. Felix pytał mongoDB, aby dowiedzieć się, ile elementów mieści się w każdym zakresie; dlatego moje podejście nie zadziałało, ponieważ próbowałem poprosić mongoDB o przedmioty. Felix ma dużo danych, więc jest to całkowicie nierozsądne.

Felix, oto zaktualizowana funkcja, która powinna robić to, co chcesz:

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

Kwant to „krok”, po którym można spojrzeć wstecz. Na przykład, gdybyśmy chcieli spojrzeć na ostatnie 12 godzin, ustawiłbym quantum = timedelta(hours=1) i num = 12 .Zaktualizowany przykład użycia, w którym otrzymujemy ostatnie 30 dni, to:

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

Oryginał:

W porządku, to moja próba refaktoryzacji dla Ciebie. Blubber zasugerował naukę JS i MapReduce. Nie ma takiej potrzeby, o ile zastosujesz się do innych jego sugestii:utwórz indeks na polu czasu i zmniejsz liczbę zapytań. To moja najlepsza próba, wraz z drobną refaktoryzacją. Mam jednak sporo pytań i komentarzy.

Początek za:

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

Wysyłasz żądanie mongoDB, aby znaleźć wszystkie dane z każdego dnia z ostatnich 30 dni. Dlaczego nie użyjesz tylko jednej prośby? A kiedy masz już wszystkie dane, dlaczego po prostu nie odfiltrować usuniętych danych?

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

Naprawdę nie jestem pewien, dlaczego wysyłałeś 60 żądań (30 * 2, jedno dla wszystkich danych, jedno dla nieusuniętych). Czy jest jakiś konkretny powód, dla którego gromadzisz dane z dnia na dzień?

Następnie masz:

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

Dlaczego nie:

N = 30
x = range(N)

len(range(x) jest równe x , ale obliczenie zajmuje trochę czasu. Sposób, w jaki to napisałeś, jest trochę... dziwny.

Oto moje spojrzenie na to, z sugerowanymi przeze mnie zmianami wprowadzonymi w sposób jak najbardziej ogólny.

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. BŁĄD:proces potomny nie powiódł się, zakończono z błędem numer 1,mongodb

  2. Nowy sterownik C++ Mongo:jak zobaczyć typ i jak uzyskać wartość ciągu

  3. Indeksy MongoDB dla $elemMatch

  4. Symfony2 + Konieczność użycia wyrażenia regularnego w mongodb ODM doktryny, aby sprawdzić sprawdzanie niewrażliwe na wielkość liter

  5. Tworzenie unikalnego klucza MongoDB za pomocą C#