python 计量经济学案例分析_python数据分析案例(三)

数据来源:https://pan.baidu.com/s/1MUqs391emlIUsf_wyX2GAg#list/path=%2F

密码:utbp

第一部分 按性别/年份统计出生数

思路:加载所有txt文件并进行整合,创建数据透视表,运用DataFrame内置绘图

step1

import pandas as pd
years=range(1880, 2011)
babynames = []
#建立列表,以存放多个DataFrame
for year in years:
    frame = pd.read_csv(r'C:UsersAdministratorDownloadspydata-book-2nd-editiondatasetsbabynamesyob%d.txt'% year, names=['name','gender','births'])
    frame['year'] = year
    #新增year列
    babynames.append(frame)
names = pd.concat(babynames, ignore_index=True)
#去除原DataFrame中的索引

step2

table=names.pivot_table('births',index='year',columns='gender',aggfunc='sum')
#需要指定具体对象——names,创建按性别/年度统计的出生数
table.head()
gender         F        M
year
1880       90993   110493
1881       91955   100748
1882      107851   113687
1883      112322   104632
1884      129021   114445
#观测前五行数据

step3

table.plot()
#使用DataFrame内置绘图

第二部分 按性别/年份统计各名字使用数占比

思路:定义函数,新增占比列,进行有效性检查

step1

def add_prop(group):
    group['prop'] = group['births'] / group['births'].sum()
    return group
#定义函数add_prop
data=names.groupby(['year', 'gender']).apply(add_prop)
#根据names中的year和gender为分组键,调用函数
data.tail()
              name  gender  birth  year      prop
1690779    Zymaire       M      5  2010  0.000003
1690780     Zyonne       M      5  2010  0.000003
1690781  Zyquarius       M      5  2010  0.000003
1690782      Zyran       M      5  2010  0.000003
1690783      Zzyzx       M      5  2010  0.000003

step2

data.groupby(['year', 'gender'])['prop'].sum()[:5]
year  gender
1880  F         1.0
      M         1.0
1881  F         1.0
      M         1.0
1882  F         1.0
#检查分类后的prop列总和是否为1

第三部分 各个名字流行度分析

思路:在names基础上,按年份/性别进行分组处理保留每组出生数为前1000名的数据行,以此创建数据透视表,分析每个名字在每一年的使用数量及男女出生数

step1

def get_top1000(group):
    return group.sort_values(by='births', ascending=False)[:1000]
    #如果直接使用sort_values,只会获得一个series,所有数据中的前1000个
grouped = data.groupby(['year', 'gender'])
#data为names加上'prop'列
top1000 = grouped.apply(get_top1000)
#取分组后的每组前1000个名字
top1000.reset_index(inplace=True, drop=True)

step2

table1=top1000.pivot_table('births', index='year',columns='name',aggfunc='sum')
#针对按性别/年份分组后的每组的前1000个名字创建数据透视表,得到每年各个名字的取名数

step3

name1=table1[['Peter','Mike','Tom','Nancy']]
name1.plot()
#取几个名字,绘制线图,观察取名数随时间的变化趋势

第四部分 名字的多样性分析

思路:分析每年前1000个流行名字男/女在总人数中的占比趋势

step1

table2=top1000.pivot_table('prop',index='year',columns='gender',aggfunc='sum')
#针对按性别/年份分组后的每组的前1000个名字创建数据透视表,分别计算每年男/女名字数占比总和

step2

table2.plot
#根据时间变化,前1000个取名数最多的占比数量明显下降,可以看出名字的多样性出现了增长

第五部分 所有名字末字母的分布变化

思路:定义函数获得名字的末字母,创建数据透视表,并将末字母作为索引行

step1 数据映射

get_last_letter = lambda x: x[-1]
#定义函数,可获得字段的末字母
last_letters = data['name'].map(get_last_letter)
last_letters[:5]
0    y
1    a
2    a
3    h
4    e

step2

table3=names.pivot_table('births',index=last_letters,columns=['gender', 'year'], aggfunc='sum')
#每一年男/女末字母对应取名数

table4=data3 / data3.sum()
#每一年男/女对应字母取名数/每一年男/女总出生数

table4['F'].loc[['n','t','e']].T.head()
name         n        t        e
year
1880  0.033057 0.023650 0.366819
1881  0.032179 0.023544 0.370616
1882  0.033157 0.022244 0.374582
1883  0.034161 0.022738 0.373159
1884  0.034932 0.021896 0.372722
#取前五行['n','t''e']末字母取名情况,并进行转置

step3

table4['F'].loc[['n','t','e']].T.plot()
#女孩末字母取名趋势
table4['M'].loc[['n','t','e']].T.plot()
#男孩末字母取名趋势

Original: https://blog.csdn.net/weixin_29476767/article/details/112453360
Author: 游龙浴火
Title: python 计量经济学案例分析_python数据分析案例(三)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/677995/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球