提取码:8828 (本文用到的文档数据)
#导入工具包 import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt %matplotlib inline months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6, 'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12} of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 'Paul, Ron', 'Gingrich, Newt'] parties = { 'Bachmann, Michelle': 'Republican', 'Romney, Mitt': 'Republican', 'Obama, Barack': 'Democrat', "Roemer, Charles E. 'Buddy' III": 'Reform', 'Pawlenty, Timothy': 'Republican', 'Johnson, Gary Earl': 'Libertarian', 'Paul, Ron': 'Republican', 'Santorum, Rick': 'Republican', 'Cain, Herman': 'Republican', 'Gingrich, Newt': 'Republican', 'McCotter, Thaddeus G': 'Republican', 'Huntsman, Jon': 'Republican', 'Perry, Rick': 'Republican' } #导入政治献金的 啊、三个表 import random- contb1=pd.read_csv('contb_01.csv')
contb2=pd.read_csv('contb_02.csv')
contb3=pd.read_csv('contb_03.csv') # 展示第一张表的 前5个数据 contb1.head(3)
# 展示 第一张表的关键信息 contb1.info()
#把三张表拼接在一起 contb = pd.concat((contb1,contb2,contb3),axis=0) contb.head(3) contb.info()
# 主表中各个字段的定义 cand_nm 候选人的姓名 contbr_nm 选举人姓名 contbr_st 选举人所在的州 contbr_employer 选举人的职位 contbr_occupation 选举人的行业 contb_receipt_amt 政治献金的数目 contb_receipt_dt 捐赠的时间 # 候选人数据,unique 去除重复的数据 contb['cand_nm'].unique()
# 采用 map 映射,将候选人的党派作为新的一列添加到数据中 contb['party'] = contb['cand_nm'].map(parties) contb.head()
# 找到关于奥巴马的信息 aobama=contb.loc[contb['cand_nm']=='Obama, Barack'] # 给奥巴马的所有的政治献金 value=aobama.groupby(['cand_nm'])['contb_receipt_amt'].sum() value
# 查出有多少党派 contb['party'].unique()
#查出各个党派被捐助的次数 # 第一种方法 count=contb.groupby('party').count() # 按照降序进行排列 count.sort_values(by="cand_nm",ascending=False).reset_index()
# 各个党派被捐助的次数 contb['party'].value_counts()
# 绘制各个党派捐助的次数的 柱形图 contb['party'].value_counts().plot(kind="bar")
# 各个党派政治献金的总数 contb.groupby('party')["contb_receipt_amt"].sum().plot(kind="line")
contb.groupby('party')['contb_receipt_amt'].mean().plot(kind="line")
contb.columns
# 先不考虑时间类型 # 多分组 按照党派 按照时间进行 显示数据 #unstack 参数level = -1 将最后一列转化为 行 temp=contb.groupby(['contb_receipt_dt','party'])['contb_receipt_amt'].sum().unstack(level=-1,fill_value=0) temp.sort_index()
temp.info()
#获取当前的时间 now=pd.datetime.now() now #时间格式 # 2021-01-05 #时间属于数值类型 往前推一天,时间还可以进行排序 pd.to_datetime(np.array(["2021-09-8","8-MAY-21"]))
# 输入外国时间的格式转化为中文的时间格式 def map_datetime(x): day,month,year = x.split("-") # 根据月份的字典得到 月份具体指 m = months[month] return "20{}-{}-{}".format(year,m,day) map_datetime("8-MAY-21")
party_dt = contb.groupby(['contb_receipt_dt','party'])['contb_receipt_amt'].sum().unstack(level=-1,fill_value=0) party_dt.sort_index(inplace=True) party_dt.plot(kind="line")
#每天政治献金的累计数 ,线性图 party_dt.cumsum().plot(kind="line")#那几个月是竞选的高峰期 #对月份进行分组,月份找出来,使用map的方式In [91]:
#如果是时间类型,不需要那么解决,时间类型有它专门的分组处理方案 # 重采样 用于时间分组,前提是类型必须是 以时间类型作为发型索引 contb.info()
temp = contb.set_index('contb_receipt_dt') temp.resample("Y")["contb_receipt_amt"].sum().plot(kind="bar")- Out[175]:
# 找出每个月的政治献金的总数 temp.resample("M")["contb_receipt_amt"].sum().plot(kind="bar")
# 求出每个党派 每隔月政治献金的总数,并绘制图形 # 把时间设置成索引 contb=contb.set_index('contb_receipt_dt') contb contb.groupby(['contb_receipt_dt','party'])['contb_receipt_amt'].sum().unstack(level=-1,fill_value=0).resample("M").sum().plot(kind="bar")
# 如果是2 分组的逻辑,可以直接使用透视表解决 pd.pivot_table(contb,index="contb_receipt_dt",columns="party",values="contb_receipt_amt",aggfunc=sum,fill_value=0).resample("M").sum().plot(kind="bar")
# 找出最有竞争力的两个人 列表 good_man_names = contb.groupby('cand_nm')['contb_receipt_amt'].sum().sort_values(ascending=False)[:2].index good_man_names
# 最有竞争力的 两个人的条件 condition = (contb['cand_nm']==good_man_names[0])|(contb['cand_nm']==good_man_names[1]) # 根据条件 找出最有竞争力的两个人 good_man = contb.loc[condition ] #得到最有竞争力的两个人 gooodTwo=good_man['cand_nm'].unique() #得到的是 numpy的数组 type(gooodTwo)
VETERAN =contb.loc[contb['contbr_occupation']=='DISABLED VETERAN'] VETERAN #从数量看 老兵支持谁 VETERAN['cand_nm'].value_counts()
#从政治献金的额度 看老兵都支持税 VETERAN.groupby('cand_nm')['contb_receipt_amt'].sum().sort_values(ascending=False)