第三周/第三节学习课程: 使用find()函数精确查找数据

1. 引言

查找某个时间的数据, 只显示特定字段
绘制七日内上海城区二手物品走势图

2. 分析

  • mongodb查找数据的方法
  • mongodb显示特定字段的方法
  • charts显示走势图的方法
  • 显示charts折线图所需要的数据格式

3. 实现

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] :
# 包含所有二级区域的列表
area_list = [i['area'][1] for i in item_info_collection.find()]
# 区域名字是唯一的集合
area_set = set(area_list)
# 输出看下是什么结果
print(len(area_set), area_set)

21 {'闵行', '奉贤', '杨浦', '旮旯', '南汇', '虹口', '静安', '金山', '浦东', '青浦', '卢湾', '长宁', '上海周边', '崇明', '嘉定', '黄浦', '宝山', '闸北', '普陀', '徐汇', '松江'}


In [4] :
# 查找特定时间的数据, 并指定显示的字段, 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不指定的话默认是显示的, 所以将其设置为0不显示, 如下为1的字段则显示, 其它都不显示
[i for i in item_info_collection.find({}, {'_id': 0, 'area': 1}).limit(5)]
Out [5] :
[{'area': ['上海', '长宁', '中山公园']},
 {'area': ['上海', '松江']},
 {'area': ['上海', '金山', '金山卫']},
 {'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] :
# 定义生成日期列表函数, 传递两个参数(起始日期, 结束日期)
def date_gen(date1, date2):
    # 起始日期
    just_date = date(2016, int(date1.split('-')[0]), int(date1.split('-')[1]))
    # 结束日期
    end_date = date(2016, int(date2.split('-')[0]), int(date2.split('-')[1]))
    # 日期增长步长
    step = timedelta(days=1)
    # 循环生成日期列表
    while just_date <= end_date:
        yield just_date.strftime('%m-%d')
        just_date += step
# 输出看下结果
[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):
    # 在区域名称集合内循环
    for area in area_set:
        # 区域出现次数列表
        area_posts = []
        # 指定时间段内循环
        for date in date_gen(date1, date2):
            # 查找特定时间特定区域的数据并生成列表
            find = list(item_info_collection.find({'update': date, 'area': area}))
            # 某一天区域出现的次数
            count = len(find)
            # 将这天区域出现的次数添加至列表
            area_posts.append(count)
        # 一个区域的图表数据, data为这几天出现的次数
        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] :
# 图表参数
options = {
    'char': {'zoomType': 'xy'},
    'title': {'text': '七日内上海城区二手物品交易量'},
    'subtitle': {'text': '图表展示数据走势'},
    'xAxis': {'categories': [i for i in date_gen('06-30', '07-06')]},
    'yAxis': {'text': {'text': '数量'}},
}

In [10] :
# 生成折线图表数据
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] :
# 生成柱状图表数据
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. 总结

  • mongodb的find()方法的使用
    MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件
  • highcharts的图表展示方法有各种各样的: 折线图 柱状图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 视频重点 练习代码 扩展 1. 视频重点 from datetime imort timedelta,date处理...
    唐宗宋祖阅读 1,186评论 0 0
  • 前天在网上看到了李笑来推荐的键盘,下单买了一个,今天货到家了,试用了一下,非常的爽,可以连接手机电脑平板,这些省了...
    一匹随机漫步的马阅读 376评论 0 0
  • 主持人:请各位查看自己的身份牌。这局游戏中,有三个狼人、四个村民、四个神职。接下来,天黑请闭眼。 主持人:预言家请...
    被窝大作战阅读 603评论 0 1
  • 我曾以为我是这个世界上最幸福的人 三年如一日,每月写下一首诗 我曾以为我是这个世界上最幸福的人 在无数个夜里仰望星...
    高壁缺阅读 157评论 0 0
  • 今天真的很气愤,一个高中女生加我,本着相逢即是有缘的理念,我同意了。 然后她居然来了句你是男的吧,我说嗯,没有女朋...
    纳怒西嘉阅读 175评论 0 0