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
database -> pipeline -> data
不同管道有不同的作用, 有的負(fù)責(zé)篩選匹配, 有的負(fù)責(zé)聚合整合統(tǒng)計(jì), 還有的負(fù)責(zé)重新分組重新命名, 之后各管道疊加起來(lái)
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] :
4. 總結(jié)
- 管道模型就像是一層層的管子, 從數(shù)據(jù)庫(kù)中通過(guò)管道取出數(shù)據(jù)
- 這些過(guò)濾管道, 每一個(gè)都是字典的結(jié)構(gòu)