第三周/第四節(jié)課程: 使用聚合管道高效查找數(shù)據(jù)

1. 引言

統(tǒng)計(jì)某日發(fā)布的二手物品在隨后七天內(nèi), 交易完成時(shí)間是一天的類目分布占比.
也就是有哪些類目當(dāng)天發(fā)布當(dāng)天就有人買了.

2. 分析

  • 利用管道模型聚合數(shù)據(jù)
    collection.aggregate(pipeline)
    有這么多過(guò)慮管道, 每個(gè)管道都是一個(gè)字典的結(jié)構(gòu), 常用的為$match``$group``$sort``$limit
    Paste_Image.png

database -> pipeline -> data
不同管道有不同的作用, 有的負(fù)責(zé)篩選匹配, 有的負(fù)責(zé)聚合整合統(tǒng)計(jì), 還有的負(fù)責(zé)重新分組重新命名, 之后各管道疊加起來(lái)


Paste_Image.png

3. 實(shí)現(xiàn)

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

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

In [3] :
# 查看下源數(shù)據(jù)
[i for i in item_info.find().limit(3)]
Out [3] :
[{'_id': ObjectId('5698f524a98063dbe9e91ca8'),
  'area': ['朝陽(yáng)', '高碑店'],
  'cates': ['北京58同城', '北京二手市場(chǎng)', '北京二手家電', '北京二手冰柜'],
  'look': '-',
  'price': 450,
  'pub_date': '2016.01.12',
  'time': 0,
  'title': '【圖】95成新小冰柜轉(zhuǎn)讓 - 朝陽(yáng)高碑店二手家電 - 北京58同城',
  'url': 'http://bj.58.com/jiadian/24541664530488x.shtml'},
 {'_id': ObjectId('5698f525a98063dbe4e91ca8'),
  'area': ['朝陽(yáng)', '定福莊'],
  'cates': ['北京58同城', '北京二手市場(chǎng)', '北京二手家電', '北京二手洗衣機(jī)'],
  'look': '-',
  'price': 1500,
  'pub_date': '2016.01.14',
  'time': 2,
  'title': '【圖】洗衣機(jī),小冰箱,小冰柜命黔,冷飲機(jī) - 朝陽(yáng)定福莊二手家電 - 北京58同城',
  'url': 'http://bj.58.com/jiadian/24349380911041x.shtml'},
 {'_id': ObjectId('5698f525a98063dbe7e91ca8'),
  'area': ['朝陽(yáng)', '望京'],
  'cates': ['北京58同城', '北京二手市場(chǎng)', '北京二手臺(tái)式機(jī)/配件'],
  'look': '-',
  'price': 1500,
  'pub_date': '2015.12.27',
  'time': 3,
  'title': '【圖】三星 A5 白色 沒(méi)有打開(kāi)過(guò) - 朝陽(yáng)望京臺(tái)式機(jī)/配件 - 北京58同城',
  'url': 'http://bj.58.com/diannao/24475337853109x.shtml'}]

In [4] :
# 定義pipeline模型
pipeline = [
    # 大于某個(gè)日期小于某個(gè)日期且3天內(nèi)完成成交的
    # {'$match': {'$and': [{'pub_date': {'$gt': '2015.12.24', '$lt': '2015.12.26'}}, {'time': 3}]}},
    # 發(fā)布日期為'2015.12.24'且3天內(nèi)完成成交的
    {'$match': {'$and': [{'pub_date': '2015.12.24'}, {'time': 3}]}},
    # 以源數(shù)據(jù)的'price'字段分組, 且統(tǒng)計(jì)其出現(xiàn)次數(shù), 出現(xiàn)一次則加1, '$sum'后的數(shù)字是多少就加多少
    {'$group': {'_id': '$price', 'counts': {'$sum': 1}}},
    # 排序, 指定以什么字段排序, 1為從低到高, -1為從高到低
    {'$sort': {'counts': -1}},
    # 限制顯示多少條數(shù)據(jù)
    {'$limit': 10},
]

In [5] :
[i for i in item_info.aggregate(pipeline)]
Out [5] :
[{'_id': 0, 'counts': 14},
 {'_id': 1000, 'counts': 11},
 {'_id': 300, 'counts': 7},
 {'_id': 100, 'counts': 6},
 {'_id': 50, 'counts': 5},
 {'_id': 1800, 'counts': 5},
 {'_id': 700, 'counts': 4},
 {'_id': 200, 'counts': 4},
 {'_id': 350, 'counts': 4},
 {'_id': 3000, 'counts': 3}]

In [6] :
# 定義pipeline模型
pipeline2 = [
    {'$match': {'$and': [{'pub_date': '2015.12.28'}, {'time': 1}]}},
    {'$group': {'_id': {'$slice': ['$cates', 2, 1]}, 'counts': {'$sum': 1}}},
    {'$sort': {'counts': -1}},
]

