任务要求
-
读入美国总统选举政治献金数据文件,合并三个文件的数据
-
查看数据基本信息
-
缺失值处理,(填充 ‘NOT PROVIDE’)
-
通过给定字典,添加候选人对应党派信息
parties = {
‘Bachmann, Michelle’: ‘Republican’,
‘Romney, Mitt’: ‘Republican’,
‘Obama, Barack’: ‘Democrat’,
“Roemer, Charles E. ‘Buddy’ III”: ‘Republican’,
‘Pawlenty, Timothy’: ‘Republican’,
‘Johnson, Gary Earl’: ‘Republican’,
‘Paul, Ron’: ‘Republican’,
‘Santorum, Rick’: ‘Republican’,
‘Cain, Herman’: ‘Republican’,
‘Gingrich, Newt’: ‘Republican’,
‘McCotter, Thaddeus G’: ‘Republican’,
‘Huntsman, Jon’: ‘Republican’,
‘Perry, Rick’: ‘Republican’
} -
统计不同党派获得政治献金的捐献总额。
-
按照职业汇总政治献金的总额,输出献金总额最大的前5个职业,注意需要做职业类型的去重。给出字典:
occupation = {‘INFORMATION REQUESTED PER BEST EFFORTS’:‘NOT PROVIDE’,
‘INFORMATION REQUESTED’:‘NOT PROVIDE’,
‘C.E.O.’:‘CEO’,
‘LAWYER’:‘ATTORNEY’,
‘SELF’:‘SELF-EMPLOYED’,
'SELF EMPLOYED ':‘SELF-EMPLOYED’} -
通过数据可视化展示,各候选人获得的赞助总金额,注意需要先去除政治献金额小于 “0” 的异常数据
-
分析前两名的候选人:不同职业对他两人的支持程度、不同公司的支持度和不同州的支持度。
附加题:政治献金的时间分析(最早时间,那天最多,那天最少?)
部分内容分享
1、读取数据
import numpy as np
import pandas as pd
#1. 读入美国总统选举政治献金数据文件,合并三个文件的数据
c1 = pd.read_csv('usa_elect/contb_01.csv')
c2 = pd.read_csv('usa_elect/contb_02.csv')
c3 = pd.read_csv('usa_elect/contb_03.csv')
c = pd.concat((c1,c2,c3))
#c = pd.concat([c1,c2,c3],axis = 0) #按列合并
2、查看基本信息
#2. 查看数据基本信息
print(c.head()) #列出前五个数据
print(c.info()) #查看每一列基本信息(可看出缺失值)
print(c.describe()) #表示数据信息(可看出异常值)
3、缺失值处理
#3. 缺失值处理,(填充 ‘NOT PROVIDE’)
c.fillna('NOT PROVIDE',inplace = True)
print(c.info()) #通过info验证是否填充成功
4、添加党派信息
#4. 通过给定字典,添加候选人对应党派信息
parties = {
'Bachmann, Michelle': 'Republican',
'Romney, Mitt': 'Republican',
'Obama, Barack': 'Democrat',
"Roemer, Charles E. 'Buddy' III": 'Republican',
'Pawlenty, Timothy': 'Republican',
'Johnson, Gary Earl': 'Republican',
'Paul, Ron': 'Republican',
'Santorum, Rick': 'Republican',
'Cain, Herman': 'Republican',
'Gingrich, Newt': 'Republican',
'McCotter, Thaddeus G': 'Republican',
'Huntsman, Jon': 'Republican',
'Perry, Rick': 'Republican'
}
#print(c.cand_nm.unique())
c['party'] = c['cand_nm'].map(parties)
print(c.head())
5、统计捐款额度
#5. 统计不同党派获得政治献金的捐献总额。
print(c['party'].value_counts()) #捐献次数
print(c.groupby(['party'])['contb_receipt_amt'].sum()) #捐献金额
6、lambda妙用
#6. 按照职业汇总政治献金的总额,输出献金总额最大的前5个职业,注意需要做职业类型的去重。给出字典
occupation = {'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDE',
'INFORMATION REQUESTED':'NOT PROVIDE',
'C.E.O.':'CEO',
'LAWYER':'ATTORNEY',
'SELF':'SELF-EMPLOYED',
'SELF EMPLOYED ':'SELF-EMPLOYED'}
c['contbr_occupation'] = c['contbr_occupation'].map(lambda i : occupation.get(i,i))
goupy = c.groupby(['contbr_occupation'])['contb_receipt_amt'].sum()
print(goupy.sort_values(ascending = False).head())
7、可视化赞助金额
#7. 通过数据可视化展示,各候选人获得的赞助总金额,注意需要先去除政治献金额小于 “0” 的异常数据
c2 = c[c['contb_receipt_amt'] > 0]
#print('原始数据:',c.shape,' 处理后数据:',c2.shape)
image = c2.groupby(['cand_nm' ])['contb_receipt_amt'].sum().sort_values(ascending = False)[:8]
image.plot(kind = 'bar') #取前八名做图,直接绘制饼状图
8、对比Obama和Romney的支持情况
#8. 分析前两名的候选人:不同职业对他两人的支持程度、不同公司的支持度和不同州的支持度。
#第8题方法一:对两个候选人分别提取(此方法效率偏低,故中途作废)
Obama = c2[c2['cand_nm'] == 'Obama, Barack']
Romney = c2[c2['cand_nm'] == 'Romney, Mitt']
print(Obama.groupby(['contbr_occupation'])['contb_receipt_amt'].sum().sort_values(ascending = False).head())
print(Romney.groupby(['contbr_occupation'])['contb_receipt_amt'].sum().sort_values(ascending = False).head())
#第8题方法二:采用透视表获取数据
c3 = c2.query("cand_nm == 'Obama, Barack' or cand_nm == 'Romney, Mitt'")#选取含Obama、Romney的数据
print(c3.cand_nm.unique()) #查看数据是否提取成功
#(1)分析不同职业
pivot1 = c3.pivot_table('contb_receipt_amt',index='contbr_occupation',columns='cand_nm',aggfunc='sum',fill_value=0)
pivot1 = pivot1[pivot1.sum(axis = 1)>1000000] #提取献金金额超过1million的群体进行分析
pivot1.plot(kind = 'bar')
#(2)分析不同公司
pivot2 = c3.pivot_table('contb_receipt_amt',index='contbr_employer',columns='cand_nm',aggfunc='sum',fill_value=0)
pivot2 = pivot2[pivot2.sum(axis = 1)>1000000] #提取献金金额超过1million的群体进行分析
pivot2.plot(kind = 'bar')
#(3)分析不同State
pivot3 = c3.pivot_table('contb_receipt_amt',index='contbr_st',columns='cand_nm',aggfunc='sum',fill_value=0)
pivot3 = pivot3[pivot3.sum(axis = 1)>10000000] #提取献金金额超过10million的洲进行分析
pivot3.plot(kind = 'bar')
9、政治献金的时间分析
#附加题:政治献金的时间分析(最早时间,那天最多,那天最少?)
c2['contb_receipt_dt'] = pd.to_datetime(c2['contb_receipt_dt']) #将str转datetime类型
print(c2.dtypes) #观察数据类型变化
#最早时间
#print(c2['contb_receipt_dt'].describe())
print("政治献金最早的时间:",min(c2['contb_receipt_dt']))
#那天最多,那天最少(直接分组排个序最大值和最小值即为答案)
c2.groupby('contb_receipt_dt')['contb_receipt_amt'].sum().sort_values(ascending = False)