2012 年美国总统候选人政治献金 数据分析(numpy+pandas)

提取码: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)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值