阿里云天池龙珠计划python训练营task4----数据分析入门活动赛事,利用Pandas分析美国选民总统

本文介绍了2020年美国总统选举期间的数据分析过程,涉及数据来源、数据处理、数据探索与清洗。通过Python对候选人、捐赠人和委员会之间的关系进行整合,展示了不同州、不同职业的捐款概况。分析结果显示,民主党候选人拜登在捐赠总额和数量上超过共和党的特朗普。此外,还展示了使用词云图对捐赠人姓名的可视化,以及按州捐款的柱状图。
摘要由CSDN通过智能技术生成

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

1.3 需要提前安装的包
# 安装词云处理包wordcloud
!pip install wordcloud --user
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Requirement already satisfied: wordcloud in /data/nas/workspace/envs/python3.6/site-packages (1.8.1)
Requirement already satisfied: pillow in /opt/conda/lib/python3.6/site-packages (from wordcloud) (8.0.1)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.6/site-packages (from wordcloud) (3.3.3)
Requirement already satisfied: numpy>=1.6.1 in /opt/conda/lib/python3.6/site-packages (from wordcloud) (1.19.4)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (2.4.7)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (1.2.0)
Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (2.8.1)
Requirement already satisfied: six in /opt/conda/lib/python3.6/site-packages (from cycler>=0.10->matplotlib->wordcloud) (1.15.0)
[33mWARNING: You are using pip version 21.0.1; however, version 21.3.1 is available.
You should consider upgrading via the '/opt/conda/bin/python -m pip install --upgrade pip' command.[0m
1.4 需要提前下载好数据集

【注意】如果你只是在天池技术圈看到本文,你需要先查看赛事指南
通过赛事指南提示操作你可以成功Fork赛事论坛的baseline到你的天池实验室,并点击编辑按钮成功跳转到了DSW在线编程。
在进行数据处理前,你需要点击DSW左侧天池tab,下载本案例数据集2020_US_President_political_contributions,后续步骤才能正确执行。

2、数据处理

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

2.1 将委员会和候选人一一对应,通过CAND_ID关联两个表

由于候选人和委员会的联系表中无候选人姓名,只有候选人ID(CAND_ID),所以需要通过CAND_ID从候选人表中获取到候选人姓名,最终得到候选人与委员会联系表ccl

# 导入相关处理包
import pandas as pd
# 读取候选人信息,由于原始数据没有表头,需要添加表头
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'])
# 读取候选人和委员会的联系信息
ccl = pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID'])
# 查看候选人数据
candidates.head()
CAND_IDCAND_NAMECAND_ICIPTY_CDCAND_PTY_AFFILIATIONTTL_RECEIPTSTRANS_FROM_AUTHTTL_DISBTRANS_TO_AUTHCOH_BOP...SPEC_ELECTIONPRIM_ELECTIONRUN_ELECTIONGEN_ELECTIONGEN_ELECTION_PRECENTOTHER_POL_CMTE_CONTRIBPOL_PTY_CONTRIBCVG_END_DTINDIV_REFUNDSCMTE_REFUNDS
0H8AK00132SHEIN, DIMITRIC1DEM0.000.00367.520.0367.52...NaNNaNNaNNaNNaN0.000.009/30/20190.000.0
1H6AK00045YOUNG, DONALD EI2REP1738661.59132712.441318574.740.0116720.12...NaNNaNNaNNaNNaN760794.63500.009/30/202016625.003500.0
2H8AK01031NELSON, THOMAS JOHNC2REP0.000.00466.510.0466.51...NaNNaNNaNNaNNaN0.000.003/31/20190.000.0
3H8AK00140GALVIN, ALYSEC3IND3905011.9728500.002731435.510.06245.09...NaNNaNNaNNaNNaN237983.089500.009/30/202019846.710.0
4H0AL01097AVERHART, JAMESO1DEM63253.100.0055543.570.00.00...NaNNaNNaNNaNNaN0.000.009/30/20200.000.0

5 rows × 30 columns

# 查看委员会数据
ccl.head()
CAND_IDCAND_ELECTION_YRFEC_ELECTION_YRCMTE_IDCMTE_TPCMTE_DSGNLINKAGE_ID
0C0071360220192020C00712851OU228963
1H0AK0010520202020C00607515HP229250
2H0AL0105520202020C00697789HP226125
3H0AL0106320202020C00701557HP227053
4H0AL0107120202020C00701409HP227054
# 关联两个表数据
ccl = pd.merge(ccl,candidates)
# 提取出所需要的列
ccl = pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])
ccl.head()
CMTE_IDCAND_IDCAND_NAMECAND_PTY_AFFILIATION
0C00697789H0AL01055CARL, JERRY LEE, JRREP
1C00701557H0AL01063LAMBERT, DOUGLAS WESTLEY IIIREP
2C00701409H0AL01071PRINGLE, CHRISTOPHER PAULREP
3C00703066H0AL01089HIGHTOWER, BILLREP
4C00708867H0AL01097AVERHART, JAMESDEM

