各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(二):统计并展示数据

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(一):爬虫选手信息

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(二):统计并展示数据

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(三):看图像识选手

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(四):AI分析谁最容易出道

经过上一期实践后,我们已经成功获取到青春有你2所有小姐姐的基本信息,接下来将基于pandas与matplotlib两个Python核心库对基本信息进行筛选统计。

基础准备

pandas入门介绍

pandas是python第三方库,提供高性能易用数据类型和分析工具。

pandas基于numpy实现,常与numpy和matplotlib一同使用

更多学习,请参考pandas中文网:https://www.pypandas.cn/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1Sks16w-1587741170523)(C:\Users\lps\AppData\Roaming\Typora\typora-user-images\image-20200424220659422.png)]

1.Series

Series是一种类似于一维数组的对象,它由一维数组(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成.

可理解为带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。

Series中最重要的一个功能是:它会在算术运算中自动对齐不同索引的数据

Series 和多维数组的主要区别在于, Series 之间的操作会自动基于标签对齐数据。因此,不用顾及执行计算操作的 Series 是否有相同的标签。

常见用法

s = pd.Series(np.array([1,2,3,4,5]), index=['a', 'b', 'c', 'd', 'e'])

print(s[1:])

print(s[:-1])

print(s[1:] + s[:-1])

在这里插入图片描述

2. DataFrame

DataFrame是一个表格型的数据结构,类似于Excel或sql表

它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)

DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)

创建一个DataFrame

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = pd.DataFrame(data)
print(frame)

在这里插入图片描述

用 Series 字典或字典生成 DataFrame

d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
print(pd.DataFrame(d))

在这里插入图片描述

describe() 获取统计指标

以上面的例子为例,获取‘two’的一些基础的统计指标,如count(数量)、mean(均值)等等,具体使用如下:

d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
print(pd.DataFrame(d))
# 统计指标
print("获取'two'统计指标")
print(d['two'].describe())

在这里插入图片描述

筛选

dataFrame支持筛选,比如大于、等于之类的,贼好用!

还是以上面的为例子,我们筛选’two’列大于2的

d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
# print(pd.DataFrame(d))

# 筛选‘two’列大于2.0的行
p1 = pd.DataFrame(d)
print(p1[p1['two']>2.0])

结果如下:
在这里插入图片描述

这里筛选还支持使用&(并)与| (或)实现多条件筛选

# 筛选‘two’列大于2.0的行
p1 = pd.DataFrame(d)
print(p1[(p1['two']>2.0) &&(p1['two']>3.0 )])

在这里插入图片描述

分组

分组主要使用groupby

我们再创建一个df如下:

 df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
      'key2':['one', 'two', 'one', 'two', 'one'],
      'data1':np.random.randn(5),
      'data2':np.random.randn(5)})
print(df)

]

总共有4列数据,我们的data1列数据按照key1进行分组,并且统计每个不同的key1的数量

grouped = df['data1'].groupby(df['key1'])
print("统计分组数量")
print(grouped.count())

可以看到a有3个,b有2个
在这里插入图片描述

Matplotlib入门介绍

Matplotlib库由各种可视化类构成,内部结构复杂。

matplotlib.pylot是绘制各类可视化图形的命令字库

更多学习,可参考Matplotlib中文网:https://www.matplotlib.org.cn

1.直线

绘画直线,第一步我们要确定x轴的数据。这里我们使用“人造”数据,而不是真实的数据,这就需要用到我们在NumPy教程中学习到的linspace函数:

linspace是linear space的缩写,线性空间。它有五个基本参数:

  1. 起始值

  2. 终值

  3. 总数目

  4. endpoint

  5. retstep

其中endpoint表示是否包含终值,默认endpont=True;而retstep表示是否显示数组,默认值retstep=False;通过总数目,在给定起始值和终止值的时候,步长就会被确定

比如np.linspace(1,10,10)表示的是生成10个数字从1到10,1,2…10

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 50)
y = 2*x + 1
plt.plot(x, y)
plt.show()

x轴的数据由linspace函数建立,而y轴数据通过x轴获得,由于我们要画直线,所以我们通过y=ax+b的直线公式来获得y轴的数据。另外plt是matplotlib.pyplot的缩写,这是一个习惯,建议大家也这么使用。plot函数负责画图,而show函数负责将画好的图显示出来。

结果

在这里插入图片描述

2.曲线

对于曲线,我们选择NumPy中的正弦和余弦函数来展示:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 256)
y1,y2 = np.cos(x), np.sin(x)

plt.plot(x,y1)
plt.plot(x,y2)

plt.show()

我们通过NumPy中的linspace建立了x轴,因为是正弦和余弦函数,因此我们用圆周率pi设定x轴的起始值和终值。这次,我们一次性在图上画了两条线。我们还没有对直线设定颜色,粗细,这个会在后面的教程学习,但是matplotlib会自动给两天直线设置不同的颜色,方便区分。
在这里插入图片描述

