python 2020年积分落户 matplotlib+mysql

开篇上图

创建表结构(注意分数要数字类型,日期要date类型,否则下面计算不好处理)

CREATE TABLE `jifendetail_2020` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `bianhao` varchar(255) NOT NULL DEFAULT '' COMMENT '公示编号',
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
  `birth_time` date NOT NULL COMMENT '出生年月',
  `workname` varchar(255) NOT NULL DEFAULT '' COMMENT '单位名称',
  `score` decimal(10,2) NOT NULL COMMENT '积分',
  `work_score` decimal(10,2) NOT NULL COMMENT '合法稳定就业积分',
  `home_score` decimal(10,2) NOT NULL COMMENT '居住积分',
  `study_score` decimal(10,2) NOT NULL COMMENT ' 教育背景积分',
  `kouchu_score` decimal(10,2) NOT NULL COMMENT '扣除取得学历(学位)期间累计的居住及就业分值积分',
  `zhizhu_score` decimal(10,2) NOT NULL COMMENT ' 职住区域积分',
  `chuangxin_score` decimal(10,2) NOT NULL COMMENT ' 创新创业积分',
  `nashui_score` decimal(10,2) NOT NULL COMMENT '纳税积分',
  `age_score` decimal(10,2) NOT NULL COMMENT '年龄积分',
  `biaozhang_score` decimal(10,2) NOT NULL COMMENT '荣誉表彰积分',
  `weifa_score` decimal(10,2) NOT NULL COMMENT '守法记录积分',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30192 DEFAULT CHARSET=utf8;

数据导入mysql,Navicat for mysql-open table-导入向导-文本文件XXX.txt,-定位-下一步

源代码:

import matplotlib.pyplot as plt
import pymysql
import pandas as pd
import numpy as np
import seaborn as sns
import datetime
#连接数据库
db = pymysql.connect(host='192.168.1.82',user='root',passwd='123456',port=3306,db='beijinglh2020')

#开启一个游标cursor
cursor=db.cursor()

#获取jifen_detail2020数据表里的所有数据
sql='select * from jifendetail_2020 '

#执行sql中的语句
cursor.execute(sql)
data = cursor.fetchall()

#下面为将获取的数据转化为dataframe格式
columnDes = cursor.description #获取连接对象的描述信息
print('columnDes',columnDes)
columnNames = [columnDes[i][0] for i in range(len(columnDes))] #获取列名
df = pd.DataFrame([list(i) for i in data],columns=columnNames) #得到的data为二维元组,逐行取出,转化为列表,再转化为df
print('df',df)
print('df.describe()',df.describe())


company_data = df.groupby('workname', as_index=False).count()[['workname', 'name']]
print('company_data',company_data)
company_data.head(20)
print('company_data.head(20)',company_data.head(20))
company_data.rename(columns={'name':'人数'}, inplace=True)      # 替换 1
print('company_data1',company_data)

company_sorted_data=company_data.sort_values(by="人数" , ascending=False)#以id为制定列进行排序
print('company_sorted_data',company_sorted_data)
print('company_sorted_data.head(20)',company_sorted_data.head(20))
print('type(df)',type(df))

cut_bins = np.arange(90, 130, 5)   #分段设置
print('dfscore',df['score'])
print('typedfscore',type(df['score']))
'''
typedfscore <class 'pandas.core.series.Series'>
'''
bins = pd.cut(df['score'], cut_bins)  # 将落户数据,按照cutbins来切一下
bin_counts = df['score'].groupby(bins).count()
bin_counts.head(10)
print('bin_counts.head(10)',bin_counts.head(10))

#barplot柱状图
plt.figure(figsize=(15,8))
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['font.size']=12

x_name=['90-95','95-100','100-105','105-110','110-115','115-120','120-125']
sns.barplot(x_name,bin_counts)#barplot柱状图1

plt.ylabel('人数')
plt.xlabel('分数区间')

for x, y in zip(range(7), bin_counts):
    plt.text(x, y+20 , y, ha='center', va='bottom')

plt.show()

print('dbirth_time',df['birth_time'])
print('tydbirth_time',type(df['birth_time']))
#计算生日
year=df['birth_time'].apply(lambda x: x.year)#获取年,老版本pandas;新版本获取为df['date'].dt.year
print('year',year)
month=df['birth_time'].apply(lambda x: x.month)#获取月
print('month',month)
df['age'] = 2020 - year
print('dfyear',df['age'])
mean=df['age'].mean()
std =df['age'].std()
# 得到上下限
lower , upper =mean -3*std , mean+3*std

print('均值',mean)
print('标准差',std)
print('下限',lower)
print('上限',upper)
#直方图
plt.figure(figsize=(15,8))
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['font.size']=12
#plt.hist(df['age'],bins = 100, density = True, color = 'steelblue', edgecolor = 'k')#单一直方图

sns.distplot(df['age'], hist=True, color="r", kde_kws={"shade": True})#hist=True直方图+核密度图

#sns.distplot(df['age'], hist=False, color="g", kde_kws={"shade": True})#hist=False单一核密度图

plt.title('各年龄段落户人员分布')

plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值