数据字段说明:

  • CMTE_ID:委员会ID
  • CAND_ID:候选人ID
  • CAND_NAME:候选人姓名
  • CAND_PTY_AFFILIATION:候选人党派
# 查看目前ccl数据前10行
ccl.head(10)
CMTE_IDCAND_IDCAND_NAMECAND_PTY_AFFILIATION
0C00697789H0AL01055CARL, JERRY LEE, JRREP
1C00701557H0AL01063LAMBERT, DOUGLAS WESTLEY IIIREP
2C00701409H0AL01071PRINGLE, CHRISTOPHER PAULREP
3C00703066H0AL01089HIGHTOWER, BILLREP
4C00708867H0AL01097AVERHART, JAMESDEM
5C00710947H0AL01105GARDNER, KIANI ADEM
6C00722512H0AL01121CASTORANI, JOHNREP
7C00725069H0AL01139COLLINS, FREDERICK G. RICK'DEM
8C00462143H0AL02087ROBY, MARTHAREP
9C00493783H0AL02087ROBY, MARTHAREP
2.2 将候选人和捐赠人一一对应,通过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'])
/opt/conda/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3058: DtypeWarning: Columns (10,15,16,18) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)
itcont.head()
CMTE_IDAMNDT_INDRPT_TPTRANSACTION_PGIIMAGE_NUMTRANSACTION_TPENTITY_TPNAMECITYSTATE...EMPLOYEROCCUPATIONTRANSACTION_DTTRANSACTION_AMTOTHER_IDTRAN_IDFILE_NUMMEMO_CDMEMO_TEXTSUB_ID
0C00701888AM8P20200914926717015310INDBAUMGART, STEPHENLOS GATOSCA...VARIAN MEDICAL SYSTEMSSYSTEMS ENGINEER PHYSICIST7222020500NaN128851781437664NaN* EARMARKED CONTRIBUTION: SEE BELOW4092320201849287519
1C00701888AM8P20200914926717015410INDHELBERG, JACOBSAN FRANCISCOCA...STANFORD CYBER POLICY CENTERSENIOR ADVISOR7232020250000NaN128546981437664NaNNaN4092320201849287521
2C00701888AM8P20200914926717013510INDCONSIGLI, ANTHONYMILFORDMA...WHITEWOOD VENTURES, LLCCHIEF EXECUTIVE OFFICER731202025000NaN142602961437664XNaN4092320201849287464
3C00701888AM8P20200914926717013610INDPOTASH, ANDREWMAMARONECKNY...DISTINGUISHED PROGRAMS INSURANCECHIEF EXECUTIVE OFFICER7282020100000NaN128857441437664NaNNaN4092320201849287468
4C00701888AM8P20200914926717015510INDWEINER, STEPHEN R.BOSTONMA...S.R. WEINER AND ASSOCIATESDEVELOPER728202025000NaN128856191437664NaNNaN4092320201849287525

5 rows × 21 columns

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

