美文网首页
分析数据:深入篇

分析数据:深入篇

作者: 泠泠七弦客 | 来源:发表于2016-08-17 13:47 被阅读0次

    本次主要目的是将数据分析展示出来,分析的数据是['北京二手手机', '北京二手笔记本', '北京二手电脑']三项在连续七天内的发帖量。

    成果:


    取三种商品在过去7天内的发帖量

    代码:
    这里有几个步骤

    • 处理数据

    1.自己的数据有些问题,首先这个cate类自己是['北京二手','北京二手手机','北京二手手机详情'],这样的话在以后find()的时候会有困难,所以就净化了数据,提取索引为1的替换掉整个list

    # 将cate中的数据切片出去,原先的数据有3个,取第2个,来代替所有的
    for i in item_info.find({}, {'cate': {'$slice': [2,1]}}):
        cate = i['cate']
        item_info.update_one({'_id':i['_id']}, {'$set': {'cate': cate}})
    # 注意这个update更改数据库的操作
    # 个人觉得这个'_id': i['_id']很巧妙地把所有的数据都选中了
    

    2.日期有点问题,我的是[month-day],但是如果不是[year-month-day]格式,在之后用date函数的时候会多些处理,所以就通过更改数据库变成标配:

    # 日期原先是[month, day]格式,现在转为[年,月,日]格式,便于之后的套路
    for i in item_info.find({}, {'time': 1}):
        time = '2016-'+ i['time']
        item_info.update_one({'_id':i['_id']}, {'$set': {'time': time}})
    

    期间发现少量数据没有日期,就删除掉了,如下:

    for i in item_info.find({},{'time': 1}):
        if len(i['time']) <= 1:
            item_info.delete_one(i)
    

    其实觉得这个操作有风险,后来想了想,其实无所谓啊,如果日期没有那就选不到啊,删除没什么用

    • 构造生成器函数

    1.日期输出的生成器

    # 函数大概的意思就是输出str日期(计算机只知道它是字符串),经过转化输出日期(依旧是字符串)
    # 但是不同的是,输入的str经过data一系列的处理,计算机知道这是日期了
    # 对于之后的日期操作就方便多了
    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是格式化输出函数
            yield (the_date.strftime('%Y-%m-%d'))
            the_date = the_date + days
    

    2.构造指定商品的生成器

    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)
                # 统计所有cate类的特定日期下的发帖数量
                cate_day_posts.append(each_day_post)
            # 这里的data组装为了highcharts的使用
            data = {
                'name': cate,
                'data': cate_day_posts,
                'type': 'line'
            }
            yield data
    

    3.输出数据

    options = {
        'chart': {'zoomType': 'xy'},
        'title': {'text': '发帖量统计'},
        'subtitle': {'text': '可视化统计图标'},
        # 这里列表是坐标横轴的名称,就用生成器给个日期轴
        'xAxis': {'categories': [i for i in get_all_dates('2016-08-08', '2016-08-15')]},
        'yAxis': {'title': {'text': '数量'}}
    }
    
    series = [i for i in get_data_within('2016-08-08', '2016-08-15', ['北京二手手机','北京二手笔记本','北京二手电脑'])]
    
    charts.plot(series, options=options, show='inline')
    

    发现生成器真是个好东西!

    新技能GET:

    1.collection.find({}, {})
    第一个{}中填写匹配的项目如{’name‘: 'long'},然后通过迭代就出现所有匹配的document,第二个{}是填写需要显示的项目,通过布尔值来告诉软件是显示还是不显示,0代表不显示,1代表显示,缺省默认是1,如:
    item_info.find({'cate': '北京二手笔记本'},{'_id': 0, 'url': 0, 'state': 0, 'time': 0}),
    这些操作不会对数据库造成影响。
    2.from datetime import date
    中,date(2016,2,3)会生成2016.2.3,这个是系统能识别的时间
    3.切片使用
    数据库item_info有个元素是'cate': ['0','1','2','3'],只是想显示'2'怎么办呢?
    item_info.find({},{'cate': {$slice: [index1,index2]}})
    这样,index1表示从哪个索引开始,index2表示从开始的地方选取几个,包括开始的元素。如选取'2',就是[2,1],如果选取'1','2',就是[1,2]
    这种形式的切片是很多数据库用的,跟Python切片还不大一样

    天坑:

    本次没有,基本就是数据库格式的不对劲而引起的,以后注意就行

    总结:

    还是套路,
    唯一要掌握并多多练习的东西就是:数据都有了,怎么去构造自己想要的信息?

    相关文章

      网友评论

          本文标题:分析数据:深入篇

          本文链接:https://www.haomeiwen.com/subject/gqsmsttx.html