第三周/第三節(jié)學習課程: 使用find()函數(shù)精確查找數(shù)據(jù)

1. 引言

查找某個時間的數(shù)據(jù), 只顯示特定字段
繪制七日內(nèi)上海城區(qū)二手物品走勢圖

2. 分析

  • mongodb查找數(shù)據(jù)的方法
  • mongodb顯示特定字段的方法
  • charts顯示走勢圖的方法
  • 顯示charts折線圖所需要的數(shù)據(jù)格式

3. 實現(xiàn)

In [1] :
from pymongo import MongoClient
from datetime import timedelta, date
import charts

Server running in the folder /home/wjh at 127.0.0.1:40064


In [2] :
client = MongoClient('10.66.17.17', 27017)
database = client['ganji']
item_info_collection = database['sh_ershou_itemY']

In [3] :
# 包含所有二級區(qū)域的列表
area_list = [i['area'][1] for i in item_info_collection.find()]
# 區(qū)域名字是唯一的集合
area_set = set(area_list)
# 輸出看下是什么結(jié)果
print(len(area_set), area_set)

21 {'閔行', '奉賢', '楊浦', '旮旯', '南匯', '虹口', '靜安', '金山', '浦東', '青浦', '盧灣', '長寧', '上海周邊', '崇明', '嘉定', '黃浦', '寶山', '閘北', '普陀', '徐匯', '松江'}


In [4] :
# 查找特定時間的數(shù)據(jù), 并指定顯示的字段, 1為顯示 0為不顯示, 如下為0的字段不顯示, 其它都顯示
[i for i in item_info_collection.find({'update': {'$in': ['07-01', '07-02']}}, {'_id': 0, 'cate': 0, 'degree': 0, 'title': 0, 'type': 0, 'price': 0}).limit(5)]
Out [4] :
[{'area': ['上海', '浦東', '東明路'], 'update': '07-02'},
 {'area': ['上海', '浦東', '川沙'], 'update': '07-02'},
 {'area': ['上海', '徐匯'], 'update': '07-02'},
 {'area': ['上海', '閔行', '梅隴'], 'update': '07-01'},
 {'area': ['上海', '浦東', '北蔡'], 'update': '07-01'}]
In [5] :
# _id不指定的話默認是顯示的, 所以將其設(shè)置為0不顯示, 如下為1的字段則顯示, 其它都不顯示
[i for i in item_info_collection.find({}, {'_id': 0, 'area': 1}).limit(5)]
Out [5] :
[{'area': ['上海', '長寧', '中山公園']},
 {'area': ['上海', '松江']},
 {'area': ['上海', '金山', '金山衛(wèi)']},
 {'area': ['上海', '虹口', '四平路']},
 {'area': ['上海', '浦東', '八佰伴']}]

In [6] :
# 以下是timedelta, date的用法說明:
# 單位是小時, 然后時間就可以按小時增長
print(timedelta(hours=2))
# 單位是天, 然后時間就按天增長
print(timedelta(days=1))
# 傳入3個int, 獲取時間
print(date(2016,2,3))

2:00:00
1 day, 0:00:00
2016-02-03


In [7] :
# 定義生成日期列表函數(shù), 傳遞兩個參數(shù)(起始日期, 結(jié)束日期)
def date_gen(date1, date2):
    # 起始日期
    just_date = date(2016, int(date1.split('-')[0]), int(date1.split('-')[1]))
    # 結(jié)束日期
    end_date = date(2016, int(date2.split('-')[0]), int(date2.split('-')[1]))
    # 日期增長步長
    step = timedelta(days=1)
    # 循環(huán)生成日期列表
    while just_date <= end_date:
        yield just_date.strftime('%m-%d')
        just_date += step
# 輸出看下結(jié)果
[i for i in date_gen('07-5', '07-10')]
Out [7] :
['07-05', '07-06', '07-07', '07-08', '07-09', '07-10']