数据说明

  • CAND_NAME – 接受捐赠的候选人姓名
  • NAME – 捐赠人姓名
  • STATE – 捐赠人所在州
  • EMPLOYER – 捐赠人所在公司
  • OCCUPATION – 捐赠人职业
  • TRANSACTION_AMT – 捐赠数额(美元)
  • TRANSACTION_DT – 收到捐款的日期
  • CAND_PTY_AFFILIATION – 候选人党派

3、数据探索与清洗

进过数据处理部分,我们获得了可用的数据集,现在我们可以利用调用shape属性查看数据的规模,调用info函数查看数据信息,调用describe函数查看数据分布。

# 查看数据规模 多少行 多少列
c_itcont.shape
(756205, 8)
# 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型
c_itcont.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 756205 entries, 0 to 756204
Data columns (total 8 columns):
 #   Column                Non-Null Count   Dtype 
---  ------                --------------   ----- 
 0   CAND_NAME             756205 non-null  object
 1   NAME                  756205 non-null  object
 2   STATE                 756160 non-null  object
 3   EMPLOYER              737413 non-null  object
 4   OCCUPATION            741294 non-null  object
 5   TRANSACTION_AMT       756205 non-null  int64 
 6   TRANSACTION_DT        756205 non-null  int64 
 7   CAND_PTY_AFFILIATION  756205 non-null  object
dtypes: int64(2), object(6)
memory usage: 51.9+ MB

通过上面的探索我们知道目前数据集的一些基本情况,目前数据总共有756205行,8列,总占用内存51.9+MB,STATEEMPLOYEROCCUPATION有缺失值,另外日期列目前为int64类型,需要进行转换为str类型。

#空值处理,统一填充 NOT PROVIDED
c_itcont['STATE'].fillna('NOT PROVIDED',inplace=True)
c_itcont['EMPLOYER'].fillna('NOT PROVIDED',inplace=True)
c_itcont['OCCUPATION'].fillna('NOT PROVIDED',inplace=True)
# 对日期TRANSACTION_DT列进行处理
c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(str)
# 将日期格式改为年月日  7242020	
c_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in c_itcont['TRANSACTION_DT'] ]
c_itcont.head()
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0MORGAN, JOSEPH DAVIDMARTIN, WILLIAM IIAZRETIREDRETIRED1002020724REP
1MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020724REP
2MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020731REP
3WOOD, DANIELHOPKINS, RICHARDAZPOWERS-LEAVITTINSURANCE AGENT3002020810REP
4WOOD, DANIELPENDLETON, DIANEAZUNEMPLOYEDNOT PROVIDED5002020807REP
# asbdbdb = '7222020'
# asbdbdb[3:7]
# asbdbdb[0]
# asbdbdb[1:3]
# 再次查看数据信息
c_itcont.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 756205 entries, 0 to 756204
Data columns (total 8 columns):
 #   Column                Non-Null Count   Dtype 
---  ------                --------------   ----- 
 0   CAND_NAME             756205 non-null  object
 1   NAME                  756205 non-null  object
 2   STATE                 756205 non-null  object
 3   EMPLOYER              756205 non-null  object
 4   OCCUPATION            756205 non-null  object
 5   TRANSACTION_AMT       756205 non-null  int64 
 6   TRANSACTION_DT        756205 non-null  object
 7   CAND_PTY_AFFILIATION  756205 non-null  object
dtypes: int64(1), object(7)
memory usage: 51.9+ MB
# 查看数据前3行
c_itcont.head(3)
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0MORGAN, JOSEPH DAVIDMARTIN, WILLIAM IIAZRETIREDRETIRED1002020724REP
1MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020724REP
2MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020731REP
# 查看数据表中数据类型的列的数据分布情况
c_itcont.describe()
TRANSACTION_AMT
count7.562050e+05
mean1.504307e+02
std2.320452e+03
min-5.600000e+03
25%2.000000e+01
50%3.500000e+01
75%1.000000e+02
max1.500000e+06
# 查看单列的数据发布情况
c_itcont['CAND_NAME'].describe()
count                 756205
unique                   312
top       BIDEN, JOSEPH R JR
freq                  507816
Name: CAND_NAME, dtype: object
# 查看有多少党派
c_itcont["CAND_PTY_AFFILIATION"].nunique()
12
# 查看每个党派有多少捐款人
c_itcont.groupby("CAND_PTY_AFFILIATION")["NAME"].agg('count').sort_values(ascending=False)
CAND_PTY_AFFILIATION
DEM    524576
REP    229467
LIB       974
IND       886
DFL       179
GRE        60
UNK        42
CON         8
OTH         5
BDY         5
NPA         2
NON         1
Name: NAME, dtype: int64

