標籤:otl plt sum 統計 判斷 ace turn 類型 ane
項目介紹
項目地址: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 npimport datetimeimport matplotlib.pyplot as pltdef 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 Truedef 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資料分析美國大選項目實戰(三)