一、学习知识点概要

本次主要通过阿里云天池的赛题【Python入门系列】用Pandas揭秘美国选民的总统喜好 进行学习,主要学习内容有:

  • 数据集获取
  • 数据处理
  • 数据探索和清洗
  • 数据分析
  • 数据可视化

二、学习内容

1.数据集获取

首先,我们需要获取以下信息:

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

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

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

候选人委员会链接信息
该文件显示候选人的身份证号码、候选人的选举年份、联邦选举委员会选举年份、委员会识别号、委员会类型、委员会名称和链接标识号。
信息描述详细:Candidate-committee linkage file description | FEC
关键字段说明

  • 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的相关数据,如果需要更全数据可以通过数据来源中的地址下载。
该文件包含有关收到捐款的委员会、披露捐款的报告、提供捐款的个人、捐款日期、金额和有关捐款的其他信息。
信息描述详细:Contributions by individuals file description | FEC
关键字段说明

  • CMTE_ID 委员会ID
  • NAME 捐款人姓名
  • CITY 捐款人所在市
  • State 捐款人所在州
  • EMPLOYER 捐款人雇主/公司
  • OCCUPATION 捐款人职业

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

接着我们需要安装词云处理包


  1. # 安装词云处理包wordcloud

  2. !pip install wordcloud --user

2.数据处理

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

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

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


  1. # 导入相关处理包

  2. import pandas as pd

  3. # 读取候选人信息,由于原始数据没有表头,需要添加表头

  4. candidates = pd.read_csv("weball20.txt", sep = '|',names=['CAND_ID','CAND_NAME','CAND_ICI','PTY_CD','CAND_PTY_AFFILIATION','TTL_RECEIPTS',

  5. 'TRANS_FROM_AUTH','TTL_DISB','TRANS_TO_AUTH','COH_BOP','COH_COP','CAND_CONTRIB',

  6. 'CAND_LOANS','OTHER_LOANS','CAND_LOAN_REPAY','OTHER_LOAN_REPAY','DEBTS_OWED_BY',

  7. 'TTL_INDIV_CONTRIB','CAND_OFFICE_ST','CAND_OFFICE_DISTRICT','SPEC_ELECTION','PRIM_ELECTION','RUN_ELECTION'

  8. ,'GEN_ELECTION','GEN_ELECTION_PRECENT','OTHER_POL_CMTE_CONTRIB','POL_PTY_CONTRIB',

  9. 'CVG_END_DT','INDIV_REFUNDS','CMTE_REFUNDS'])

  10. # 读取候选人和委员会的联系信息

  11. ccl = pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID'])

  12. # 关联两个表数据

  13. ccl = pd.merge(ccl,candidates)

  14. # 提取出所需要的列

  15. ccl = pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])

数据字段说明:

  • CMTE_ID:委员会ID
  • CAND_ID:候选人ID
  • CAND_NAME:候选人姓名
  • CAND_PTY_AFFILIATION:候选人党派

2.2 将候选人和捐赠人一一对应,通过CMTE_ID关联两个表

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


  1. # 读取个人捐赠数据,由于原始数据没有表头,需要添加表头

  2. # 提示:读取本文件大概需要5-10s

  3. itcont = pd.read_csv('itcont_2020_20200722_20200820.txt', sep='|',names=['CMTE_ID','AMNDT_IND','RPT_TP','TRANSACTION_PGI',

  4. 'IMAGE_NUM','TRANSACTION_TP','ENTITY_TP','NAME','CITY',

  5. 'STATE','ZIP_CODE','EMPLOYER','OCCUPATION','TRANSACTION_DT',

  6. 'TRANSACTION_AMT','OTHER_ID','TRAN_ID','FILE_NUM','MEMO_CD',

  7. 'MEMO_TEXT','SUB_ID'])

  8. # 将候选人与委员会关系表ccl和个人捐赠数据表itcont合并,通过 CMTE_ID

  9. c_itcont = pd.merge(ccl,itcont)

  10. # 提取需要的数据列

  11. c_itcont = pd.DataFrame(c_itcont, columns=[ 'CAND_NAME','NAME', 'STATE','EMPLOYER','OCCUPATION',

  12. 'TRANSACTION_AMT', 'TRANSACTION_DT','CAND_PTY_AFFILIATION'])

数据说明

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