In [7] :
# 打印看下管道模型的輸出結(jié)果
[i for i in item_info.aggregate(pipeline2)]
Out [7] :
[{'_id': ['北京二手家電'], 'counts': 40},
 {'_id': ['北京二手服裝/鞋帽/箱包'], 'counts': 21},
 {'_id': ['北京二手母嬰/兒童用品'], 'counts': 18},
 {'_id': ['北京二手圖書(shū)/音像/軟件'], 'counts': 17},
 {'_id': ['北京二手臺(tái)式機(jī)/配件'], 'counts': 15},
 {'_id': ['北京二手辦公用品/設(shè)備'], 'counts': 14},
 {'_id': ['北京二手文體/戶外/樂(lè)器'], 'counts': 12},
 {'_id': ['北京二手?jǐn)?shù)碼產(chǎn)品'], 'counts': 10},
 {'_id': ['北京二手手機(jī)'], 'counts': 8},
 {'_id': ['北京二手筆記本'], 'counts': 6},
 {'_id': ['北京其他二手物品'], 'counts': 6},
 {'_id': ['北京二手平板電腦'], 'counts': 5}]

In [8] :
# 定義函數(shù)方便快速生成圖表數(shù)據(jù)
def time_data_gen(date, time):
    # 定義管道模型
    pipeline = [
        {'$match': {'$and': [{'pub_date': date}, {'time': time}]}},
        {'$group': {'_id': {'$slice': ['$cates', 2, 1]}, 'counts': {'$sum': 1}}},
        {'$sort': {'counts': -1}},
    ]
    # 生成所有數(shù)據(jù)
    for i in item_info.aggregate(pipeline):
        yield [i['_id'][0], i['counts']]
# 輸出看下結(jié)果        
[i for i in time_data_gen('2015.12.28', 1)]
Out [8] :
[['北京二手家電', 40],
 ['北京二手服裝/鞋帽/箱包', 21],
 ['北京二手母嬰/兒童用品', 18],
 ['北京二手圖書(shū)/音像/軟件', 17],
 ['北京二手臺(tái)式機(jī)/配件', 15],
 ['北京二手辦公用品/設(shè)備', 14],
 ['北京二手文體/戶外/樂(lè)器', 12],
 ['北京二手?jǐn)?shù)碼產(chǎn)品', 10],
 ['北京二手手機(jī)', 8],
 ['北京二手筆記本', 6],
 ['北京其他二手物品', 6],
 ['北京二手平板電腦', 5]]

In [9] :
# 圖表參數(shù)
options = {
    'char': {'zoomType': 'xy'},
    'title': {'text': '發(fā)帖量統(tǒng)計(jì), 好看又好玩'},
    'subtitle': {'text': '某日發(fā)布的二手物品在隨后七天內(nèi), 交易完成時(shí)間是一天的類目分布占比'},
}

In [10] :
# 圖表數(shù)據(jù)
serises = {
    'type': 'pie',
    'data': [i for i in time_data_gen('2015.12.28', 1)],
    'name': 'One day',
}
# 輸出餅狀圖表
charts.plot(serises, show='inline', options=options)
Out [10] :
Paste_Image.png

4. 總結(jié)

  • 管道模型就像是一層層的管子, 從數(shù)據(jù)庫(kù)中通過(guò)管道取出數(shù)據(jù)
  • 這些過(guò)濾管道, 每一個(gè)都是字典的結(jié)構(gòu)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僵驰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子控嗜,更是在濱河造成了極大的恐慌茧彤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疆栏,死亡現(xiàn)場(chǎng)離奇詭異曾掂,居然都是意外死亡惫谤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)珠洗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溜歪,“玉大人,你說(shuō)我怎么就攤上這事许蓖『恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蛔糯,是天一觀的道長(zhǎng)拯腮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蚁飒,這世上最難降的妖魔是什么动壤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮淮逻,結(jié)果婚禮上琼懊,老公的妹妹穿的比我還像新娘。我一直安慰自己爬早,他們只是感情好哼丈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著筛严,像睡著了一般醉旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桨啃,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天车胡,我揣著相機(jī)與錄音,去河邊找鬼照瘾。 笑死匈棘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析命。 我是一名探鬼主播主卫,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹃愤!你這毒婦竟也來(lái)了簇搅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤软吐,失蹤者是張志新(化名)和其女友劉穎馍资,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟蟹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年乌妙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建钥。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡藤韵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熊经,到底是詐尸還是另有隱情泽艘,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布镐依,位于F島的核電站匹涮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏槐壳。R本人自食惡果不足惜然低,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望务唐。 院中可真熱鬧雳攘,春花似錦、人聲如沸枫笛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刑巧。三九已至喧兄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啊楚,已是汗流浹背吠冤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留特幔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓闸昨,卻偏偏與公主長(zhǎng)得像蚯斯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饵较,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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