4、数据分析

# 计算每个党派的所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
TRANSACTION_AMT
CAND_PTY_AFFILIATION
DEM75961730
REP37170653
IND328802
LIB169202
DFL76825
GRE18607
NON11256
UNK10195
CON4117
BDY3250
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
TRANSACTION_AMT
CAND_NAME
BIDEN, JOSEPH R JR68111142
TRUMP, DONALD J.16594982
SULLIVAN, DAN9912465
JACOBS, CHRISTOPHER L.6939209
BLOOMBERG, MICHAEL R.3451916
MARKEY, EDWARD J. SEN.606832
SHAHEEN, JEANNE505446
KENNEDY, JOSEPH P III467738
CORNYN, JOHN SEN345959
FIGLESTHALER, WILLIAM MATTHEW MD258221

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

# 查看不同职业的人捐款的总额,然后排序,取前十位
c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
TRANSACTION_AMT
OCCUPATION
NOT EMPLOYED24436214
RETIRED18669950
NOT PROVIDED5089355
ATTORNEY4443569
FOUNDER3519109
PHYSICIAN3295595
CONSULTANT1647033
LAWYER1565976
PROFESSOR1481260
EXECUTIVE1467865
# 查看每个职业捐款人的数量
c_itcont['OCCUPATION'].value_counts().head(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().sort_values("TRANSACTION_AMT",ascending=False).head(5)
TRANSACTION_AMT
STATE
CA19999115
NY11468537
FL8128789
TX8101871
MA5187957
# 查看每个州捐款人的数量
c_itcont['STATE'].value_counts().head(5)
CA    127895
TX     54457
FL     54343
NY     49453
MA     29314
Name: STATE, dtype: int64

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

4、数据可视化

首先导入相关Python库

!pip3 install wordcloud
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://mirrors.aliyun.com/pypi/simple
Requirement already satisfied: wordcloud in /data/nas/workspace/envs/python3.6/site-packages (1.8.1)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.6/site-packages (from wordcloud) (3.3.3)
Requirement already satisfied: numpy>=1.6.1 in /opt/conda/lib/python3.6/site-packages (from wordcloud) (1.19.4)
Requirement already satisfied: pillow in /opt/conda/lib/python3.6/site-packages (from wordcloud) (8.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (2.4.7)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (0.10.0)
Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud) (2.8.1)
Requirement already satisfied: six in /opt/conda/lib/python3.6/site-packages (from cycler>=0.10->matplotlib->wordcloud) (1.15.0)
[33mWARNING: You are using pip version 21.0.1; however, version 21.3.1 is available.
You should consider upgrading via the '/opt/conda/bin/python -m pip install --upgrade pip' command.[0m
import sys
print(sys.version)
3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0]
# 导入matplotlib中的pyplot
import matplotlib.pyplot as plt
# 为了使matplotlib图形能够内联显示
%matplotlib inline
# 导入词云库
from wordcloud import WordCloud,ImageColorGenerator
4.1 按州总捐款数和总捐款人数柱状图
# 各州总捐款数可视化
st_amt = c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False)[:10]
st_amt=pd.DataFrame(st_amt, columns=['TRANSACTION_AMT'])
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>

在这里插入图片描述

4.2 各州捐款总人数可视化
# 各州捐款总人数可视化,取前10个州的数据
st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>

在这里插入图片描述

4.3 热门候选人拜登在各州的获得的捐赠占比
# 从所有数据中取出支持拜登的数据
biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
# 统计各州对拜登的捐款总数
biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
# 饼图可视化各州捐款数据占比
biden_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)
array([<AxesSubplot:ylabel='TRANSACTION_AMT'>], dtype=object)

