其他分享
首页 > 其他分享> > Pandas 分析美国选名的喜好

Pandas 分析美国选名的喜好

作者:互联网

1.赛前准备

1.1 前言

本次赛事由开源学习组织Datawhale主办,主要带领学习者利用Python进行数据分析以及数据可视化,包含数据集的处理、数据探索与清晰、数据分析、数据可视化四部分,利用pandas、matplotlib、wordcloud等第三方库带大家玩转数据分析~还有丰富礼品等你来领取哦~ 学习赛事地址:https://tianchi.aliyun.com/competition/entrance/531837/introduction

1.2 数据集来源介绍

所有候选人信息 该文件为每个候选人提供一份记录,并显示候选人的信息、总收入、从授权委员会收到的转账、付款总额、给授权委员会的转账、库存现金总额、贷款和债务以及其他财务汇总信息。 数据字段描述详细:https://www.fec.gov/campaign-finance-data/all-candidates-file-description/ 关键字段说明

CAND_ID 候选人ID CAND_NAME 候选人姓名 CAND_PTY_AFFILIATION 候选人党派

数据来源:https://www.fec.gov/files/bulk-downloads/2020/weball20.zip

候选人委员会链接信息 该文件显示候选人的身份证号码、候选人的选举年份、联邦选举委员会选举年份、委员会识别号、委员会类型、委员会名称和链接标识号。 信息描述详细:https://www.fec.gov/campaign-finance-data/candidate-committee-linkage-file-description/ 关键字段说明

CAND_ID 候选人ID CAND_ELECTION_YR 候选人选举年份 CMTE_ID 委员会ID

数据来源:https://www.fec.gov/files/bulk-downloads/2020/ccl20.zip

个人捐款档案信息 【注意】由于文件较大,本数据集只包含2020.7.22-2020.8.20的相关数据,如果需要更全数据可以通过数据来源中的地址下载。 该文件包含有关收到捐款的委员会、披露捐款的报告、提供捐款的个人、捐款日期、金额和有关捐款的其他信息。 信息描述详细:https://www.fec.gov/campaign-finance-data/contributions-individuals-file-description/ 关键字段说明

CMTE_ID 委员会ID

NAME 捐款人姓名

CITY 捐款人所在市

State 捐款人所在州

EMPLOYER 捐款人雇主/公司

OCCUPATION 捐款人职业

数据来源:https://www.fec.gov/files/bulk-downloads/2020/indiv20.zip

2.数据分析

进行数据处理前,我们需要知道我们最终想要的数据是什么样的,因为我们是想分析候选人与捐赠人之间的关系,所以我们想要一张数据表中有捐赠人与候选人一一对应的关系,所以需要将目前的三张数据表进行一一关联,汇总到需要的数据。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
%matplotlib inline
#读取候选人信息数据的数据
candidates = pd.read_csv("weball20.txt", sep = '|',names=['CAND_ID','CAND_NAME','CAND_ICI','PTY_CD','CAND_PTY_AFFILIATION','TTL_RECEIPTS',
                                                          'TRANS_FROM_AUTH','TTL_DISB','TRANS_TO_AUTH','COH_BOP','COH_COP','CAND_CONTRIB',
                                                          'CAND_LOANS','OTHER_LOANS','CAND_LOAN_REPAY','OTHER_LOAN_REPAY','DEBTS_OWED_BY',
                                                          'TTL_INDIV_CONTRIB','CAND_OFFICE_ST','CAND_OFFICE_DISTRICT','SPEC_ELECTION','PRIM_ELECTION','RUN_ELECTION'
                                                          ,'GEN_ELECTION','GEN_ELECTION_PRECENT','OTHER_POL_CMTE_CONTRIB','POL_PTY_CONTRIB',
                                                          'CVG_END_DT','INDIV_REFUNDS','CMTE_REFUNDS'],)
candidates

 

 

#读取候选人和委员会的联系信息
cll=pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID'])

#将候选人和候选委员会进行关联起来
ccl=pd.merge(cll,candidates,)

#提取需要的列
cll=pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])

#将候选人和捐赠人一一对应,通过CMTE_ID关联两个表
#通过CMTE-ID将目前处理好的候选人和委员会关系表与人员捐款档案进行关联,得到候选人与捐赠人一一对应联系表cil。

# 读取个人捐赠数据,由于原始数据没有表头,需要添加表头
# 提示:读取本文件大概需要5-10s
itcont = pd.read_csv('itcont_2020_20200722_20200820.txt', sep='|',names=['CMTE_ID','AMNDT_IND','RPT_TP','TRANSACTION_PGI',
                                                                                  'IMAGE_NUM','TRANSACTION_TP','ENTITY_TP','NAME','CITY',
                                                                                  'STATE','ZIP_CODE','EMPLOYER','OCCUPATION','TRANSACTION_DT',
                                                                                  'TRANSACTION_AMT','OTHER_ID','TRAN_ID','FILE_NUM','MEMO_CD',
                                                                                  'MEMO_TEXT','SUB_ID'])

