python数据分析美国大选项目实战(三)
项目介绍
项目地址:https://www.kaggle.com/fivethirtyeight/2016-election-polls
包含了2015年11月至2016年11月期间对于2016美国大选的选票数据,共27列。
项目目的:分析每个月的民意调查统计趋势。
涉及知识点:
- 高阶函数filter
- numpy读取文本文件
- 处理日期格式数据
- numpy的切片和索引
- numpy的统计方法
- 列表推导式
- 数据结构zip
- Matplotlib进行简单的数据可视化
项目代码
# -*- coding: utf-8 -*- import numpy as np
import datetime
import matplotlib.pyplot as plt def main():
# 数据文件地址
filename = './presidential_polls.csv' # 读取列名,即第一行数据
with open(filename, 'r') as f:
col_names_str = f.readline()[:-1] # [:-1]表示不读取末尾的换行符'\n' # 将字符串拆分,并组成列表
col_name_lst = col_names_str.split(',') # 使用的列名
use_col_name_lst = ['enddate', 'rawpoll_clinton', 'rawpoll_trump', 'adjpoll_clinton', 'adjpoll_trump'] # 获取相应列名的索引号
use_col_index_lst = [col_name_lst.index(use_col_name) for use_col_name in use_col_name_lst] # 数据读取
data_array = np.loadtxt(filename, # 文件名
delimiter=',', # 分隔符
skiprows=1, # 跳过第一行,即跳过列名
dtype=str, # 数据类型
usecols=use_col_index_lst) # 指定读取的列索引号 # 处理日期格式数据
enddate_idx = use_col_name_lst.index('enddate')
enddate_lst = data_array[:, enddate_idx].tolist()
# print enddate_lst # 将日期字符串格式统一,即'yy/dd/mm'
enddate_lst = [enddate.replace('-', '/') for enddate in enddate_lst] # 将日期字符串转换成日期
date_lst = [datetime.datetime.strptime(enddate, '%m/%d/%Y') for enddate in enddate_lst] # 构造年份-月份列表
month_lst = ['%d-%02d' % (date_obj.year, date_obj.month) for date_obj in date_lst] month_array = np.array(month_lst)
months = np.unique(month_array)
# print months # 统计民意投票数
# cliton
# 原始数据 rawpoll
rawpoll_clinton_idx = use_col_name_lst.index('rawpoll_clinton')
rawpoll_clinton_data = data_array[:, rawpoll_clinton_idx] # 调整后的数据 adhpool
adjpoll_clinton_idx = use_col_name_lst.index('adjpoll_clinton')
adjpoll_clinton_data = data_array[:, adjpoll_clinton_idx] # trump
# 原始数据 rawpoll
rawpoll_trump_idx = use_col_name_lst.index('rawpoll_trump')
rawpoll_trump_data = data_array[:, rawpoll_trump_idx] # 调整后的数据 adjpoll
adjpoll_trump_idx = use_col_name_lst.index('adjpoll_trump')
adjpoll_trump_data = data_array[:, adjpoll_trump_idx] # 结果保存
results = [] for month in months:
# clinton
# 原始数据 rawpoll
rawpoll_clinton_month_data = rawpoll_clinton_data[month_array == month]
# 统计当月的总票数
rawpoll_clinton_month_sum = get_sum(rawpoll_clinton_month_data) # 调整数据 adjpoll
adjpoll_clinton_month_data = adjpoll_clinton_data[month_array == month]
# 统计当月的总票数
adjpoll_clinton_month_sum = get_sum(adjpoll_clinton_month_data) # trump
# 原始数据 rawpoll
rawpoll_trump_month_data = rawpoll_trump_data[month_array == month]
# 统计当月的总票数
rawpoll_trump_month_sum = get_sum(rawpoll_trump_month_data) # 调整数据 adjpoll
adjpoll_trump_month_data = adjpoll_trump_data[month_array == month]
# 统计当月的总票数
adjpoll_trump_month_sum = get_sum(adjpoll_trump_month_data) results.append((month, rawpoll_clinton_month_sum, adjpoll_clinton_month_sum, rawpoll_trump_month_sum,
adjpoll_trump_month_sum)) # print results
months, raw_cliton_sum, adj_cliton_sum, raw_trump_sum, adj_trump_sum = zip(*results) # 可视化分析结果
fig, subplot_arr = plt.subplots(2, 2, figsize=(15, 10)) # 原始数据趋势展示
subplot_arr[0, 0].plot(raw_cliton_sum, color='r')
subplot_arr[0, 0].plot(raw_trump_sum, color='g') width = 0.25
x = np.arange(len(months))
subplot_arr[0, 1].bar(x, raw_cliton_sum, width, color='r')
subplot_arr[0, 1].bar(x + width, raw_trump_sum, width, color='g')
subplot_arr[0, 1].set_xticks(x + width)
subplot_arr[0, 1].set_xticklabels(months, rotation='vertical') # 调整数据趋势展示
subplot_arr[1, 0].plot(adj_cliton_sum, color='r')
subplot_arr[1, 0].plot(adj_trump_sum, color='g') width = 0.25
x = np.arange(len(months))
subplot_arr[1, 1].bar(x, adj_cliton_sum, width, color='r')
subplot_arr[1, 1].bar(x + width, adj_trump_sum, width, color='g')
subplot_arr[1, 1].set_xticks(x + width)
subplot_arr[1, 1].set_xticklabels(months, rotation='vertical') plt.subplots_adjust(wspace=0.2) plt.show() def is_convert_float(s):
"""
判断一个字符串能否转换为float
"""
try:
float(s)
except:
return False
return True def get_sum(str_array):
"""
返回字符串数组中数字的总和
"""
# 去掉不能转换成数字的数据
cleaned_data = filter(is_convert_float, str_array) # 转换数据类型
float_array = np.array(cleaned_data, np.float) return np.sum(float_array) if __name__ == '__main__':
main()
python数据分析美国大选项目实战(三)的更多相关文章
- Python爬虫开发与项目实战
Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...
- Python爬虫开发与项目实战pdf电子书|网盘链接带提取码直接提取|
Python爬虫开发与项目实战从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言与HTML基础知识引领读者入门,之后根据当前风起云涌的云计算.大数据热潮,重点讲述了云计算的相关内容及其在爬虫中的应 ...
- miniFTP项目实战三
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- 项目实战利用Python来看美国大选
一.项目介绍 首先分析美国总统竞选这个项目是一个烂大街的项目,但是他的确是一个适合Python新手入门的数据处理项目. 本人在大二刚刚学习了Python数据处理,学习时间不超过5个小时,但是已经可以完 ...
- 【SSH项目实战三】脚本密钥的批量分发与执行
[SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...
- python工业互联网监控项目实战5—Collector到opcua服务
本小节演示项目是如何从连接器到获取Tank4C9服务上的设备对象的值,并通过Connector服务的url返回给UI端请求的.另外,实际项目中考虑websocket中间可能因为网络通信等原因出现中断情 ...
- python项目实战三个小实例
1. 让用户输入圆的半径,告诉用户圆的面积: import math while True: # 用户输入 r = input("请输入圆的半径:") ...
- python工业互联网监控项目实战4—python opcua
前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA.OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅 ...
- PHP之MVC项目实战(三)
本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程: 触发阶段(发生一个错误) 处理阶段(如何处理该错误) 触发阶段 系统 ...
随机推荐
- python 回溯法 子集树模板 系列 —— 11、全排列
问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模板. 不过本文使用子集树模板.分析如下: 一个解x就是n个元素的一种排列,显然,解x的长度是固定 ...
- PHP7添加opcache.so模块
启动php报错如下: # /usr/local/php7/sbin/php-fpm [-Apr- ::] NOTICE: PHP message: PHP Warning: PHP Startup: ...
- KNN算法的R语言实现
近邻分类 简言之,就是将未标记的案例归类为与它们最近相似的.带有标记的案例所在的类. 应用领域: 1.计算机视觉:包含字符和面部识别等 2.推荐系统:推荐受众喜欢电影.美食和娱乐等 3.基因工程:识别 ...
- TICTOC: Header Only C++ Timer
感觉最近的更新频率略高啊-哈哈- 这次的带来的是一个十分简单便利的C++计时库. 项目地址:https://github.com/miaoerduo/tictoc 欢迎Start和提MR. 项目中有详 ...
- 【ORACLE】oracle11g单实例安装
-- 上传安装包 p13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip -- 解压安装包 unzi ...
- JQuery快速入门-Ajax
一.AJAX概述 概念:AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). 优点:通过在后台与服务器进行少量数据交换,AJAX ...
- nodejs安装及npm模块插件安装路径配置
在学习完js后,我们就要进入nodejs的学习,因此就必须配置nodejs和npm的属性了. 我相信,个别人在安装时会遇到这样那样的问题,看着同学都已装好,难免会焦虑起来.于是就开始上网查找解决方案, ...
- How to export data from Thermo-Calc 如何从Thermo-calc导出文本数据
记录20180510 问题:如何从thermo-calc导出文本数据供origin绘图? 解决: In Thermo-Calc graphical mode, you can just add a ' ...
- PAT甲题题解-1103. Integer Factorization (30)-(dfs)
该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...
- 每日scrum(6)
今天是小组正式冲刺的第六天,软件的各种结尾工作,还有一些模块就已经全部实现了: 遇到的问题主要是对于自己能力的担忧,以前总是想,如果自己努力,就会怎样成功,其实并不是那样,小小的距离就是很远的能力差距 ...