各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(一):爬蟲選手信息
各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(二):統計並展示數據
各位集美兄得看過來! 利用AI給青春有你2的選手們做數據分析挖掘(三):看圖像識選手
經過上一期實踐後,我們已經成功獲取到青春有你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的選手們做數據分析挖掘(一):爬蟲選手信息