利用Python来看美国大选 —— I
利用Python来看美国大选 —— I
一.项目介绍
首先分析美国总统竞选这个项目是一个烂大街的项目,但是他的确是一个适合Python新手入门的数据处理项目。
本人在大二刚刚学习了Python数据处理,学习时间不超过5个小时,但是已经可以完成基本的数据处理了。
首先来看项目:
得到的数据就是又分csv文件(就是用逗号隔开的纯文本文件),如下:
而我们需要的是图形,可视化的数据,能够将数据直观的展现出来,结果如下:
好,废话不多说,来看看怎么处理数据。
二.项目操作
2.1数据的导入——将csv文件数据导入MySQL
由于我们的数据是放在csv文件中的,我们可以将csv文件中的数据导入MySQL中,利用MySQL的数据处理能力来简化项目复杂度。
我们首先来看看这个csv文件:一共含有十几列
但是其中只有7列使我们需要的,也就是state州名,enddate截止日期,grade评分,三位参选人的得票概率,id
那么我们将这七列全部单独拿出来如下:
那么我们现在将这7列导入MySQL中,首先建一个表存放这7列数据,SQL语句如下:
use py_us_pre_ele; create table if not exists tab(#表 state varchar(20),#州名 enddate varchar(10), #截止时间 grade varchar(5),#评分 clinton varchar(15),#希拉里所占的比例 trump varchar(15),#川普所占的比例 johnson varchar(15),#强生所占的比例 id varchar(10) primary key );
我们必须保证每一条数据的poll_id都是不重复,因为我们表的id列是主键。
下面我们要来导入数据,直接通过MySQL的load方法来导入,在MySQL中写下如下代码:
load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\presidential_polls.csv' into table tab fields terminated by ',' enclosed by '"' lines terminated by '\r\n';
上面的sql语句有一点需要注意那就是你必须将你的导入文件放入到放入到你的MySQL指定的Uploads文件夹下,如果你的MySQL是默认安装复制这个路径即可:
C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
执行语句后,我们来看看这我们的表
嗯,没问题,一万条数据已经导入。
2.2找出投票中的所有州
为了按照州来查询数据,我们首先要得到所有的州,利用set集合来处理重复名称,并将所有的州名保存在本地文件中。
代码如下:
import pymysql #获得数据库的链接 def getdb(): conn_db = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4399", db="py_us_pre_ele", charset="utf8") return conn_db #得到数据库中的所有的城市 def get_all_city(db): set={""}#创建一个set集合,用来放置所有的城市 str_sql="select state from tab"#查找到所有的城市语句 cur=db.cursor()#得到cursor对象 cur.execute(str_sql)#执行sql语句 rows=cur.fetchall()#得到结果集 for row in rows:#将城市加入到不重复的set集合中 set.add(row) set.remove("") with open("all_cities.txt", "w") as f: for ele in set: f.write(str(ele)+"\n") def main(): get_all_city(getdb()) if __name__ == '__main__': main() print("程序完成")
得到州的名称以后我们利用matplotlib库来画出饼图,利用easyui来进行简单包装。
代码如下:
import easygui as g import pymysql import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei']#插入中文不会出现空格 import random #得到所有的州的名称 states = {"U.S."} list=[] def get_state(): # 将所有的州写入全局变量中 for line in open("all_cities.txt", "r"): # 设置文件对象并读取每一行文件 line = line[:-1] # 去除换行符 states.add(line.split("'")[1]) # 将每一行文件加入到state中,只有州的名称 def main(): # 启动界面 g.msgbox("\n\n\t\t\t\t美国大选的数据处理", ok_button='打开', title="美国大选的数据处理") #得到所有的州的名称 get_state() reply = g.choicebox("选择的州", choices=states) #如果有选择则确认选择的州 if reply!=None : YN=g.boolbox(msg='\n\n\n\t\t\t\t确定你的选择:'+reply, title='确认选择', choices=('Yes', 'No'), image=None) if YN==True:#完成了最终的确认 sql="select clinton,trump,johnson,grade,id from tab where state='"+reply+"'"#构造sql语句查找数据 db = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4399", db="py_us_pre_ele",charset="utf8")#得到一个物理会话 cur = db.cursor()#得到一个cursor对象 cur.execute(sql)#执行sql语句 for i in range(cur.rowcount - 1):#去除列名 row = cur.fetchone() if 'a' not in row[0]:#防止列名 clinton = float(row[0].strip()) trump = float(row[1].strip()) johnson = float(row[2].strip()) tup = (clinton, trump, johnson) list.append(tup) paint(tup, reply, row[3], row[4]) con=g.buttonbox(reply + "州的第" + row[4] + "号" + "图片" + "评论机构评分;" + row[3], image=str(row[4]) + 'pie.png', choices=("下一张", "退出")) if con=="退出": exit("退出") else: g.msgbox("程序退出") def paint(tup,state,grade,id):#画图 label_list = ["川普", "希拉里", "强生", "弃权票"] # 各部分标签 size = [tup[0], tup[1], tup[2], (100-tup[0]-tup[1]-tup[2])] # 各部分大小 color = ["red", "green", "blue", "yellow"] # 各部分颜色 explode = [0.05, 0, 0, 0] # 各部分突出值 patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6) plt.axis("equal") # 设置横轴和纵轴大小相等,这样饼才是圆的 plt.legend() ran_num = random.sample(range(10000), 1) plt.savefig(str(id)+'pie.png') plt.show() if __name__ == '__main__': main()
运行这个脚本,就可以得到一个简单小软件了,意向的可以留下邮箱,发给你csv文件
import easygui as g
import pymysql
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']#插入中文不会出现空格
import random
#得到所有的州的名称
states = {"U.S."}
list=[]
def get_state(): # 将所有的州写入全局变量中
for line in open("all_cities.txt", "r"): # 设置文件对象并读取每一行文件
line = line[:-1] # 去除换行符
states.add(line.split("'")[1]) # 将每一行文件加入到state中,只有州的名称
def main():
# 启动界面
g.msgbox("\n\n\t\t\t\t美国大选的数据处理", ok_button='打开', title="美国大选的数据处理")
#得到所有的州的名称
get_state()
reply = g.choicebox("选择的州", choices=states)
#如果有选择则确认选择的州
if reply!=None :
YN=g.boolbox(msg='\n\n\n\t\t\t\t确定你的选择:'+reply, title='确认选择', choices=('Yes', 'No'), image=None)
if YN==True:#完成了最终的确认
sql="select clinton,trump,johnson,grade,id from tab where state='"+reply+"'"#构造sql语句查找数据
db = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="4399", db="py_us_pre_ele",charset="utf8")#得到一个物理会话
cur = db.cursor()#得到一个cursor对象
cur.execute(sql)#执行sql语句
for i in range(cur.rowcount - 1):#去除列名
row = cur.fetchone()
if 'a' not in row[0]:#防止列名
clinton = float(row[0].strip())
trump = float(row[1].strip())
johnson = float(row[2].strip())
tup = (clinton, trump, johnson)
list.append(tup)
paint(tup, reply, row[3], row[4])
con=g.buttonbox(reply + "州的第" + row[4] + "号" + "图片" + "评论机构评分;" + row[3], image=str(row[4]) + 'pie.png',
choices=("下一张", "退出"))
if con=="退出":
exit("退出")
else:
g.msgbox("程序退出")
def paint(tup,state,grade,id):#画图
label_list = ["川普", "希拉里", "强生", "弃权票"] # 各部分标签
size = [tup[0], tup[1], tup[2], (100-tup[0]-tup[1]-tup[2])] # 各部分大小
color = ["red", "green", "blue", "yellow"] # 各部分颜色
explode = [0.05, 0, 0, 0] # 各部分突出值
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1,
autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.axis("equal") # 设置横轴和纵轴大小相等,这样饼才是圆的
plt.legend()
ran_num = random.sample(range(10000), 1)
plt.savefig(str(id)+'pie.png')
plt.show()
if __name__ == '__main__':
main()