需求:把民调结束时间转换成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
############################################################
网友评论