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

需求:把民调结束时间转换成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
############################################################
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容