3.figure函数

Matplotlib 的 figure 就是一个单独的figure小窗口。使用方法是plt.figure(),通过参数figuresize来控制窗口大小和形状:

使用方式:

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(8, 4))
x = np.linspace(-1, 1, 50)
y = 2*x + 1
plt.plot(x, y)
plt.show()

在这里插入图片描述

可以看到虽然是跟1.直线式一样的线,但是图的大小变了。

4. 线宽,颜色和风格

我们通过下面的代码来展示如何设置线宽,颜色以及风格三个参数(linewidth、color、linestyle):

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x = np.linspace(-np.pi, np.pi, 256)
y1,y2 = np.cos(x), np.sin(x)
plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-")
plt.plot(x, y2, color="green", linewidth=2.0, linestyle="--")

plt.show()

在这里插入图片描述

其余参数可以通过官网查询。

绘制选手区域分布柱状图

Matplotlib柱状图函数: plt.bar()

通过上一期的数据分析,‘zone’为选手区域

预计df转化后数据结构如下,我们需要按照zone(区域)给选手分类,然后绘制柱状图

    name weight   zone    ...
0   刘亚楠   46kg   中国湖北     ...
1   艾依依   43kg   中国四川  ...
....

具体实现如下:

import matplotlib.pyplot as plt
import numpy as np 
import json
import matplotlib.font_manager as font_manager
import pandas as pd

#显示matplotlib生成的图形
%matplotlib inline


df = pd.read_json('data/data31557/20200422.json')
#print(df)

grouped=df['name'].groupby(df['zone'])
s = grouped.count()

zone_list = s.index
count_list = s.values


# 设置显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体

plt.figure(figsize=(20,15))

plt.bar(range(len(count_list)), count_list,color='r',tick_label=zone_list,facecolor='#9999ff',edgecolor='white')

# 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
plt.xticks(rotation=45,fontsize=20)
plt.yticks(fontsize=20)

plt.legend()
plt.title('''《青春有你2》参赛选手''',fontsize = 24)
plt.savefig('/home/aistudio/work/result/bar_result02.jpg')
plt.show()

运行结果:
在这里插入图片描述

绘制选手体重分布饼图

Matplotlib柱状图函数: plt.pie()

预计df转化后数据结构如下,我们需要按照weight(体重)给选手分类,然后绘制柱状图

    name weight   zone    ...
0   刘亚楠   46kg   中国湖北     ...
1   艾依依   43kg   中国四川  ...
....

具体实现如下:

import matplotlib.pyplot as plt
import numpy as np 
import json
import matplotlib.font_manager as font_manager
import pandas as pd

#显示matplotlib生成的图形
%matplotlib inline


df = pd.read_json('data/data31557/20200422.json')

grouped=df['name'].groupby(df['weight'])
s = grouped.count()

weight_list = ['<=45kg','45kg~50kg','50kg~55kg','>55kg']
count_list=[]
count_list.append(s[s.index <= '45kg'].sum())
count_list.append(s[(s.index <='50kg') & (s.index>'45kg')].sum())
count_list.append(s[(s.index <='55kg') & (s.index>'50kg')].sum())
count_list.append(s[(s.index > '55kg')].sum())



# # # 设置显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
## 突出第三块饼 
explode = [0, 0.0, 0.1,0.0]
fig1, ax1 = plt.subplots()
### 颜色
colors = ['tomato', 'lightskyblue', 'goldenrod', 'green']
## 绘制饼图
ax1.pie(count_list,explode=explode, labels = weight_list, autopct = '%3.2f%%',startangle=180,pctdistance=0.8,colors=colors, textprops={'fontsize': 10})

ax1.axis('equal')
plt.legend()
plt.title('青春有你2选手体重分布',fontsize = 24)
plt.savefig('/home/aistudio/work/result/bar_result03.jpg')
plt.show()



  • x:指定绘图的数据;
  • explode:指定饼图某些部分的突出显示,即呈现爆炸式;
  • labels:为饼图添加标签说明,类似于图例说明;
  • colors:指定饼图的填充色;
  • autopct:自动添加百分比显示,可以采用格式化的方法显示;
  • pctdistance:设置百分比标签与圆心的距离;
  • shadow:是否添加饼图的阴影效果;
  • labeldistance:设置各扇形标签(图例)与圆心的距离;
  • startangle:设置饼图的初始摆放角度;
  • radius:设置饼图的半径大小;
  • counterclock:是否让饼图按逆时针顺序呈现;
  • wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
  • textprops:设置饼图中文本的属性,如字体大小、颜色等;
  • center:指定饼图的中心点位置,默认为原点
  • frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;

在这里插入图片描述

参考资料

https://aistudio.baidu.com/aistudio/course

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(一):爬虫选手信息

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(二):统计并展示数据

各位集美兄得看过来! 利用AI给青春有你2的选手们做数据分析挖掘(三):看图像识选手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值