3.数据探索和清洗

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


  1. # 查看数据规模 多少行 多少列

  2. c_itcont.shape

  3. #(756205, 8)

  4. # 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型

  5. c_itcont.info()

  6. '''

  7. <class 'pandas.core.frame.DataFrame'>

  8. Int64Index: 756205 entries, 0 to 756204

  9. Data columns (total 8 columns):

  10. # Column Non-Null Count Dtype

  11. --- ------ -------------- -----

  12. 0 CAND_NAME 756205 non-null object

  13. 1 NAME 756205 non-null object

  14. 2 STATE 756160 non-null object

  15. 3 EMPLOYER 737413 non-null object

  16. 4 OCCUPATION 741294 non-null object

  17. 5 TRANSACTION_AMT 756205 non-null int64

  18. 6 TRANSACTION_DT 756205 non-null int64

  19. 7 CAND_PTY_AFFILIATION 756205 non-null object

  20. dtypes: int64(2), object(6)

  21. memory usage: 51.9+ MB

  22. '''

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


  1. #空值处理,统一填充 NOT PROVIDED

  2. c_itcont['STATE'].fillna('NOT PROVIDED',inplace=True)

  3. c_itcont['EMPLOYER'].fillna('NOT PROVIDED',inplace=True)

  4. c_itcont['OCCUPATION'].fillna('NOT PROVIDED',inplace=True)

  5. # 对日期TRANSACTION_DT列进行处理

  6. c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(str)

  7. # 将日期格式改为年月日 7242020

  8. c_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in c_itcont['TRANSACTION_DT'] ]

  9. # 再次查看数据信息

  10. '''

  11. c_itcont.info()

  12. <class 'pandas.core.frame.DataFrame'>

  13. Int64Index: 756205 entries, 0 to 756204

  14. Data columns (total 8 columns):

  15. # Column Non-Null Count Dtype

  16. --- ------ -------------- -----

  17. 0 CAND_NAME 756205 non-null object

  18. 1 NAME 756205 non-null object

  19. 2 STATE 756205 non-null object

  20. 3 EMPLOYER 756205 non-null object

  21. 4 OCCUPATION 756205 non-null object

  22. 5 TRANSACTION_AMT 756205 non-null int64

  23. 6 TRANSACTION_DT 756205 non-null object

  24. 7 CAND_PTY_AFFILIATION 756205 non-null object

  25. dtypes: int64(1), object(7)

  26. memory usage: 51.9+ MB

  27. '''


  1. # 查看数据表中数据类型的列的数据分布情况

  2. c_itcont.describe()

  3. '''

  4. TRANSACTION_AMT

  5. count 7.562050e+05

  6. mean 1.504307e+02

  7. std 2.320452e+03

  8. min -5.600000e+03

  9. 25% 2.000000e+01

  10. 50% 3.500000e+01

  11. 75% 1.000000e+02

  12. max 1.500000e+06

  13. '''

  14. # 查看单列的数据发布情况

  15. c_itcont['CAND_NAME'].describe()

  16. '''

  17. count 756205

  18. unique 312

  19. top BIDEN, JOSEPH R JR

  20. freq 507816

  21. Name: CAND_NAME, dtype: object

  22. '''

4.数据分析


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

  2. c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

  3. '''

  4. TRANSACTION_AMT

  5. CAND_PTY_AFFILIATION

  6. DEM 75961730

  7. REP 37170653

  8. IND 328802

  9. LIB 169202

  10. DFL 76825

  11. GRE 18607

  12. NON 11256

  13. UNK 10195

  14. CON 4117

  15. BDY 3250

  16. '''

  17. # 计算每个总统候选人所获得的捐款总额,然后排序,取前十位

  18. c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

  19. '''

  20. TRANSACTION_AMT

  21. CAND_NAME

  22. BIDEN, JOSEPH R JR 68111142

  23. TRUMP, DONALD J. 16594982

  24. SULLIVAN, DAN 9912465

  25. JACOBS, CHRISTOPHER L. 6939209

  26. BLOOMBERG, MICHAEL R. 3451916

  27. MARKEY, EDWARD J. SEN. 606832

  28. SHAHEEN, JEANNE 505446

  29. KENNEDY, JOSEPH P III 467738

  30. CORNYN, JOHN SEN 345959

  31. FIGLESTHALER, WILLIAM MATTHEW MD 258221

  32. '''

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


  1. # 查看不同职业的人捐款的总额,然后排序,取前十位

  2. c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

  3. '''

  4. TRANSACTION_AMT

  5. OCCUPATION

  6. NOT EMPLOYED 24436214

  7. RETIRED 18669950

  8. NOT PROVIDED 5089355

  9. ATTORNEY 4443569

  10. FOUNDER 3519109

  11. PHYSICIAN 3295595

  12. CONSULTANT 1647033

  13. LAWYER 1565976

  14. PROFESSOR 1481260

  15. EXECUTIVE 1467865

  16. '''

  17. # 查看每个职业捐款人的数量

  18. c_itcont['OCCUPATION'].value_counts().head(10)

  19. '''

  20. NOT EMPLOYED 224109

  21. RETIRED 151834

  22. ATTORNEY 19666

  23. NOT PROVIDED 14912

  24. PHYSICIAN 14033

  25. CONSULTANT 8333

  26. PROFESSOR 8022

  27. TEACHER 8013

  28. ENGINEER 7922

  29. SALES 6435

  30. Name: OCCUPATION, dtype: int64

  31. '''

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


  1. # 每个州获捐款的总额,然后排序,取前五位

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

  3. '''

  4. TRANSACTION_AMT

  5. STATE

  6. CA 19999115

  7. NY 11468537

  8. FL 8128789

  9. TX 8101871

  10. MA 5187957

  11. '''

  12. # 查看每个州捐款人的数量

  13. c_itcont['STATE'].value_counts().head(5)

  14. '''

  15. CA 127895

  16. TX 54457

  17. FL 54343

  18. NY 49453

  19. MA 29314

  20. Name: STATE, dtype: int64

  21. '''

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