# 将候选人与委员会关系表ccl和个人捐赠数据表itcont合并,通过 CMTE_ID
cil=pd.merge(cll,itcont)
# 提取需要的数据列
c_itcont = pd.DataFrame(cil, columns=[ 'CAND_NAME','NAME', 'STATE','EMPLOYER','OCCUPATION',
                                           'TRANSACTION_AMT', 'TRANSACTION_DT','CAND_PTY_AFFILIATION'])
c_itcont

 

#数据说明 CAND_NAME – 接受捐赠的候选人姓名

NAME – 捐赠人姓名

STATE – 捐赠人所在州

EMPLOYER – 捐赠人所在公司

OCCUPATION – 捐赠人职业

TRANSACTION_AMT – 捐赠数额(美元)

TRANSACTION_DT – 收到捐款的日期

CAND_PTY_AFFILIATION – 候选人党派

 

3.数据清洗

 

 

 

# 对日期TRANSACTION_DT列进行处理
c_itcont['TRANSACTION_DT']
def date_time(x):
    x=str(x)
    x=x[3:7]+x[0:3]
    return x
#将数改为正常的年月日

c_itcont['TRANSACTION_DT']=c_itcont['TRANSACTION_DT'].apply(date_time)

#再次进行数据分析
c_itcont.info()

#对于单列可以进行describe分析——分类变量
c_itcont['CAND_NAME'].describe()
count                 756205
unique                   312
top       BIDEN, JOSEPH R JR
freq                  507816
Name: CAND_NAME, dtype: object

4.数据分析

# 计算每个党派的所获得的捐款总额,然后排序,取前十位

c_itcont.groupby('CAND_PTY_AFFILIATION').sum()['TRANSACTION_AMT'].sort_values(ascending=False)[:10]

# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
c_itcont.groupby('CAND_NAME').sum()['TRANSACTION_AMT'].sort_values(ascending=False)[:10]

CAND_NAME
BIDEN, JOSEPH R JR                  68111142
TRUMP, DONALD J.                    16594982
SULLIVAN, DAN                        9912465
JACOBS, CHRISTOPHER L.               6939209
BLOOMBERG, MICHAEL R.                3451916
MARKEY, EDWARD J. SEN.                606832
SHAHEEN, JEANNE                       505446
KENNEDY, JOSEPH P III                 467738
CORNYN, JOHN SEN                      345959
FIGLESTHALER, WILLIAM MATTHEW MD      258221
Name: TRANSACTION_AMT, dtype: int64

获得捐赠最多的党派有DEM(民主党)、REP(共和党),分别对应BIDEN, JOSEPH R JR(拜登)和TRUMP, DONALD J.(特朗普),从我们目前分析的2020.7.22-2020.8.20这一个月的数据来看,在选民的捐赠数据中拜登代表的民主党完胜特朗普代表的共和党,由于完整数据量过大,所以没有对所有数据进行汇总分析,因此也不能确定11月大选公布结果就一定是拜登当选

# 查看不同职业的人捐款的总额,然后排序,取前十位
c_itcont.groupby('OCCUPATION').sum()['TRANSACTION_AMT'].sort_values(ascending=False)[:10]


c_itcont["OCCUPATION"].value_counts()[:10]


NOT EMPLOYED    224109
RETIRED         151834
ATTORNEY         19666
NOT PROVIDED     14912
PHYSICIAN        14033
CONSULTANT        8333
PROFESSOR         8022
TEACHER           8013
ENGINEER          7922
SALES             6435
Name: OCCUPATION, dtype: int64

从捐款人的职业这个角度分析,我们会发现NOT EMPLOYED(自由职业)的总捐赠额是最多,通过查看每个职业捐赠的人数来看,我们就会发现是因为NOT EMPLOYED(自由职业)人数多的原因,另外退休人员捐款人数也特别多,所以捐款总数对应的也多,其他比如像:律师、创始人、医生、顾问、教授、主管这些高薪人才虽然捐款总人数少,但是捐款总金额也占据了很大比例。

 

# 每个州获捐款的总额,然后排序,取前五位
c_itcont.groupby('STATE').sum()['TRANSACTION_AMT'].sort_values(ascending=False)

c_itcont.groupby('STATE').sum().sort_values('TRANSACTION_AMT',ascending=False).head(5)

#查看每个州捐款人的数量
c_itcont['STATE'].value_counts()

CA    127895
TX     54457
FL     54343
NY     49453
MA     29314
       ...  
AA        22
MP        10
PW         6
AS         2
FM         1
Name: STATE, Length: 63, dtype: int64

