python数据分析实例2012美国总统竞选赞助分析

1.数据加载

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data1=pd.read_csv('data_01.csv')
data2=pd.read_csv('data_02.csv')
data3=pd.read_csv('data_03.csv')
#数据合并
data=pd.concat([data1,data2,data3])

#数据预览和基本统计分析

#查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型
print(data.info())
#经过观察发现employer,occupation有缺失值

# cand_nm – 接受捐赠的候选人姓名
# contbr_nm – 捐赠人姓名
# contbr_st – 捐赠人所在州
# contbr_employer – 捐赠人所在公司
# contbr_occupation – 捐赠人职业
# contb_receipt_amt – 捐赠数额(美元)
# contb_receipt_dt – 收到捐款的日期

# print(data.head())
#用统计学指标快速描述数据的概要
print(data.describe())

2.数据清洗

2.1缺失值处理

#从data.info()得知,contbr_employer、contbr_occupation均有少量缺失值,均填充为NOT PROVIDED
data['contbr_employer'].fillna('NOT PROVIDED',inplace=True)
data['contbr_occupation'].fillna('NOT PROVIDED',inplace=True)

2.2数据转换

# 利用字典映射进行转换:党派分析
print('共有{}位候选人'.format(len(data['cand_nm'].unique())))

#通过搜索引擎等途径,获取到每个总统候选人的所属党派,建立字典parties,候选人名字作为键,所属党派作为对应的值
parties = {'Bachmann, Michelle': 'Republican',
           'Cain, Herman': 'Republican',
           'Gingrich, Newt': 'Republican',
           'Huntsman, Jon': 'Republican',
           'Johnson, 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'}

#通过map映射函数,增加一列party存储党派信息
data['party']=data['cand_nm'].map(parties)
#查看两党情况
print(data['party'].value_counts())
# 结果显示民主党获得赞助多于共和党

# 按照职业汇总对赞助总金额进行排序
# ascending=True是升序排序,False为降序;inplace=Ture则是修改原dataframe,默认为False
data.groupby('contbr_occupation')['contb_receipt_amt'].sum().sort_values(ascending=True)

#建立一个职业对应字典,把相同职业的不同表达映射为对应的职业,比如把C.E.O.映射为CEO
occupation_map = {
  'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
  'INFORMATION REQUESTED':'NOT PROVIDED',
  'SELF' : 'SELF-EMPLOYED',
  'SELF EMPLOYED' : 'SELF-EMPLOYED',
  'C.E.O.':'CEO',
  'LAWYER':'ATTORNEY',
}

# 如果不在字典中,返回x
f = lambda x: occupation_map.get(x, x)
data.contbr_occupation = data.contbr_occupation.map(f)

# 对雇主信息进行类似转换
emp_mapping = {
   'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED',
   'INFORMATION REQUESTED' : 'NOT PROVIDED',
   'SELF' : 'SELF-EMPLOYED',
   'SELF EMPLOYED' : 'SELF-EMPLOYED',
}

# If no mapping provided, return x
f = lambda x: emp_mapping.get(x, x)
data.contbr_employer = data.contbr_employer.map(f)

2.3数据筛选

#查看各大候选人获得的赞助总金额
data.groupby('cand_nm')['contb_receipt_amt'].sum().sort_values(ascending=False)#降序

#提取候选人Obama,Romney的数据
data_vs=data[data['cand_nm'].isin(['Obama, Barack','Romney, Mitt'])].copy()
print(data_vs)

2.4 面元化数据

bins=np.array([0,1,10,100,1000,10000,100000,1000000,10000000])
labels=pd.cut(data_vs['contb_receipt_amt'],bins)
print(labels)

# 对赞助金额进行分组分析(matplotlib画图)
# 前面我们已经利用pd.cut()函数,根据出资额大小将数据离散化到多个面元中,接下来我们就要对每个离散化的面元进行分组分析
#
# 首先统计各出资区间的赞助笔数,这里用到unstack(),stack()函数是堆叠,unstack()函数就是不要堆叠,即把多层索引变为表格数据
#labels是之前赞助金额离散化后的Series
print('对赞助金额进行分组分析')
group_bins=data_vs.groupby(['cand_nm',labels])
print(group_bins.size().unstack(0))