In [8] :
# 定義生成圖表字典列表
def area_data_gen(types, date1, date2):
    # 在區(qū)域名稱集合內(nèi)循環(huán)
    for area in area_set:
        # 區(qū)域出現(xiàn)次數(shù)列表
        area_posts = []
        # 指定時間段內(nèi)循環(huán)
        for date in date_gen(date1, date2):
            # 查找特定時間特定區(qū)域的數(shù)據(jù)并生成列表
            find = list(item_info_collection.find({'update': date, 'area': area}))
            # 某一天區(qū)域出現(xiàn)的次數(shù)
            count = len(find)
            # 將這天區(qū)域出現(xiàn)的次數(shù)添加至列表
            area_posts.append(count)
        # 一個區(qū)域的圖表數(shù)據(jù), data為這幾天出現(xiàn)的次數(shù)
        data = {
            'name': area,
            'data': area_posts,
            'type': types
        }
        # 生成列表
        yield data
# 輸出看下
[i for i in area_data_gen('line', '06-30', '07-06')]
Out [8] :
[{'data': [151, 239, 258, 351, 403, 499, 805], 'name': '閔行', 'type': 'line'},
 {'data': [42, 39, 38, 59, 58, 93, 116], 'name': '奉賢', 'type': 'line'},
 {'data': [87, 88, 104, 123, 145, 164, 283], 'name': '楊浦', 'type': 'line'},
 {'data': [54, 50, 66, 89, 104, 136, 224], 'name': '旮旯', 'type': 'line'},
 {'data': [25, 23, 23, 60, 57, 83, 100], 'name': '南匯', 'type': 'line'},
 {'data': [30, 48, 58, 66, 96, 139, 266], 'name': '虹口', 'type': 'line'},
 {'data': [38, 34, 40, 41, 68, 99, 117], 'name': '靜安', 'type': 'line'},
 {'data': [8, 7, 14, 18, 13, 37, 33], 'name': '金山', 'type': 'line'},
 {'data': [259, 393, 436, 591, 663, 842, 1375], 'name': '浦東', 'type': 'line'},
 {'data': [27, 53, 54, 64, 73, 83, 112], 'name': '青浦', 'type': 'line'},
 {'data': [14, 18, 18, 24, 24, 43, 31], 'name': '盧灣', 'type': 'line'},
 {'data': [37, 47, 82, 64, 107, 130, 171], 'name': '長寧', 'type': 'line'},
 {'data': [26, 21, 24, 20, 39, 47, 53], 'name': '上海周邊', 'type': 'line'},
 {'data': [2, 5, 1, 0, 5, 2, 2], 'name': '崇明', 'type': 'line'},
 {'data': [69, 86, 141, 134, 175, 211, 352], 'name': '嘉定', 'type': 'line'},
 {'data': [19, 35, 41, 44, 70, 110, 127], 'name': '黃浦', 'type': 'line'},
 {'data': [100, 98, 149, 135, 247, 228, 378], 'name': '寶山', 'type': 'line'},
 {'data': [44, 48, 65, 73, 90, 105, 198], 'name': '閘北', 'type': 'line'},
 {'data': [85, 96, 119, 155, 177, 195, 352], 'name': '普陀', 'type': 'line'},
 {'data': [70, 110, 134, 105, 202, 238, 350], 'name': '徐匯', 'type': 'line'},
 {'data': [98, 101, 152, 165, 200, 274, 366], 'name': '松江', 'type': 'line'}]

In [9] :
# 圖表參數(shù)
options = {
    'char': {'zoomType': 'xy'},
    'title': {'text': '七日內(nèi)上海城區(qū)二手物品交易量'},
    'subtitle': {'text': '圖表展示數(shù)據(jù)走勢'},
    'xAxis': {'categories': [i for i in date_gen('06-30', '07-06')]},
    'yAxis': {'text': {'text': '數(shù)量'}},
}

In [10] :
# 生成折線圖表數(shù)據(jù)
serises = [i for i in area_data_gen('line', '06-30', '07-06')]
# 展示圖表柱狀圖
charts.plot(serises, show='inline', options=options)
Out [10] :
Paste_Image.png

In [11] :
# 生成柱狀圖表數(shù)據(jù)
serises = [i for i in area_data_gen('column', '06-30', '07-06')]
# 展示圖表柱狀圖
charts.plot(serises, show='inline', options=options)
Out [11] :
Paste_Image.png

4. 總結(jié)

  • mongodb的find()方法的使用
    MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,及常規(guī) SQL 的 AND 條件
  • highcharts的圖表展示方法有各種各樣的: 折線圖 柱狀圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容