最后查看每个州的捐款总金额,我们会发现CA(加利福利亚)、NY(纽约)、FL(弗罗里达)这几个州的捐款是最多的,在捐款人数上也是在Top端,另一方面也凸显出这些州的经济水平发达。 大家也可以通过数据查看下上面列举的高端职业在各州的分布情况,进行进一步的分析探索

4.数据可视化

4.1 按州总捐款数和总捐款人数柱状图

st_amt=c_itcont.groupby('STATE').sum()['TRANSACTION_AMT'].sort_values(ascending=False)[:10]
st_amt

plt.bar(st_amt.index,st_amt.values)

 

 

st_amt=pd.DataFrame(st_amt)
st_amt

#利用dataframe进行画图
st_amt.plot(kind='bar')

 

4.2 各州捐款总人数可视化

4.3 热门候选人拜登在各州的获得的捐赠占比

#将目标数据从众多数据中提取出来
baiden=c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
#统计各州对拜登的支持lv

baiden_state=baiden.groupby('STATE').sum().sort_values('TRANSACTION_AMT',ascending=False)[:10]
baiden_state

baiden_state.plot.pie(figsize=(10,10),subplots=True,autopct='%0.2f%%')

 

4.3 总捐最多的候选人捐赠者词云图

 首先下载图片模型,这里提供的是已经处理好的图片,有兴趣的选手可以自己写代码进行图片处理
# 处理结果:需要将人图像和背景颜色分离,并纯色填充,词云才会只显示在人图像区域
# 拜登原图:https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg
# 拜登处理后图片:https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
# 特朗普原图:https://img.alicdn.com/tfs/TB1D0l4pBBh1e4jSZFhXXcC9VXa-298-169.jpg
# 特朗普处理后图片:https://img.alicdn.com/tfs/TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg
# 这里我们先下载处理后的图片
!wget https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg

#由于图片名字太长,对名称进行修改
import os 
os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg','baideng.jpg')

from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.image as mpig
mg_plt = plt.imread('./baideng.jpg')

#mpig.imread('baideng.jpg')
plt.imshow(mg_plt , cmap=plt.cm.binary)

data = ' '.join(baiden["NAME"].tolist())
# 读取图片文件
bg = plt.imread("baideng.jpg")
# 生成
wc = WordCloud(# FFFAE3
    background_color="white",  # 设置背景为白色,默认为黑色
    width=890,  # 设置图片的宽度
    height=600,  # 设置图片的高度
    mask=bg,    # 画布
    margin=10,  # 设置图片的边缘
    max_font_size=100,  # 显示的最大的字体大小
    random_state=20,  # 为每个单词返回一个PIL颜色
).generate_from_text(data)
# 图片背景
bg_color = ImageColorGenerator(bg)
# 开始画图
plt.imshow(wc.recolor(color_func=bg_color))
# 为云图去掉坐标轴
plt.axis("off")
# 画云图,显示
# 保存云图
wc.to_file("baiden_wordcloud.png")

4.4按州总捐款热力地图

S_AMT=c_itcont.groupby('STATE').sum().sort_values('TRANSACTION_AMT',ascending=False)
S_AMT

S_AMT=pd.DataFrame(S_AMT,columns=['TRANSACTION_AMT'])[0:10]
S_AMT

sns.heatmap(S_AMT, annot=True, fmt='.0f')

 

4.5收到捐赠额最多的两位候选人的总捐赠额变化趋势

S_AMT=c_itcont.groupby('CAND_NAME').sum().scort_values('TRANSACTION_AMT',ascending=False)
S_AMT

D=c_itcont.groupby(['TRANSACTION_DT','CAND_NAME'],as_index=False).sum()
D

D_baiden=D[D['CAND_NAME']=='BIDEN, JOSEPH R JR']
D_baiden

D_telpu=D[D['CAND_NAME']=='TRUMP, DONALD J.']
D_telpu

#将两个数据表进行合并
D_merge=D_baiden.merge(D_telpu,on='TRANSACTION_DT',how='left')
D_merge

fig = plt.figure(figsize=(15, 8), dpi=80)
plt.xticks(rotation=40)
plt.xlabel('date')
plt.ylabel('money')
plt.plot(D_merge['TRANSACTION_DT'], D_merge['TRANSACTION_AMT_x'], label='baideng', color='red')
plt.plot(D_merge['TRANSACTION_DT'], D_merge['TRANSACTION_AMT_y'], label='telpu', color='blue')
plt.legend(loc='upper left')
plt.title('特朗普和拜登的政治献金的变化趋势')
plt.show()

 

 

 

解决中文乱码的问题:

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

 

 

 

 

 

 

 

 

标签:CAND,TRANSACTION,喜好,AMT,itcont,plt,选名,ID,Pandas
来源: https://blog.csdn.net/qq_32767039/article/details/116330191