python数据分析美国大选项目实战(三)
2017-03-12 21:48
741 查看
项目介绍
项目地址: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来看美国大选
- 500G python web、爬虫、数据分析、机器学习、大数据、前端实战项目视频代码免费分享
- 福布斯系列之数据分析思路篇 | Python数据分析项目实战
- Pandas实战——美国大选数据分析
- 福布斯系列之数据采集 | Python数据分析项目实战
- python数据分析与挖掘项目实战记录
- Python 数据学习入门之 django Blog 项目实战练习
- Python数据分析与挖掘实战—挖掘建模
- 【Python实战】Pandas:让你像写SQL一样做数据分析(二)
- 《用python 玩转数据》项目——B站弹幕数据分析
- python数据分析与挖掘学习笔记(7)-交通路标自动识别实战与神经网络算法
- python数据分析与挖掘实战-4
- python数据分析之股票实战
- mapreduce实战:统计美国各个气象站30年来的平均气温项目分析
- Python数据分析与挖掘实战(开发流程及常用库安装)
- Python数据分析与挖掘实战(数据预处理)
- python数据挖掘与分析实战—1、2、3
- 『Python数据分析与挖掘实战』第五章:挖掘建模
- 【python项目实战】BBS论坛(3)页面输出数据,及跳转
- 大数据spark“蘑菇云”行动超大型项目实战第68课:spark RDD案例和spark sql案例对比实战 看电影的例子分析 某门热门电影的年龄、性别分析