在这里插入图片描述

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

通过数据分析中获得捐赠总额前三的候选人统计中可以看出拜登在2020.7.22-2020.8.20这期间获得捐赠的总额是最多的,所以我们以拜登为原模型,制作词云图。

# 首先下载图片模型,这里提供的是已经处理好的图片,有兴趣的选手可以自己写代码进行图片处理
# 处理结果:需要将人图像和背景颜色分离,并纯色填充,词云才会只显示在人图像区域
# 拜登原图: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
--2021-12-15 10:29:30--  https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
Resolving img.alicdn.com (img.alicdn.com)... 47.105.29.107, 47.105.29.118, 240e:978:1403:0:3::3fc, ...
Connecting to img.alicdn.com (img.alicdn.com)|47.105.29.107|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4236 (4.1K) [image/jpeg]
Saving to: ‘TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg’

100%[======================================>] 4,236       --.-K/s   in 0s      

2021-12-15 10:29:30 (1.19 GB/s) - ‘TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg’ saved [4236/4236]
# 由于下载图片文件名过长,我们对文件名进行重命名
import os
os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg', 'biden.jpg')
import matplotlib.image as mpimg # mpimg 用于读取图片
img = mpimg.imread('biden.jpg') 
plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()

在这里插入图片描述

# 如果有兴趣,可以在上面下载原图后进行图片处理
# 拜登原图:https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg
# 拜登处理后图片:https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
'''
你的图片处理代码
'''
!wget https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg
os.rename('TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg', 'biden_before.jpg')
import matplotlib.image as mpimg # mpimg 用于读取图片
img = mpimg.imread('biden_before.jpg') 
plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
--2021-12-15 10:36:07--  https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg
Resolving img.alicdn.com (img.alicdn.com)... 47.105.29.118, 47.105.29.107, 240e:978:1403:0:3::3fc, ...
Connecting to img.alicdn.com (img.alicdn.com)|47.105.29.118|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28111 (27K) [image/jpeg]
Saving to: ‘TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg’

100%[======================================>] 28,111      --.-K/s   in 0.02s   

2021-12-15 10:36:08 (1.49 MB/s) - ‘TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg’ saved [28111/28111]

在这里插入图片描述

# # 从所有数据中取出支持拜登的数据
# biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
# # 统计各州对拜登的捐款总数
# biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
# # 饼图可视化各州捐款数据占比
# biden_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)
biden.head()
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
94705BIDEN, JOSEPH R JRBHATT, SHAILENDCNOT PROVIDEDNOT PROVIDED622020731DEM
94706BIDEN, JOSEPH R JRLYNCH, SHEILAFLNOT PROVIDEDNOT PROVIDED5002020731DEM
94707BIDEN, JOSEPH R JRLYONS, STEPHANYGANOT PROVIDEDNOT PROVIDED10002020729DEM
94708BIDEN, JOSEPH R JRLYTLE, DENISECANOT PROVIDEDNOT PROVIDED202020729DEM
94709BIDEN, JOSEPH R JRMACKENZIE, GRETCHEN MCTNOT PROVIDEDNOT PROVIDED10002020727DEM