# 统计各区间的赞助金额
bucket_sums=group_bins['contb_receipt_amt'].sum().unstack(0)
print(bucket_sums)

#Obama、Romney各区间赞助总金额
bucket_sums.plot(kind='bar')
plt.show()

# 上图虽然能够大概看出Obama、Romney的赞助金额区间分布,但对比并不够突出,如果用百分比堆积图效果会更好,下面我们就实现以下。
#算出每个区间两位候选人收到赞助总金额的占比
normed_sums = bucket_sums.div(bucket_sums.sum(axis=1),axis=0)
#使用柱状图,指定stacked=True进行堆叠,即可完成百分比堆积图
normed_sums[:-2].plot(kind='bar',stacked=True)
plt.show()
# 可以看出,小额赞助方面,Obama获得的数量和金额比Romney多得多

# 按照赞助人姓名分组计数,计算重复赞助次数最多的前20人
contbr_nm_20=data.groupby('contbr_nm')['contbr_nm'].count().sort_values(ascending=False)[:20]
print(contbr_nm_20)

3. 数据聚合与分组运算

分组计算Grouping,分组运算是一个“split-apply-combine”的过程:拆分,pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组应用,将一个函数应用到各个分组并产生一个新值合并,所有这些函数的执行结果会合并到最终的结果对象中

3.1 透视表(pivot_table)分析党派和职业

# 通过pivot_table根据党派和职业对数据进行聚合,然后过滤掉总出资不足200万美元的数据
#按照党派、职业对赞助金额进行汇总,类似excel中的透视表操作,聚合函数为sum
# 职业
by_occupation=data.pivot_table('contb_receipt_amt',index='contbr_occupation',columns='party',aggfunc='sum')
#过滤掉赞助金额少于200w数据
over_200=by_occupation[by_occupation.sum(1)>2000000]
# print(over_200)
over_200.plot(kind='bar')
# plt.show()

3.2 分组级运算和转换

# 根据职业与雇主信息分组运算
# 对Obama和Romney总出资最高的职业和雇主
# grouped = data_vs.groupby('cand_nm')
# totals=grouped.apply('cand_nm').groupby('','contbr_occupation')['contb_receipt_amt'].sum().sort_values(ascending=False)[:10]
# print(totals)
# 由于职业和雇主的处理非常相似,我们定义函数get_top_amounts()对两个字段进行分析处理

def get_top_amounts(group, key, n=5):
    # 传入groupby分组后的对象,返回按照key字段汇总的排序前n的数据
    totals = group.groupby(key)['contb_receipt_amt'].sum()
    return totals.sort_values(ascending=False)[:n]


grouped = data_vs.groupby('cand_nm')
gr_data=grouped.apply(get_top_amounts, 'contbr_occupation', n=7)
print(gr_data)
# 从数据可以看出,Obama更受精英群体(律师、医生、咨询顾问)的欢迎,Romney则得到更多企业家或企业高管的支持
#对雇主处理
gr_data=grouped.apply(get_top_amounts, 'contbr_employer', n=7)
print(gr_data)

4.时间处理

4.1str转datetime

# 我们可以使用to_datetime方法解析多种不同的日期表示形式。
# 对标准日期格式(如ISO8601)的解析非常快。我们也可以指定特定的日期解析格式,
# 如pd.to_datetime(series,format='%Y%m%d')
data_vs['time']=pd.to_datetime(data_vs['contb_receipt_dt'])

4.2时间索引

data_vs.set_index('time',inplace=True)#在data_vs上修改
# data_vs.head()

4.3重采样与频度转换

重采样(Resampling)指的是把时间序列的频度变为另一个频度的过程。
把高频度的数据变为低频度叫做降采样(downsampling),resample会对数据进行分组,然后再调用聚合函数。
这里我们把频率从每日转换为每月,属于高频转低频的降采样。

vs_time=data_vs.groupby('cand_nm').resample('M')['cand_nm'].count().unstack(0)
print(vs_time)
# 我们用面积图把11年4月-12年4月两位总统候选人接受的赞助笔数做个对比可以看出,越临近竞选,大家赞助的热情越高涨,奥巴马在各个时段都占据绝对的优势
fig1, ax1=plt.subplots(figsize=(32,8))
vs_time.plot(kind='area',ax=ax1,alpha=0.6)
plt.show()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值