5.数据可视化

首先导入相关Python库


  1. # 导入matplotlib中的pyplot

  2. import matplotlib.pyplot as plt

  3. # 为了使matplotlib图形能够内联显示

  4. %matplotlib inline

  5. # 导入词云库

  6. from wordcloud import WordCloud,ImageColorGenerator

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


  1. # 各州总捐款数可视化

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

  3. st_amt=pd.DataFrame(st_amt, columns=['TRANSACTION_AMT'])

  4. st_amt.plot(kind='bar')

<AxesSubplot:xlabel='STATE'>

5.2 各州捐款总人数可视化


  1. # 各州捐款总人数可视化,取前10个州的数据

  2. st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)

  3. st_amt.plot(kind='bar')

<AxesSubplot:xlabel='STATE'>

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


  1. # 从所有数据中取出支持拜登的数据

  2. biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']

  3. # 统计各州对拜登的捐款总数

  4. biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)

  5. # 饼图可视化各州捐款数据占比

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

array([<AxesSubplot:ylabel='TRANSACTION_AMT'>], dtype=object)

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

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


  1. 首先下载图片模型,这里提供的是已经处理好的图片,有兴趣的选手可以自己写代码进行图片处理

  2. # 处理结果:需要将人图像和背景颜色分离,并纯色填充,词云才会只显示在人图像区域

  3. # 拜登原图:https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg

  4. # 拜登处理后图片:https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg

  5. !wget https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg

  6. # 由于下载图片文件名过长,我们对文件名进行重命名

  7. import os

  8. os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg', 'biden.jpg')

  9. # 将所有捐赠者姓名连接成一个字符串

  10. data = ' '.join(biden["NAME"].tolist())

  11. # 读取图片文件

  12. bg = plt.imread("biden.jpg")

  13. # 生成

  14. wc = WordCloud(# FFFAE3

  15. background_color="white", # 设置背景为白色,默认为黑色

  16. width=890, # 设置图片的宽度

  17. height=600, # 设置图片的高度

  18. mask=bg, # 画布

  19. margin=10, # 设置图片的边缘

  20. max_font_size=100, # 显示的最大的字体大小

  21. random_state=20, # 为每个单词返回一个PIL颜色

  22. ).generate_from_text(data)

  23. # 图片背景

  24. bg_color = ImageColorGenerator(bg)

  25. # 开始画图

  26. plt.imshow(wc.recolor(color_func=bg_color))

  27. # 为云图去掉坐标轴

  28. plt.axis("off")

  29. # 画云图,显示

  30. # 保存云图

  31. wc.to_file("biden_wordcloud.png")

<wordcloud.wordcloud.WordCloud at 0x7f64fca05400>

三、学习问题与解答

学习问题出现还是蛮多的,主要是出现的方法的机理,参数的作用不清楚。

四、学习思考与总结

本次学习的内容如果要完全理解对我这种几天前才开始学Python的人来说还是挺难的,里面有涉及到安装包、引入库的操作。引入的那些如Pandas、wordcloud包里面的方法不熟悉,学习起来比较吃力。这些例程做下记录,以后会好好学习弄懂。

