今天是4.26号。
自从自己3月17号决定开始在这里记录学习开始,一晃就是一个月零十天了。这些天里进步了吗,有一点,其他情况也有了一点好转,但谈不上令自己喜笑颜开。晚上8点多的时候,投的yy实习有了回音,让与相关人员进一步沟通。加上qq联系方式后问了几句工作的相关内容,然后那边突然问道,你现在是研究生吧?这份实习的工作都是一些基础的,难道你不准备找一个专业性更强一点的实习岗位吗?我一下愣住了,说实话自己被戳到痛点了,没有核心竞争力,现在要想找一个专业性强一点的实习根本找不到,如实给那边说了一下情况。但又能怎样,多多学校多多实践吧。
还有昨天下午,来到实验室发现去年买的鞋穿了不到一年坏了,该死的,便宜总是没有好货,搞的自己现在完全不敢在网上买鞋。
今天学习jupyter notebook的相关知识,即以前的ipython notebook。其主要内容是根据相应要求对mongodb中的数据实现可视化。
(1)导入之前抓取下来的json数据,方法见学习日记6中的第6点。
(2)明确要求,要求绘制指定日期段(2015.12.27-2016.1.17),指定区域('海淀','朝阳'等)的每天的发帖量。
(3)分析思路:先得到起始和截止日期之间的所有日期,以作为绘制折线图时的横坐标。再根据日期,和地区,使用find函数找到相应记录,并统计发帖量。
(4)难点在于:
a). 数据库中日期是以字符串格式而不是日期型格式储存的,而且不能使用date(s)直接将字符串s转化为日期类型。因此要from datetime import date,timedelta,然后设计相应函数,返回起始日期到结束日期之间的所有天数。
def get_all_date(date1,date2):
start_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 start_date <= end_date:
yield (start_date.strftime('%Y.%m.%d'))
start_date = start_date+days
其中date,timedelta的用法为:
b=date(2015,2,16)
print(b)结果为:2015-2-16,而不能是a='2015-2-16',date(a)这是错误的。
timedelta代表两个datetime之间的时间差,
由于date类型数据是不支持直接相加减的,但可以利用timedelta进行操作,如上面的 start_date = start_date+days。
此外strftime('%Y.%m.%d')后面的('%Y.%m.%d')其中的大小写要注意,否则会导致错误。
b).在jupyter 中经常涉及到生成器yield()的使用,他的作用是生成所有()里的值,不管是列表还是字典。注意它只生成但并不返回,所以要调用生成的数据时,可以用for i in xxx(),其中xxx()为包含yield的函数。而要让生成的数据转换成列表中数据,可以用[i for i in xxx()],不能直接用list(xxx()),也是因为xxx()并不返回数据
c).根据相应的要求生成相应的图表
options={
'chart':{'zoomtype':'xy'},
'title':{'text':'北京地区二手物品发帖量'},
'subtitle':{'text':'统计分析表'},
'xAxis':{'categories':[i for i in get_all_date('2015.12.24','2016.01.09')]},
'yAxis':{'title':{'text':'数量'}}
}
charts.plot(series,options,show='inline')
一般带有日期型的数据展示时用折线图,不带日期型的可以用直方图或者饼图。不同的图表类型通过data中的type来进行设置。
data={
'name':area,
'data':area_day_posts, #注意data必须是list类型,即使只有一个数据,如[]
'type':'line'
}
最后的结果如下图所示: