A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 上海分校-小影 于 2018-4-6 09:53 编辑

1880-2010年间全美婴儿姓名数据来源与数据集的使用1.数据的来源美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿名字频率数据。
  • 你可以用这个数据集做很多事,例如:

    • 计算指定名字(可以是你自己的,也可以是别人的)的年度比例。
    • 计算某个名字的相对排名。
    • 计算各个年度最流行的名字,以及增长最快的名字
    • 分析名字趋势: 元音, 辅音, 长度,总体多样性, 拼写变化, 首尾字母等。
    • 分析外源性趋势,圣经中的名字,名人, 人口结构变化等。


美国社会保障总署将该数据库按照年度制成了多个数据文件,其中给出了每个性别/名字组合的出生总数。这些文件的原始档案可以在下面链接中获得:
下载“National data” 文件names.zip,解压后的目录中含有一组文件(如yob1880.txt),我们用Unix的head命令查看其中一个文件的前十行(在windows上,你可以用more命令或直接在文本编辑器中打开):
由于这是一个非常标准的以逗号隔开的格式,所以可以用pandas.read_csv将其加载到DataFrame中:
这些文件中仅含有当年出现超过5次的名字。为了简单起见,我们可以用births列的sex分组小计表示该年度的births总计:
由于该数据集按年度被分隔成了多个文件,所以第一件事情就是要将所有的数据都组装到一个DataFrame里面,并加上一个year字段。使用pandas.concat即可达到这个目的:
  • 这里要注意的几件事情
    • concat默认是按行将多个DataFrame组合到一起的
    • 必须指定ignoreindex=True,因为我们不希望保留readcsv所返回的原始行号。现在我们得到了一个非常大的DataFrame,它含有全部的名字数据。

现在names在这个DataFrame对象看上去应该是如上图names结果显示的样子
有了这些数据之后,我们就可以利用groupby或pivot_table在year和sex级别上对其进行聚合了
下面我们来插入一个prop列,用于存放指定名字的婴儿数对于总出生数的比例,prop值为0.02表示每100名婴儿中有2名取了当前这个名字。因此,我们先按year和sex分组,然后再将新列加到每个分组上:
完整的数据集就有了names这些列
在执行这样的分组处理时,一般都应该做一些有效性检查,比如验证所有分组的prop的总和是否为1。由于这是一个浮点型数据,所以我们应该用np.allclose来检查这个分组总计值是否足够近似于(可能不会精确等于)1:
这样就算完活了,为了便于实现更近一步的分析,我需要取出该数据的一个子集:每对sex/year组合的前1000个名字。这又是一个分组操作:
现在的结果数据集就小多了

6 个回复

倒序浏览

在进行上述操作时,你的电脑需要具备一下重要python库:
       NumPy: 是Python科学计算的基础包。
       pandas:提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数。
       matplotlib: 是最流行的用于绘制数据图表的Python库。
回复 使用道具 举报
回复 使用道具 举报
苟利国家生死 来自手机 初级黑马 2018-4-6 22:19:52
板凳
这位就是上海校区的大牛马老师吧!关注您的技术文章根久了,很仰慕您,写得真好,透彻易懂,牛逼
回复 使用道具 举报
厉害了学习
回复 使用道具 举报
回复 使用道具 举报
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马