机器学习训练营Python 阿里云天池 task4学习笔记相关推荐

  1. 阿里云天池task4学习笔记

    一.具体的学习内容 0.研究背景 数据时代的到来刷新了人们探索未知的方式,从基础能源建设到航天航空工程.在关都地区真新镇大木研究所一直孜孜不倦对精灵宝可梦进行研究的大木博士也不例外,在剧中我们就常常可 ...

  2. 阿里云天池task2学习笔记

    数据结构 数据结构一直以来就是我学编程的一个问题,因为我是主修硬件对编程的一些概念不是很清楚所以很多理解只能靠记和背很难说出自己的理解. 列表 列表的定义: 列表是有序集合,没有固定大小,能够保存任意 ...

  3. 机器学习训练营-基于XGBoost的分类预测学习笔记

    文章目录 前言 一.学习知识点概要 二.学习内容 1 XGBoost的应用及优缺点 1.1 XGBoost的应用 1.2 XGBoost的优缺点 2 基于天气数据集的XGBoost分类实战 2.1 目 ...

  4. 阿里云天池task4

    数据分析 首先task4是一个项目做一个数据分析的题目是关于2020美国选举的. 数据集 所有候选人信息 CAND_ID 候选人ID CAND_NAME 候选人姓名 CAND_PTY_AFFILIAT ...

  5. 阿里云专有网络VPC学习笔记

    转载自:专有网络 VPC - 帮助中心 - 阿里云 同一VPC内不同可用区的交换机内网互通.(同一VPC内网互通) 步骤: 步骤一 创建专有网络和交换机 步骤二 创建ECS实例 步骤三 创建EIP 步 ...

  6. 阿里云天池打卡笔记兼错题集

    一.python训练营 raise关键字:抛出指定异常 try:raise NameError('HiThere') except NmaeError:print('An exception flew ...

  7. 阿里云服务器部署学习笔记

    首先 点击云产品资源,在点击创建资源 之后 点击小电脑图标进行远程控制桌面的转换 打开火狐游览器进行登录,登录时输入子用户密码 点击三个横线Menu菜单中找到产品与服务中的云服务器ECS 选择右侧导航 ...

  8. 阿里云sql task1 学习笔记

    数据库 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.该数据集合成为数据库(database,DB).用来管理数据库的计算机系统称为数据库管理系统(Database Ma ...

  9. 阿里云api课程学习笔记

    API简介 API的概念 应用程序编程接口:是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码或理解内部工作机制的细节. API的特点 · 是一 ...

最新文章

  1. python浏览器自动化测试库【2018/7/27-更新】
  2. 转载别人的转载 Android Studio实用插件集合
  3. 中国最大的python社区-python找最大值
  4. javascript常用排序算法总结
  5. 通俗讲解分布式锁,看完不懂算作者输
  6. java根据pdf模板生成pdf_Java 复制、压缩PDF文档
  7. 清除SVOHOST.EXE的方法
  8. python学生信息管理系统
  9. Datatable转实体 实体转换辅助类
  10. idea redis 插件_Redis客户端RDM收费后,还有那些开源的替代品呢?
  11. 视频编解码硬件加速器分类
  12. w7计算机应用放大按键,Win7窗口最大化和最小化快捷键是什么
  13. 什么是反馈电路?反馈有什么作用?
  14. XV6 - bootsect.S
  15. 两寸证件照的尺寸是多少?如何换两寸证件照的背景色?
  16. 做UI设计需要具备什么技能
  17. IPv6大航海,风帆指向强应用
  18. C语言趣味问题系列【1】 猜牌术
  19. 信道的极限容量-奈氏准则、香农公式
  20. 优思学院|六西格玛的方差分析怎么计算?

热门文章

  1. 史上最全的Java命名规范[转]
  2. [Design]平面设计教程-《大师之路》
  3. [附源码]计算机毕业设计JAVA宠物商城
  4. php 实现点击下载,php实现当前页面点击下载文件的简单方法
  5. 迭代的快速排序(Iterative Quick Sort)
  6. mac视频播放器哪个最好用?mac用什么视频播放器?
  7. Arduino ESP32 对NVS数据操作测试
  8. 利用 kubeasz 给 suse 12 部署 kubernetes 1.20.1 集群
  9. 有趣的HTML实例(十四) 窗边风景动画(css+js)
  10. 【web-攻击web服务器】(13.2)易受攻击的服务器软件、Web 应用程序防火墙