python入门学习笔记4-数据分析

准备数据

  1. 读取数据
# 从txt文件中读取数据,一般txt文件存储的数据都不会有表头,所以需要手动添加表头
candidates = pd.read_csv("candidate.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'])
  1. 关联数据
    与sql中关联的定义一样,即将两张根据特定的字段进行内联。
# 关联ccl和candidates两张表的数据
ccl = pd.merge(ccl, candidates)
# 取出所需要的列,并将取出的数据转换为DataFrame格式(表格)
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:候选人党派 
# 将组合了前两张表的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'])                                                                          
  1. 查看数据
# 查看目前ccl表格的前10行
ccl.head(10)

# 查看数据规模,有多少行,多少列
c_itcont.shape
# (756205, 8)

# 统计整体数据信息,结果有三列:每个字段的名称,非空值数量,字段的数据类型
c_itcont.info()

# 查看数据表中数据类型的列的数据分布情况
c_itcont.describe()

# 查看单列的数据发布情况
c_itcont['CAND_NAME'].describe()
"""
<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
"""
  1. 数据预处理
  • 空值处理
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'] ]

数据分析

分类统计

  1. 统计每个党派(或是候选人、职业、州等其他字段)所获得的捐款总额:
  • 分组:groupby
  • 求和:sum(要求和的列)
  • 排序:sort_values("要排序的列",是否递增=false)
  • 查看前几行:head(10)
# 将数据按照党派分组,计算每个党派的所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_PTY_AFFILIATION").sum("TRANSACTION_AMT").sort_values("TRANSACTION_AMT",ascending=False).head(10)

数据查询(提取)

  1. 单列计数:查看每个职业(或是州)捐款人的数量
# 返回单列表格
c_itcont['OCCUPATION'].value_counts().head(10)
# 保留其他列的数据
st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
  1. 根据字段值查询:从所有数据中取出支持拜登的数据
biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
  1. 使用单列计数提取出每列的枚举值
# 提取出日期DT:使用单列计数提取出一列,转换为dict,提取出dict的keys,最后将keys转换为list
dateList = list(dict(c_itcont['TRANSACTION_DT'].value_counts()).keys())
dateList.sort()

数据可视化

  1. 导入相关库
# 导入matplotlib中的pyplot
import matplotlib.pyplot as plt
# 为了使matplotlib图形能够内联显示
% matplotlib inline

(柱状图)各州总捐款金额

进行数据分析统计出各州总捐款金额,并按照金额进行排序取出前十名(一共50个州,如果都画出来会显得图像太过拥挤。)

# 各州总捐款金额
st_amt = c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False)[:10]
# 将数据转化为DataFrame
st_amt = pd.DataFrame(st_amt, columns=['TRANSACTION_AMT'])
# 作图
st_amt.plot(kind='bar')

在这里插入图片描述

各州捐款总人数柱状图

st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')

在这里插入图片描述

(扇形图)拜登在各州获得捐赠占比

# 根据字段值查询:从所有数据中取出支持拜登的数据
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)

在这里插入图片描述

(词云图)捐赠者词云图

# 下载图片
!wget https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
import os
os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg', 'biden.jpg')
# 将所有捐赠者名字连成一个字符串:查询一列的值
def wordToString(dataSet, word):
	nameList = dataSet[word].tolist()
	data = ' '.join(nameList)
	return data
# 根据字符串作图
def plot(bg, data):
	bg = plt.imread(bg) # 读取背景图片
	wc = WordCloud(
		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") # 去掉坐标轴
# 生成图片:按州总捐款热力地图
plot("biden.jpg", wordToString(biden, "STATE"))

(折线图)总捐赠额变化趋势

日捐赠额变化趋势:

# 筛选出捐赠额最多的的两位候选人
Top2 = c_itcont.groupby("CAND_NAME").sum("TRANSACTION_AMT").sort_values("TRANSACTION_AMT", ascending = False)[:2]

# 将日期转换会int类型,才能进行排序
c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(int)

# 返回AMT随DT变化的数据
def AMT_DT(Name):
    biden = c_itcont[c_itcont['CAND_NAME']==Name]
    biden_date = biden.groupby('TRANSACTION_DT').sum("TRANSACTION_AMT").sort_values("TRANSACTION_DT")
    # biden_date = pd.DataFrame(biden_date, columns=['TRANSACTION_AMT']) # 只取DataFrame中的一列
    return biden_date
    
# 作图
bidenPlot = plt.plot(AMT_DT('BIDEN, JOSEPH R JR'), label='Biden')
trumpPlot = plt.plot(AMT_DT('TRUMP, DONALD J.'), label='Trump')
plt.legend(loc = "best")
plt.show()

在这里插入图片描述
累计捐赠额变化趋势

# 抽取出一位候选人捐赠额相对于日期的数据(上面已经定义过了)
def AMT_DT(Name):
    biden = c_itcont[c_itcont['CAND_NAME']==Name]
    biden_date = biden.groupby('TRANSACTION_DT').sum("TRANSACTION_AMT").sort_values("TRANSACTION_DT")
    return biden_date

# 提取出日期DT的枚举值
dateList = list(dict(c_itcont['TRANSACTION_DT'].value_counts()).keys())
dateList.sort()
dateList = [str(date)[5:] for date in dateList]

# 捐赠额AMT求和
def amtSum(data):
    amtList = data['TRANSACTION_AMT'].tolist()
    amtSumList = amtList[:]
    for i in range(1, len(amtList)):
        amtSumList[i] = amtList[i] + amtSumList[i-1]
    return amtSumList

# 作图
plt.plot(dateList, amtSum(AMT_DT('BIDEN, JOSEPH R JR')),label='Biden')
plt.plot(dateList, amtSum(AMT_DT('TRUMP, DONALD J.')),label='Trump')
plt.legend(loc = "best")
plt.show()

在这里插入图片描述

捐款与职业的相关性分析

各职业的平均捐赠额

# 每种职业的人数
occNum = c_itcont['OCCUPATION'].value_counts().head(20)

# 每种职业的总捐款额
occAMT = c_itcont.groupby('OCCUPATION').sum('TRANSACTION_AMT').sort_values('TRANSACTION_AMT', ascending=False).head(20)
occAMT = occAMT['TRANSACTION_AMT']

# 每种职业的平均捐赠额
occNumDict = dict(occNum)
occAMTDict = dict(occAMT)
occAvgDict = dict() # 每种职业的平均捐赠额
n = 0 # 捐款人数最多的职业和总捐款额最多的职业中重复的职业有多少
for occ in occNumDict:
    if occAMTDict.get(occ): 
        occAvgDict[occ] = (int)(occAMTDict[occ]/occNumDict[occ])# 每种职业的捐款人数/每种职业的捐款总额
        n+=1

# 每种职业的平均捐赠额
# 柱状图:plt.图形形状(x, y)
plt.bar(occAvgDict.keys(),occAvgDict.values())

在这里插入图片描述
总捐款额职业占比图

# 总捐款额占比图
occAMT.plot.pie(figsize=(10, 10)) # 为什么每个标注会出现两次呢?

在这里插入图片描述
总捐款人数职业占比图

# 总捐款人数占比图
occNum.plot.pie(figsize=(10, 10)) # 为什么每个标注会出现两次呢?

在这里插入图片描述

如果想要分析两个候选人收到每种职业的捐赠额有什么不同(例如比例,捐赠额),更换数据集即可。不再赘述。

资料参考自阿里天池python训练营

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值