本次主要目的是將數(shù)據(jù)分析展示出來,分析的數(shù)據(jù)是['北京二手手機(jī)', '北京二手筆記本', '北京二手電腦']三項(xiàng)在連續(xù)七天內(nèi)的發(fā)帖量移迫。
成果:
代碼:
這里有幾個(gè)步驟
-
處理數(shù)據(jù)
1.自己的數(shù)據(jù)有些問題旺嬉,首先這個(gè)cate類自己是['北京二手','北京二手手機(jī)'起意,'北京二手手機(jī)詳情']鹰服,這樣的話在以后find()的時(shí)候會有困難,所以就凈化了數(shù)據(jù)揽咕,提取索引為1的替換掉整個(gè)list
# 將cate中的數(shù)據(jù)切片出去,原先的數(shù)據(jù)有3個(gè),取第2個(gè)套菜,來代替所有的
for i in item_info.find({}, {'cate': {'$slice': [2,1]}}):
cate = i['cate']
item_info.update_one({'_id':i['_id']}, {'$set': {'cate': cate}})
# 注意這個(gè)update更改數(shù)據(jù)庫的操作
# 個(gè)人覺得這個(gè)'_id': i['_id']很巧妙地把所有的數(shù)據(jù)都選中了
2.日期有點(diǎn)問題亲善,我的是[month-day],但是如果不是[year-month-day]格式,在之后用date函數(shù)的時(shí)候會多些處理逗柴,所以就通過更改數(shù)據(jù)庫變成標(biāo)配:
# 日期原先是[month, day]格式蛹头,現(xiàn)在轉(zhuǎn)為[年,月戏溺,日]格式渣蜗,便于之后的套路
for i in item_info.find({}, {'time': 1}):
time = '2016-'+ i['time']
item_info.update_one({'_id':i['_id']}, {'$set': {'time': time}})
期間發(fā)現(xiàn)少量數(shù)據(jù)沒有日期,就刪除掉了旷祸,如下:
for i in item_info.find({},{'time': 1}):
if len(i['time']) <= 1:
item_info.delete_one(i)
其實(shí)覺得這個(gè)操作有風(fēng)險(xiǎn)耕拷,后來想了想,其實(shí)無所謂啊托享,如果日期沒有那就選不到啊骚烧,刪除沒什么用
-
構(gòu)造生成器函數(shù)
1.日期輸出的生成器
# 函數(shù)大概的意思就是輸出str日期(計(jì)算機(jī)只知道它是字符串),經(jīng)過轉(zhuǎn)化輸出日期(依舊是字符串)
# 但是不同的是闰围,輸入的str經(jīng)過data一系列的處理赃绊,計(jì)算機(jī)知道這是日期了
# 對于之后的日期操作就方便多了
def get_all_dates(date1, date2):
the_date = date(int(date1.split('-')[0]), int(date1.split('-')[1]), int(date1.split('-')[2]))
end_date = date(int(date2.split('-')[0]), int(date2.split('-')[1]), int(date2.split('-')[2]))
days = timedelta(days=1)
while the_date <= end_date:
# strftime是格式化輸出函數(shù)
yield (the_date.strftime('%Y-%m-%d'))
the_date = the_date + days
2.構(gòu)造指定商品的生成器
def get_data_within(date1, date2, cates):
for cate in cates:
cate_day_posts = []
for date in get_all_dates(date1, date2):
a = list(item_info.find({'time': date, 'cate': cate}))
each_day_post = len(a)
# 統(tǒng)計(jì)所有cate類的特定日期下的發(fā)帖數(shù)量
cate_day_posts.append(each_day_post)
# 這里的data組裝為了highcharts的使用
data = {
'name': cate,
'data': cate_day_posts,
'type': 'line'
}
yield data
3.輸出數(shù)據(jù)
options = {
'chart': {'zoomType': 'xy'},
'title': {'text': '發(fā)帖量統(tǒng)計(jì)'},
'subtitle': {'text': '可視化統(tǒng)計(jì)圖標(biāo)'},
# 這里列表是坐標(biāo)橫軸的名稱,就用生成器給個(gè)日期軸
'xAxis': {'categories': [i for i in get_all_dates('2016-08-08', '2016-08-15')]},
'yAxis': {'title': {'text': '數(shù)量'}}
}
series = [i for i in get_data_within('2016-08-08', '2016-08-15', ['北京二手手機(jī)','北京二手筆記本','北京二手電腦'])]
charts.plot(series, options=options, show='inline')
發(fā)現(xiàn)生成器真是個(gè)好東西羡榴!
新技能GET:
1.collection.find({}, {})
第一個(gè){}中填寫匹配的項(xiàng)目如{’name‘: 'long'}碧查,然后通過迭代就出現(xiàn)所有匹配的document,第二個(gè){}是填寫需要顯示的項(xiàng)目校仑,通過布爾值來告訴軟件是顯示還是不顯示忠售,0代表不顯示者冤,1代表顯示,缺省默認(rèn)是1档痪,如:
item_info.find({'cate': '北京二手筆記本'},{'_id': 0, 'url': 0, 'state': 0, 'time': 0})
,
這些操作不會對數(shù)據(jù)庫造成影響涉枫。
2.from datetime import date
中,date(2016,2,3)
會生成2016.2.3
腐螟,這個(gè)是系統(tǒng)能識別的時(shí)間
3.切片使用
數(shù)據(jù)庫item_info有個(gè)元素是'cate': ['0','1','2','3']
愿汰,只是想顯示'2'怎么辦呢?
item_info.find({},{'cate': {$slice: [index1,index2]}})
這樣乐纸,index1表示從哪個(gè)索引開始衬廷,index2表示從開始的地方選取幾個(gè),包括開始的元素汽绢。如選取'2'吗跋,就是[2,1],如果選取'1','2'宁昭,就是[1,2]
這種形式的切片是很多數(shù)據(jù)庫用的跌宛,跟Python切片還不大一樣
天坑:
本次沒有,基本就是數(shù)據(jù)庫格式的不對勁而引起的积仗,以后注意就行
總結(jié):
還是套路疆拘,
唯一要掌握并多多練習(xí)的東西就是:數(shù)據(jù)都有了,怎么去構(gòu)造自己想要的信息寂曹?