1880-2010年间全美婴儿姓名

!git clone https://github.com/wesm/pydata-book

0 导入相关库

# 基础
import numpy as np # 处理数组
import pandas as pd # 读取数据&&DataFrame
import matplotlib.pyplot as plt # 制图
import seaborn as sns
from matplotlib import rcParams # 定义参数
from matplotlib.cm import rainbow # 配置颜色%matplotlib inline
import warnings
warnings.filterwarnings('ignore') # 忽略警告信息
np.set_printoptions(precision=4) # 小数点后
pd.options.display.max_rows = 10 # 最大行数

1 读取文本文件(文件夹、TXT格式)

!ls pydata-book/datasets/babynames

!head -n 10 pydata-book/datasets/babynames/yob1880.txt

性别/名字组合的出生总数

names1880 = pd.read_csv('pydata-book/datasets/babynames/yob1880.txt',names=['name', 'sex', 'births'])
names1880

names1880.groupby('sex').births.sum()

years = range(1880, 2011)pieces = []
columns = ['name', 'sex', 'births']for year in years:path = 'pydata-book/datasets/babynames/yob%d.txt' % yearframe = pd.read_csv(path, names=columns)frame['year'] = yearpieces.append(frame)names = pd.concat(pieces, ignore_index=True)names

2 数据预处理

聚合
pd.DataFrame.pivot_table

total_births = names.pivot_table('births', index='year',columns='sex', aggfunc=sum)
total_births

total_births.plot(title='Total births by sex and year')

def add_prop(group):group['prop'] = group.births / group.births.sum()return group
names = names.groupby(['year', 'sex']).apply(add_prop)
names

names.groupby(['year', 'sex']).prop.sum()

def get_top1000(group):return group.sort_values(by='births', ascending=False)[:1000]
grouped = names.groupby(['year', 'sex'])
top1000 = grouped.apply(get_top1000)top1000

3 分析命名趋势

# 按性别分为两部分
boys = top1000[top1000.sex == 'M']
girls = top1000[top1000.sex == 'F']
# 按year name 统计的总出生透视表
total_births = top1000.pivot_table('births', index='year',columns='name',aggfunc=sum)
total_births.info()

total_births

subset = total_births[['John', 'Harry', 'Mary', 'Marilyn']]
subset.plot(subplots=True, figsize=(12, 10), grid=False,title="Number of births per year")


观察发现这几个名字目前已然日落西山

4 评估命名多样性的增长

  1. 父母越来越不愿意给小孩起常见的名字
  2. 计算最流行的1000个名字所占的比例

按year & sex去和并绘图
pd.DataFrame.pivot_table
pd.DataFrame.plot
np.linspace

table = top1000.pivot_table('prop', index='year',columns='sex', aggfunc=sum)
table.plot(title='Sum of table1000.prop by year and sex',yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))


前1000项的比例降低 -> 名字的多样性增长

3.计算占总出生人数前50%的不同名字的数量
只考虑2010年男孩的名字

df2010 = boys[boys.year == 2010]
df2010

pd.DataFrame.sort_values
pd.DataFrame.cumsum # 累计和
pd.Series.searchsorted

prop_cumsum2010 = df2010.sort_values(by='prop', ascending=False).prop.cumsum()prop_cumsum2010

prop_cumsum2010.values.searchsorted(0.5)


数组索引从0开始(即116+1)

df1900 = boys[boys.year == 1900]
prop_cumsum1900 = df1900boys[boys.year == 1900].sort_values(by='prop', ascending=False).prop.cumsum().values.searchsorted(0.5) + 1

对所有year/sex组合执行计算
按year/sex字段进行groupby处理,然后用一个函数计算各分组的值

def get_quantile_count(group, q=0.5):group = group.sort_values(by='prop', ascending=False)return group.prop.cumsum().values.searchsorted(q) + 1diversity = top1000.groupby(['year', 'sex']).apply(get_quantile_count)
diversity

pd.DataFrame.unstack # 反堆栈

diversity.unstack('sex')

diversity.unstack('sex').plot(title='Number of popular names in top 50%')


观察图可发现女孩名字的多样性总比男孩高,而且越来越高

5 “最后一个字母”的变革

last_letters = names.name.map(lambda x: x[-1])last_letters.name = 'last_letter'table = names.pivot_table('births', index=last_letters, columns=['sex', 'year'], aggfunc=sum)
table

选出具有一定代表性的三年

subtable = table.reindex(columns=[1910, 1960, 2010], level='year')
subtable

规范化处理 -> 计算出各性别各末字母占总出生人数的比例

subtable.sum()

letter_prop = subtable / subtable.sum()
letter_prop

各年度各性别条形图
pd.DataFrame.plot

fig, axes = plt.subplots(2, 1, figsize=(10, 8))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='FeMale', legend=False)

plt.tight_layout() # 最佳


观察图可知,20世纪60年代开始,以字母为’n’结尾的男孩名字出现了显著增长

按照年度和性别对table进行规范化处理,并在男孩名字中选取几个字母
进行转置后将各个列做成一个时间序列

letter_prop = table / table.sum()
letter_prop

letter_prop.loc[['d', 'n', 'y'], 'M']

letter_prop.loc[['d', 'n', 'y'], 'M'].T

letter_prop.loc[['d', 'n', 'y'], 'M'].T.plot()

