以下内容转自 数析学院,只节选了部分,有需要的同学可以直接查看原文
使用的数据抓取自 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)])
以上内容转自 数析学院,后续更多内容可以直接查看原文


雷达卡




京公网安备 11010802022788号







