MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

Matplotlib का उपयोग करके Mongodb डेटा सांख्यिकी विज़ुअलाइज़ेशन

अपडेट करें:

मैंने मूल रूप से समस्या को गलत समझा। फ़ेलिक्स यह पता लगाने के लिए mongoDB से पूछताछ कर रहा था कि प्रत्येक श्रेणी में कितने आइटम गिरे; इसलिए, मेरा दृष्टिकोण काम नहीं किया, क्योंकि मैं mongoDB के लिए . पूछने की कोशिश कर रहा था सामान। फ़ेलिक्स के पास बहुत अधिक डेटा है, इसलिए यह पूरी तरह से अनुचित है।

फ़ेलिक्स, यहाँ एक अद्यतन फ़ंक्शन है जो आपको जो चाहिए वह करना चाहिए:

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

क्वांटम पीछे मुड़कर देखने का "कदम" है। उदाहरण के लिए, यदि हम पिछले 12 घंटों को देखना चाहते हैं, तो मैं quantum = timedelta(hours=1) सेट करूंगा। और num = 12 .एक अद्यतन उदाहरण उपयोग जहां हमें पिछले 30 दिन मिलते हैं:

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

मूल:

ठीक है, यह आपके लिए रिफैक्टरिंग का मेरा प्रयास है। ब्लबर ने JS और MapReduce सीखने का सुझाव दिया है। जब तक आप उनके अन्य सुझावों का पालन करते हैं, तब तक इसकी कोई आवश्यकता नहीं है:समय क्षेत्र पर एक अनुक्रमणिका बनाएं, और प्रश्नों की संख्या कम करें। थोड़ा सा रिफैक्टरिंग के साथ, यह मेरा सबसे अच्छा प्रयास है। हालांकि मेरे पास सवालों और टिप्पणियों का एक गुच्छा है।

में शुरू हो रहा है:

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

आप पिछले 30 दिनों से प्रत्येक दिन से सभी डेटा खोजने के लिए एक mongoDB अनुरोध कर रहे हैं। आप सिर्फ एक अनुरोध का उपयोग क्यों नहीं करते? और एक बार जब आपके पास सारा डेटा हो जाए, तो क्यों न केवल हटाए गए डेटा को फ़िल्टर कर दें?

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

मुझे सच में यकीन नहीं है कि आप 60 अनुरोध क्यों कर रहे थे (30 * 2, सभी डेटा के लिए एक, गैर-हटाए गए के लिए एक)। क्या आपके द्वारा दिन-ब-दिन डेटा तैयार करने का कोई विशेष कारण है?

फिर, आपके पास:

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

क्यों नहीं:

N = 30
x = range(N)

len(range(x) x . के बराबर है , लेकिन गणना करने में समय लगता है। जिस तरह से आपने इसे मूल रूप से लिखा है वह थोड़ा अजीब है... अजीब है।

यहां मेरी समझ है, मैंने जो बदलाव सुझाए हैं, वे यथासंभव सामान्य हैं।

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. मोंगोडीबी:$ समूह में एक गणना अभिव्यक्ति को $ धक्का दें

  2. कैसे पाइपलाइन एकत्रीकरण में एक दस्तावेज़ में दो क्षेत्रों की तुलना करने के लिए (mongoDB)

  3. जावा से मोंगो एसएसएल प्रतिकृति सेट से कनेक्ट नहीं हो सकता

  4. कुल से मोंगोडब कर्सर पर पुनरावृति

  5. MongoDB अद्यतन कई ()