6 变成女孩名字的男孩名字(以及相反的情况)

找出以’lesl’开头的名字
pd.Series.unique
str.contains

all_names = pd.Series(top1000.name.unique())
lesl_like = all_names[all_names.str.lower().str.contains('lesl')]
lesl_like

利用lesl_like过滤其他名字,并按名字分组计算出生数以查看相对频率
pd.Series.isin
pd.Series.sum

filtered = top1000[top1000.name.isin(lesl_like)]
filtered.groupby('name').births.sum()

按性别和年度进行聚合,并按年度进行规范化处理
pd.DataFrame.div
pd.DataFrame.sum

table = filtered.pivot_table('births', index='year', columns='sex', aggfunc='sum')
table = table.div(table.sum(1), axis=0)
table

table.plot(style={'M': 'k-', 'F': 'k--'})

1880-2010年间全美婴儿姓名相关推荐

  1. ch02-1880-2010年间全美婴儿姓名

    ch02-1880-2010年间全美婴儿姓名 美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿姓名频率数据.Hadley Wickham(许多流行R包的作者)经常用这份数据来演示R的 ...

  2. 利用python进入数据分析之全美婴儿姓名分析

    导入相关库 In [15]: from __future__ import division from numpy.random import randn import numpy as np imp ...

  3. 利用python进行数据分析_第二章_案例3_全美婴儿名字分析

    In [1]: import pandas as pd data_year = {} path = 'C:\\Users\\yi&lei\\Documents\\电子书\\pydata-boo ...

  4. 带大家读python数据分析一书(二)

    写在开头   怎么说呢,在看了第二章之后我也是有点小奇怪的,感觉这本书写的好像有些凌乱,不过姑且先看看吧.这一章讲的是Pandas的一个比较具体的用法,然后写和读本章的时候博主心情可能非常向吐槽,如果 ...

  5. python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...

    1880-2010年间全美婴儿姓名 用pandas.read_csv加载.txt文件 图2.1 用read_csv加载.txt文件 DataFrame.names1880中只有births这一列是in ...

  6. 第14章 数据分析案例--Python for Data Analysis 2nd

    本书正文的最后一章,我们来看一些真实世界的数据集.对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容.展示的方法适用于其它数据集,也包括你的.本章包含了一些各种各样的案例数据集,可以 ...

  7. 《利用Python进行数据分析·第2版》第14章 数据分析案例

    第 1 章 准备工作第 2 章 Python 语法基础,IPython 和 Jupyter 第 3 章 Python 的数据结构.函数和文件 第 4 章 NumPy 基础:数组和矢量计算 第 5 章 ...

  8. 理解pandas的groupby().apply()

    在<利用Python进行数据分析>第2章1880-2011年间全美婴儿姓名例子中,有一段代码: def add_prop(group):births = group.births.asty ...

  9. 利用python进行数据分析(第二版)_第十四章

    本书正文的最后一章,我们来看一些真实世界的数据集.对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容.展示的方法适用于其它数据集,也包括你的.本章包含了一些各种各样的案例数据集,可以 ...

  10. python数据分析学习随笔(二)

    1880-2010年间全美婴儿姓名数据 美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿名字频率数据, 由于这是一个非常标准的以逗号隔开的格式,所以可以用pandas.read_cs ...

最新文章

  1. python无法处理特别大的数据文件_Python实现快速大文件比较代码解析
  2. python列表的解析(转)
  3. JSTL标准标签库的国际化标签
  4. MathExam任务一
  5. 关于SQLserver 的windows验证
  6. android+模拟器+ram,Android模拟器RAM修改方法 - 尤其是3.0
  7. “绿色高效 模块智能”金融业数据中心系列规范发布会将于12月7日召开
  8. DedeCMS Error:Tag disabled:php的解决办法
  9. hive 建表java_hive创建表报错
  10. 通过两点求圆心的公式
  11. 用认知和人性来做最棒的程序员
  12. 4 Day:MBR使用硬盘
  13. 构造函数中慎用memset
  14. 【Idea】人工智能编程他来了,Idea集成一款和ChatGPT一样智能的编码辅助神器
  15. 2.1 Converting Celsius to Fahrenheit
  16. 初学AE影视后期的电脑硬件配置知识…
  17. 原始投资100美元,C语言实现单利息投资和复合利息投资
  18. HighNewTech:来到了21世纪的第3个十年,各行业数字化迫在眉睫,全民编程也势不可挡。但,问题来了,编程,一定需要写代码么?那么,传说中的iVX工具,与编程到底又有什么暧昧关系?
  19. 脱欧协议在英议会遇惨败:首相面临逼宫 欧盟表遗憾
  20. 参加ACM经历及总结

热门文章

  1. 手把手教你进行Python网络爬虫中的Charles+Postern抓包
  2. Oracle表空间增加方法
  3. 大一到大二的总结与感想
  4. error: You must be logged in to the server (Unauthorized)
  5. 打开我的计算机我的文档不见,我电脑桌面上的我的文档不见了,是什么原因造成我的文档不见了呢?是? 爱问知识人...
  6. 国家图书馆最新推荐70本书
  7. wordpress企业网站主题
  8. LVS配合piranha安装使用
  9. 十进制转二进制,短除法与位运算两种方法
  10. 安装VS2010旗舰版时出现.Net framework4.0,安装失败