美文网首页
4.数据处理案例——民调统计

4.数据处理案例——民调统计

作者: 零_WYF | 来源:发表于2018-01-23 20:55 被阅读82次

    需求:把民调结束时间转换成yy-mm的形式,按照月份,统计特朗普和希拉里民调的和

    1. 引入所需模块

    import numpy as np
    import datetime
    

    2. 数据文件的储存地址

    filename = './presidential_polls.csv'
    

    3. 打开文件,读取列名,也就是第一行的数据

    with open(filename,'r') as f:
        col_names_str = f.readline()[:-1]
    print(col_names_str)
    ##################################运行结果####################################
    cycle,branch,type,matchup,forecastdate,state,startdate,enddate,pollster,grade,
    samplesize,population,poll_wt,rawpoll_clinton,rawpoll_trump,rawpoll_johnson,
    rawpoll_mcmullin,adjpoll_clinton,adjpoll_trump,adjpoll_johnson,adjpoll_mcmullin,
    multiversions,url,poll_id,question_id,createddate,timestamp
    ##############################################################################
    

    4. 把标题的字符串切分开来,转换成列表

    col_names_list = col_names_str.split(',')
    print(col_names_list)
    ##################################运行结果####################################
    ['cycle', 'branch', 'type', 'matchup', 'forecastdate', 'state', 'startdate', 'enddate',
     'pollster', 'grade', 'samplesize', 'population', 'poll_wt', 'rawpoll_clinton', 
    'rawpoll_trump', 'rawpoll_johnson', 'rawpoll_mcmullin', 'adjpoll_clinton', 
    'adjpoll_trump', 'adjpoll_johnson', 'adjpoll_mcmullin', 'multiversions', 'url', 
    'poll_id', 'question_id', 'createddate', 'timestamp']
    ##############################################################################
    

    5. 定义使用的列

    # 定义使用的列
    use_col_name_list = ['enddate','adjpoll_clinton','adjpoll_trump']
    

    6. 获取相应的列名,索引号

    use_col_index_list = [col_names_list.index(use_col_name) for use_col_name in use_col_name_list]
    print(use_col_index_list)
    #######################运行结果########################
    [7, 17, 18]
    ######################################################
    

    7. 加载文件读取数据

    # 加载文件读取数据
    data_array = np.loadtxt(filename, # 文件名
                            delimiter = ',', # 逗号分隔符
                            skiprows = 1, # 跳过指定的行
                            dtype = str, # 字符串类型
                            usecols = use_col_index_list # 指定读取列的索引
    )
    print(data_array)
    #######################运行结果########################
    [['10/31/2016' '42.6414' '40.86509']
     ['10/30/2016' '43.29659' '44.72984']
     ['10/30/2016' '46.29779' '40.72604']
     ..., 
     ['9/22/2016' '45.9713' '39.97518']
     ['6/21/2016' '45.2939' '46.66175']
     ['8/18/2016' '31.62721' '44.65947']]
    ######################################################
    

    8. 处理日期的格式

    # 处理日期的格式
    enddate_idx = use_col_name_list.index('enddate')
    print(enddate_idx)
    enddate_lst = data_array[:,enddate_idx].tolist()
    print(enddate_lst)
    #######################运行结果########################
    ['10/31/2016', '10/30/2016',....., '6/21/2016', '8/18/2016']
    ######################################################
    

    9. 将日期字符串格式同一

    enddate_lst = [enddate.replace('-','/') for enddate in enddate_lst]
    print(enddate_lst)
    #######################运行结果########################
    ['10/31/2016', '10/30/2016',....., '6/21/2016', '8/18/2016']
    ######################################################
    

    10. 将日期的字符串转换成日期

    # 将日期的字符串转换成日期
    date_lst = [datetime.datetime.strptime(enddate,'%m/%d/%Y') for enddate in enddate_lst]
    print(date_lst)
    #######################运行结果########################
    [datetime.datetime(2016, 10, 31, 0, 0),......, datetime.datetime(2016, 8, 18, 0, 0)]
    ######################################################
    

    11. 构造年份一月份的列表

    # 构造年份一月份的列表
    month_list = ["%d-%02d" % (date_obj.year,date_obj.month) for date_obj in date_lst]
    print(month_list)
    #######################运行结果########################
    ['2016-10', '2016-10',......, '2016-08']
    ######################################################
    

    12. 去重

    month_array = np.array(month_list)
    months = np.unique(month_array) # 去重
    print(months)
    #######################运行结果########################
    ['2015-11' '2015-12' '2016-01' '2016-02' '2016-03' '2016-04' '2016-05'
     '2016-06' '2016-07' '2016-08' '2016-09' '2016-10']
    ######################################################
    

    13. 统计希拉里调整之后的投票数

    # 统计希拉里调整之后的投票数
    adjpoll_clinton_idx = use_col_name_list.index("adjpoll_clinton")
    adjpoll_clinton_data  = data_array[:,adjpoll_clinton_idx]
    print(adjpoll_clinton_data)
    #######################运行结果########################
    ['42.6414' '43.29659' '46.29779' ..., '45.9713' '45.2939' '31.62721']
    ######################################################
    

    14. 数据类型的转换

    # 数据类型的转换
    adjpoll_clinton_data = np.where(adjpoll_clinton_data == "","0",adjpoll_clinton_data)
    adjpoll_clinton_data = adjpoll_clinton_data.astype(np.float64)
    print(adjpoll_clinton_data)
    #######################运行结果########################
    [ 42.6414   43.29659  46.29779 ...,  45.9713   45.2939   31.62721]
    ######################################################
    

    15. 统计特朗普调整后的投票情况

    adjpoll_trump_idx = use_col_name_list.index("adjpoll_trump")
    adjpoll_trump_data = data_array[:,adjpoll_trump_idx]
    print(adjpoll_trump_data)
    #######################运行结果########################
    ['40.86509' '44.72984' '40.72604' ..., '39.97518' '46.66175' '44.65947']
    ######################################################
    

    16. 数据类型从字符串转换成float

    # 数据类型从字符串转换成float
    adjpoll_trump_data = np.where(adjpoll_trump_data=="","0",adjpoll_trump_data)
    adjpoll_trump_data = adjpoll_trump_data.astype(np.float64)
    print(adjpoll_trump_data)
    #######################运行结果########################
    [ 40.86509  44.72984  40.72604 ...,  39.97518  46.66175  44.65947]
    ######################################################
    

    17. 按月份统计选票

    results = []
    for month in months:
        # 调整之后 希拉里的数据
        adjpoll_clinton_month_data = adjpoll_clinton_data[month_array==month]
        # 统计当月的总票数
        adjpoll_clinton_month_sum = np.sum(adjpoll_clinton_month_data)
        
        # 调整之后,特朗普的数据
        adjpoll_trump_month_data = adjpoll_trump_data[month_array == month]
        # 统计求和
        adjpoll_trump_month_sum = np.sum(adjpoll_trump_month_data)
        
        results.append([month,adjpoll_clinton_month_sum,adjpoll_trump_month_sum])
    

    18. 打印结果

    # 打印结果
    for item in results:
        print("{}:clinton:{},trump:{}".format(item[0],item[1],item[2]))
    ##########################运行结果###########################
    2015-11:clinton:1916.6980600000002,trump:1937.3290100000002
    2015-12:clinton:4637.25688,trump:4088.9218999999994
    2016-01:clinton:6585.167019999999,trump:6253.24935
    2016-02:clinton:7946.228610000001,trump:7672.3398
    2016-03:clinton:11156.09824,trump:9991.59358
    2016-04:clinton:11579.426780000002,trump:9884.156190000002
    2016-05:clinton:12242.27538,trump:12069.761290000002
    2016-06:clinton:19771.335759999998,trump:18154.90623
    2016-07:clinton:23233.111679999998,trump:22757.07327
    2016-08:clinton:67909.28210000001,trump:66428.29714000001
    2016-09:clinton:102445.45295,trump:106065.00385000001
    2016-10:clinton:165319.59355,trump:164990.78638900002
    ############################################################
    

    相关文章

      网友评论

          本文标题:4.数据处理案例——民调统计

          本文链接:https://www.haomeiwen.com/subject/egjeaxtx.html