Python 数据分析 Python 数据分析 23成员

按专业描绘美国学士学位女性占比变动

饭粒儿 2017-09-25 11:04:48

以下内容转自 数析学院 http://datacademy.io/ ,只节选了部分,有需要的同学可以直接查看原文http://datacademy.io/lesson/168 使用的数据抓取自 NCES database https://nces.ed.gov/programs/digest/current_tables.asp。 NCES 数据库可以作为 Excel 文件下载,但是我们不想处理一堆 Excel 文件,所以直接使用 BeautifulSoup https://www.crummy.com/software/BeautifulSoup/ 来抓取 NCES 数据库网页。 1、获取 NCES 数据库数据 from bs4 import BeautifulSoup import requests with open('gender_degree_data.tsv', 'w') as out_file: out_file.write('\t'.join(['Year', 'Degree_Major', 'Total_Bachelors', 'Perc

...

以下内容转自 数析学院 http://datacademy.io/ ,只节选了部分,有需要的同学可以直接查看原文http://datacademy.io/lesson/168 使用的数据抓取自 NCES database https://nces.ed.gov/programs/digest/current_tables.asp。 NCES 数据库可以作为 Excel 文件下载,但是我们不想处理一堆 Excel 文件,所以直接使用 BeautifulSoup https://www.crummy.com/software/BeautifulSoup/ 来抓取 NCES 数据库网页。 1、获取 NCES 数据库数据 from bs4 import BeautifulSoup import requests with open('gender_degree_data.tsv', 'w') as out_file: out_file.write('\t'.join(['Year', 'Degree_Major', 'Total_Bachelors', 'Percent_change_Bachelors', 'Male_Bachelors', 'Female_Bachelors', 'Female_percent_Bachelors', 'Total_Masters', 'Male_Masters', 'Female_Masters', 'Total_Doctorates', 'Male_Doctorates', 'Female_Doctorates']) + '\n') table_list_response = requests.get('http://nces.ed.gov/programs/digest/current_tables.asp') table_list_response = BeautifulSoup(table_list_response.text, 'lxml') for link in table_list_response.find_all('a', href=True): # 我们只想按照学位和性别分层 if 'dt15_325' in link['href'] and int(link.text.split('.')[1]) % 5 == 0: url = 'http://nces.ed.gov/programs/digest/{}'.format(link['href']) url_response = requests.get(url) url_response = BeautifulSoup(url_response.text, 'lxml') degree_major = url_response.find('title').text.split('Degrees in') [1].split('conferred')[0].strip() all_trs = url_response.find_all('tr') for tr in all_trs: # 我们只想解析符合最近一年的条目 year_header = tr.find('th') if year_header is None: continue # 在所有年的数据被列表化后停止解析 if 'Percent change' in year_header.text: break # Years 总会有一个破折号(-) if '-' not in year_header.text: continue year = str(int(year_header.text.split('-')[0]) + 1) year_vals = [x.text.replace(',', '').replace('†', '0').replace('#', '0') for x in tr.find_all('td')] out_text = '\t'.join([year, degree_major] + year_vals) + '\n' out_file.write(out_text) 2、绘制不同专业学位女性占比 使用 matplotlib 实现可视化 %matplotlib inline import matplotlib.pyplot as plt import pandas as pd # 这是作者大部分绘图格式的自定义样式 plt.style.use('https://gist.githubusercontent.com/rhiever/a4fb39bfab4b33af0018/raw/b25b4ba478c2e163dd54fd5600e80ca7453459da/tableau20.mplstyle') degree_gender_data = pd.read_csv('gender_degree_data.tsv', sep='\t') degree_gender_data = degree_gender_data[degree_gender_data['Year'] >= 1970] degree_gender_data.set_index('Year', inplace=True) # 按照在时间序列中最后一个值排序,创建专业学位的列表 # 使用这个 list 为专业学位分配颜色 degree_major_order = degree_gender_data.groupby('Degree_Major')['Female_percent_Bachelors'].last() degree_major_order = degree_major_order.sort_values(ascending=False).index.values degree_major_order_dict = dict(zip(degree_major_order, range(len(degree_major_order)))) degree_gender_data['Degree_Major_Order'] = degree_gender_data[ 'Degree_Major'].apply(lambda major: degree_major_order_dict[major]) degree_gender_data.groupby('Degree_Major_Order')['Female_percent_Bachelors'].plot(figsize=(10, 12)) plt.xlabel('') plt.yticks(range(0, 91, 10), ['{}%'.format(x) for x in range(0, 91, 10)]) 以上内容转自 数析学院,后续内容可查看原文 http://datacademy.io/lesson/168

0
显示全文

查看更多有趣的豆瓣小组

回应

还没人回应,我来添加

推荐小组

豆瓣正在热议

豆瓣
我们的精神角落
免费下载 iOS / Android 版客户端
App 内打开