# 在4.2 热门候选人拜登在各州的获得的捐赠占比 中我们已经取出了所有支持拜登的人的数据,存在变量:biden中
# 将所有捐赠者姓名连接成一个字符串
data = ' '.join(biden["NAME"].tolist())
# 读取图片文件
bg = plt.imread("biden.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("biden_wordcloud.png")
<wordcloud.wordcloud.WordCloud at 0x7f3749dfe358>

在这里插入图片描述

# 按州总捐款热力地图
'''
参赛选手自由发挥、补充
第一个补充热力地图的参赛选手可以获得天池杯子一个
'''
'\n参赛选手自由发挥、补充\n第一个补充热力地图的参赛选手可以获得天池杯子一个\n'
# 收到捐赠额最多的两位候选人的总捐赠额变化趋势
'''
参赛选手自由发挥、补充
第一个补充捐赠额变化趋势图的参赛选手可以获得天池杯子一个
'''
'\n参赛选手自由发挥、补充\n第一个补充捐赠额变化趋势图的参赛选手可以获得天池杯子一个\n'
# 其他可视化方向
'''
参赛选手自由发挥、补充
官方将选取5个创新可视化的选手,送出天池杯子一个
'''
'\n参赛选手自由发挥、补充\n官方将选取5个创新可视化的选手,送出天池杯子一个\n'
c_itcont.head()
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0MORGAN, JOSEPH DAVIDMARTIN, WILLIAM IIAZRETIREDRETIRED1002020724REP
1MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020724REP
2MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020731REP
3WOOD, DANIELHOPKINS, RICHARDAZPOWERS-LEAVITTINSURANCE AGENT3002020810REP
4WOOD, DANIELPENDLETON, DIANEAZUNEMPLOYEDNOT PROVIDED5002020807REP

分析特朗普的捐款数据

5.1 热门候选人特朗普在各州的获得的捐赠占比
# 从所有数据中取出支持拜登的数据
trump = c_itcont[c_itcont['CAND_NAME']=='TRUMP, DONALD J.']
trump.head()
# 统计各州对拜登的捐款总数
trump_state = trump.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
trump_state.head()
# 饼图可视化各州捐款数据占比
trump_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)
# 在4.2 热门候选人拜登在各州的获得的捐赠占比 中我们已经取出了所有支持拜登的人的数据,存在变量:biden中
array([<AxesSubplot:ylabel='TRANSACTION_AMT'>], dtype=object)

在这里插入图片描述

5.2 trump的捐赠者词云图

以trump为原模型,制作词云图。

# 下载特朗普处理过的图片
!wget https://img.alicdn.com/tfs/TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg
os.rename('TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg', 'trump.jpg')
img = mpimg.imread('biden.jpg') 
plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
--2021-12-15 10:49:39--  https://img.alicdn.com/tfs/TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg
Resolving img.alicdn.com (img.alicdn.com)... 47.105.29.118, 47.105.29.107, 240e:978:1403:0:3::3fb, ...
Connecting to img.alicdn.com (img.alicdn.com)|47.105.29.118|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3151 (3.1K) [image/jpeg]
Saving to: ‘TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg’

100%[======================================>] 3,151       --.-K/s   in 0s      

2021-12-15 10:49:39 (977 MB/s) - ‘TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg’ saved [3151/3151]

在这里插入图片描述

# 将所有捐赠者姓名连接成一个字符串
data = ' '.join(trump["NAME"].tolist())
# 读取图片文件
bg = plt.imread("trump.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("trump_wordcloud.png")
<wordcloud.wordcloud.WordCloud at 0x7f374793fcf8>

在这里插入图片描述

党派分析

# 查看每个党派有多少捐款人
c_itcont.groupby("CAND_PTY_AFFILIATION")["NAME"].agg('count').sort_values(ascending=False)
CAND_PTY_AFFILIATION
DEM    524576
REP    229467
LIB       974
IND       886
DFL       179
GRE        60
UNK        42
CON         8
OTH         5
BDY         5
NPA         2
NON         1
Name: NAME, dtype: int64
# part_people = c_itcont.groupby("CAND_PTY_AFFILIATION")["NAME"].agg('count').sort_values(ascending=False)
part_people = c_itcont.groupby("CAND_PTY_AFFILIATION")["NAME"].count().sort_values(ascending=False)
part_people = pd.DataFrame(part_people)
# # part_people = pd.DataFrame(part_people, columns=["people"])
part_people.plot(kind='bar')
<AxesSubplot:xlabel='CAND_PTY_AFFILIATION'>

在这里插入图片描述

获得捐赠最多的党派有DEM(民主党)、REP(共和党),而且两个党派的捐赠数额比起其他党派遥遥领先

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值