兩個(gè)任務(wù):
1.找出每個(gè)地區(qū)銷(xiāo)售量top3座泳,并顯示出來(lái)
2.找出每種大類(lèi)的成色跟價(jià)格的折線圖
第一個(gè):每個(gè)地區(qū)的top3
成果:
代碼:
from pymongo import MongoClient
import charts
client = MongoClient()
ceshi = client['ceshi']
item_info = ceshi['item_info']
# 給定aera返回帖子數(shù)量list的生成器
def post_in_aera(aera):
pipeline = [
{'$match': {'$and': [{'time': {'$in': ['2016-08-01','2016-08-14']}},{'place': aera}]}},
{'$group': {'_id': '$cate', 'counts': {'$sum':1}}},
# 降序排列
{'$sort' : {'counts': -1}},
# 用來(lái)顯示top3
{'$limit': 3}
]
for i in item_info.aggregate(pipeline):
data = {
'name': i['_id'][0],
'data': [i['counts']],
'type': 'column'
}
yield data
# 變更aera,就可以查看特定地區(qū)的top3數(shù)量
aera = '海淀'
series = [i for i in post_in_aera(aera)]
print(series)
charts.plot(series,show="inline",options=dict(title=dict(text=aera)))
小結(jié)
這里沒(méi)啥太大的困難碳蛋,唯一的就是覺(jué)得有缺陷:作為外地人,我怎么知道北京都有哪些區(qū)?
最穩(wěn)妥的作法就是,寫(xiě)個(gè)管道边翼,篩選出來(lái)所有的區(qū)域,然后循環(huán)放進(jìn)chart函數(shù)圖里面鸣剪,生成多樣的圖组底。這樣才是程序員應(yīng)該思考的問(wèn)題。但是估計(jì)是charts不支持生成多種圖筐骇,所以沒(méi)有成功
第二個(gè):找出每種大類(lèi)的成色跟價(jià)格的折線圖
結(jié)果:
代碼:
from pymongo import MongoClient
import charts
client = MongoClient()
ceshi = client['ceshi']
item_info = ceshi['item_info']
# 數(shù)據(jù)生成器债鸡,用以生成成色的平均值,只產(chǎn)生了數(shù)值
def data_gen(date1,date2,cates):
pipeline = [
{'$match':{'$and':[{'pub_date':{'$gte':date1,'$lte':date2}},
{'cates':{'$all':cates}},
{'look':{'$nin':['-']}}
]}},
{'$group':{'_id':'$look','avg_price':{'$avg':'$price'}}},
{'$sort':{'avg_price':1}}
]
for i in item_info.aggregate(pipeline):
yield i['avg_price']
# 成色生成器铛纬,生成成色厌均,跟上個(gè)生成器一樣的,只是取出來(lái)的數(shù)據(jù)不一樣
實(shí)話說(shuō)這樣寫(xiě)很掏糞告唆,但是自己只會(huì)這么寫(xiě)
def look_gen(date1,date2,cates):
pipe = [
{'$match':{'$and':[{'pub_date':{'$gte': date1,'$lte': date2}},
{'cates': {'$all': cates}},
{'look': {'$nin':['-']}}
]}},
{'$group':{'_id':'$look','avg_price':{'$avg':'$price'}}},
{'$sort':{'avg_price':1}}
]
for i in item_info.aggregate(pipe):
yield i['_id']
# 生成charts
date1 = '2015.12.24'
date2 = '2016.01.10'
cates = ['北京二手?jǐn)?shù)碼產(chǎn)品']
data = [i for i in data_gen(date1, date2, cates)]
options = {
'title': {'text': '新舊-價(jià)格趨勢(shì)圖'},
# x軸這里生成的下標(biāo)棺弊,原先只是手寫(xiě)的,覺(jué)得比較掏糞就想著這么搞
'xAxis' : {'categories': [i for i in look_gen(date1, date2, cates)]},
'yAxis' : {'title': {'text': '價(jià)格'}},
}
charts.plot(data,show='inline', options=options)
新技能GET:
all
{'cates': {'$all': ['apple']}}
,只要cates中包含‘a(chǎn)pple’就滿足篩選條件擒悬,這個(gè)cates項(xiàng)就會(huì)被篩選出來(lái)nin
{'look': {'$nin':['-']}}
含義是模她,not in ,不包含‘-’的look項(xiàng)被篩選出來(lái)group
再次理解這個(gè)group懂牧,為什么此次的調(diào)查叫成色的平均值呢侈净?我這樣理解:9成新肯定有一批商品,只要把價(jià)格匯總起來(lái)求平均值就得到了9成新的均值(個(gè)人認(rèn)為不科學(xué),比方二手家電有9成新的電飯鍋和9成新的空調(diào)畜侦,一平均就失衡了元扔,這個(gè)先不管),又引入了平均值的求法avg
{'$group':{'_id':'$look','avg_price':{'$avg':'$price'}}},
篩選look項(xiàng)目中price的平均值夏伊,最后賦給‘a(chǎn)vg_price’這個(gè)key摇展。這個(gè)真好用,因?yàn)槟爿斎氲目赡苁亲址缬牵谷蛔约寒a(chǎn)生數(shù)值運(yùn)算了輸出csv格式
mongoexport -d ceshi -c item_details -o Users/##.csv
-d后面是數(shù)據(jù)庫(kù)的名稱(chēng)咏连,-c后面是collection的名稱(chēng),-o后面是輸出的路徑及其格式鲁森,當(dāng)然csv可以換為json.
csv是什么呢祟滴?
答:逗號(hào)分隔值(Comma-Separated Values,CSV歌溉,有時(shí)也稱(chēng)為字符分隔值垄懂,因?yàn)榉指糇址部梢圆皇嵌禾?hào)),其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本)
好吧痛垛,win不支持在jupyter中使用終端草慧,所以就算了
小結(jié)
也就是group用的6不6的狀況了
總結(jié)
整個(gè)week3都是套路,只要熟悉對(duì)數(shù)據(jù)庫(kù)的操作基本沒(méi)有什么大問(wèn)題