各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(二):統計並展示數據

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(一):爬蟲選手信息

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(二):統計並展示數據

各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(三):看圖像識選手

經過上一期實踐後,我們已經成功獲取到青春有你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的選手們做數據分析挖掘(三):看圖像識選手

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章