利用Python进行数据分析 - 引言のusa.gov数据示例

概述

该系列是关于《利用Python进行数据分析》的学习笔记,对应 引言 > 来自bit.ly的1.usa.gov数据 部分。

来自bit.ly的1.usa.gov数据

注意:该部分使用了《利用Python进行数据分析》的数据,可以去pydata-book - github下载数据。另外,使用Spyder进行该次实验,记得将文件目录设置为对应的pydata-book

下列代码用来载入数据,了解数据格式:

# 数据集对应路径
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
# 显示数据集的第一行
open(path).readline()
# 此处应该可以看到一长串字符串,为JSON格式

下列代码使用Python中内置的JSON库,将上述JSON格式的字符串转化为Python的字典对象:

import json
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt'
records = [json.loads(line) for line in open(path)]  # 转化为Python的字典对象
records[0]  # 检查第一条记录

对时区进行计数(纯Python代码)

该部分用来对上述数据集中的时区字段(tz字段)进行计数。

# 导入数据,并转化为Python字典对象

# 下列代码会报错,因为并不是所有记录都有'tz'这个字段
# time_zones = [rec['tz'] for rec in records]

time_zones = [rec['tz'] for rec in records if 'tz' in rec]
# 检查数据集中时区字段的前十个
time_zones[:10]

之后再使用纯Python代码对time_zones进行计数,思路是遍历字典慢慢数

def get_counts(sequence):
    counts = {}
    for x in sequence:
        if x in counts:
            counts[x] += 1
        else:
            counts[x] = 1
    return counts

或者,使用Python的标准库defaultdict :

from collections import defaultdict

def get_counts(sequence):
    counts = defaultdict(int)  # 所有的值均会被初始化为0
    for x in sequence:
        counts[x] += 1
    return counts

注意defaultdict的特性可以参见The Python Standard Library。简单来说,就是会用特定类型的默认值初始化第一次出现的键。

之后,进行测试:

counts = get_counts(time_zones)
counts['America/New_York']  # 检查New York这个时区的计数情况

如果想得到时区计数的前十名及对应的时区,可以使用如下代码:

def top_counts(count_dict, n=10):
    value_key_pairs = [(count, tz) for tz, count in count_dict.items()]
    value_key_pairs.sort()
    return value_key_pairs[-n:]

top_counts(counts)

当然,你也可以使用Python标准库collections.Counter来完成上述任务:

from collections import Counter
counts = Counter(time_zones)  # 计数
counts.most_common(10)  # 计数前十

注意,可以参见The Python Standard Library了解更多关于Counter的细节。

使用pandas对时区进行计数

实现对时区的计数,只需要如下代码:

from pandas import DataFrame, Series
import pandas as ps
import numpy as np

frame = DataFrame(records)
print frame  # 检视frame,一长串。这被称为frame的摘要视图(summary view)

# frame['tz']返回的为Series对象
# Series对象的value_counts方法会对其进行计数
tz_counts = frame['tz'].value_counts()

下面我们用这段数据生成一张图片:

clean_tz = frame['tz'].fillna('Missing')  # 用`Missing`替换缺失值
clean_tz[clean_tz == ''] = 'Unknown'  # 用`Unknown`替换空白值

tz_counts = clean_tz.value_counts()
print tz_counts[:10]  # 检视计数的前十项
tz_counts[:10].plot(kind='barh', rot=0)  # 绘图,可视化的方式展示前十项
tz_counts.png

注意,Spyder中更改下设置,可以避免每次都要手动引入NumPy及Matploylib。具体来说,将Spyder > Tools > Preferences > IPython console > Graphics中Support for graphicsAutomatically load Pylab and NumPy modules勾选上。

为熟悉pandas,我们再来看看字段a,该字段含有执行URL短缩操作的浏览器、设备、应用程序的相关信息:

frame['a'][1]
# u'GoogleMaps/RochesterNY'
frame['a'][59]
# u'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176'

我们现在来统计按Windows和非Windows用户对时区统计信息进行分解,为简单起见,我们假定字段a中含有"Windows"就认为该用户为Windows用户,反之就认为为非Windows用户。

cframe = frame[frame.a.notnull()]  # 剔除字段`a`为空的数据
# 根据字段`a`分为Windows用户和非Windows用户
operating_system = np.where(cframe['a'].str.contains('Windows'),
                                              'Windows', 'Not Windows')
# 根据时区和操作系统信息进行分组
by_tz_os = cframe.groupby(['tz', operating_system])
# size对分组结果进行计数
# unstack对计数结果进行重塑
agg_counts = by_sz_os.size().unstack().fillna(0)

最后,我们来选取最常出现的时区:

# 用于按升序排列
indexer = agg_counts.sum(1).argsort()
count_subset = agg_counts.take(indexer)[-10:]
# 生成一张堆积条形图
count_subset.plot(kind='barh', stacked=True)

# 生成对应的比例图
normed_subset = count_subset.div(count_subset.sum(1), axis=0)
normed_subset.plot(kind='barh', stacked=True)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容