各位集美兄得看过来! 利用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/
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的缩写,线性空间。它有五个基本参数:
-
起始值
-
终值
-
总数目
-
endpoint
-
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的选手们做数据分析挖掘(一):爬虫选手信息