《利用python进行数据分析》————2012年联邦选举委员会数据库

[本次数据分析所用到的数据集链接]
(http://github.com/wesm/pydata-book)

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
fec = pd.read_csv('datasets/fec/P00000001-ALL.csv') #加载数据
print(fec.info())
print(fec.iloc[123456])
unique_cands = fec.cand_nm.unique() #使用unique获得所有不同的政治候选人名单
parties = {'Bachmann, Michelle':'Republican',
           'Cain, Herman':'Republican',
           'Gingrich, Newt':'Republican',
           'Huntsman, Jon':'Republican',
           'John, Gary Earl':'Republican',
           'McCotter, Thaddeus G':'Republican',
           'Obama, Barack':'Democrat',
           'Paul, Ron':'Republican',
           'Pawlenty, Timothy':'Republican',
           'Perry, Rick':'Republican',
           "Roemer, Charles E. 'Buddy' III":'Republican',
           'Romney, Mitt':'Republican',
           'Santorum, Rick':'Republican'}  #表示政党背景的方式之一是使用相应的字典
print(fec.cand_nm[123456:123461].map(parties)) #从候选人姓名中计算出政党的数组
fec['party'] = fec.cand_nm.map(parties) #将它作为一列加入
print(fec['party'].value_counts())
print((fec.contb_receipt_amt > 0).value_counts()) #数据准备的要点,这些数据既包括捐款也包括退款
fec = fec[fec.contb_receipt_amt > 0] #将分析范围限制在正向贡献中
fec_mrbo = fec[fec.cand_nm.isin(['Obama, Barack','Romney, Mitt'])] #由于Barack Obama和Mitt Romney是主要的两位候选人,所以准备一个仅对他们的竞选有贡献的子集
print(fec.contbr_occupation.value_counts()[:10]) #获得按职业的捐献总数
occ_mapping = {
    'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
    'INFORMATION REQUESTED':'NOT PROVIDED',
    'INFORMATION REQUESTED (BEST EFFORTS)':'NOT PROVIDED',
    'C.E.O':'CEO'
}
f = lambda x:occ_mapping.get(x,x) #如果没有映射,则返回x
fec.contbr_occupation = fec.contbr_occupation.map(f)
emp_mapping = {
    'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
    'INFORMATION REQUESTED':'NOT PROVIDED',
    'SELF':'SELF-EMPLOYED',
    'SELF EMPLOYED':'SELF-EMPLOYED',
}
f = lambda x:emp_mapping.get(x,x) #如果没有映射,则返回x
fec.contbr_employer = fec.contbr_employer.map(f)
by_occupation = fec.pivot_table('contb_receipt_amt',
                                index = 'contbr_occupation',
                                columns = 'party',aggfunc = 'sum') #按照党派和职业聚合数据
over_2mm = by_occupation[by_occupation.sum(1) > 2000000] #过滤出至少捐赠200万美元的子集
over_2mm.plot(kind = 'barh') #以条形图的方式进行数据可视化,按党派划分各职业捐赠总量
plt.show()
def get_top_amounts(group,key,n = 5):
    totals = group.groupby(key)['contb_receipt_amt'].sum()
    return totals.nlargest(n)
grouped = fec_mrbo.groupby('cand_nm')
grouped.apply(get_top_amounts,'contbr_occupation',n = 7) #按照职业进行聚合
grouped.apply(get_top_amounts,'contbr_employer',n = 10) #按照雇主进行聚合
bins = np.array([0,1,10,100,1000,10000,
                 100000,1000000,10000000])
labels = pd.cut(fec_mrbo.contb_receipt_amt, bins) #使用cut函数将贡献者的数量按贡献大小离散化分桶
print(labels)
grouped = fec_mrbo.groupby(['cand_nm',labels]) #将Obama和Romney的数据按名称和分类标签进行分组,以获得捐赠规模的直方图
print(grouped.size().unstack(0))
bucket_sums = grouped.contb_receipt_amt.sum().unstack(0)
normed_sums = bucket_sums.div(bucket_sums.sum(axis = 1),axis = 0) #对捐款数额进行归一化
print(normed_sums)
normed_sums[:-2].plot(kind = 'barh') #画出不同捐赠规模的候选人收到的捐赠总额的百分比,这里排除了最大的两个箱体,因为这些箱体不是由个人捐赠的
plt.show()
grouped = fec_mrbo.groupby(['cand_nm','contbr_st']) #按照候选人和州进行聚合
totals = grouped.contb_receipt_amt.sum().unstack(0).fillna(0)
totals = totals[totals.sum(1) > 100000]
print(totals[:10])
percent = totals.div(totals.sum(1),axis = 0) #将每一行除以捐款总额,就可以得到每个候选人按州的捐赠总额的相对百分比
print(percent[:10])

猜你喜欢

转载自blog.csdn.net/weixin_43303087/article/details/84190413