然後我們import我們最常用的三大件:pandas, seaborn, matplotlib, 並且讀取資料
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv(
"./pokemon_data.csv"
)
首先我們觀察一下資料的尺寸,可以通過 df.shape 這個來實現。當然 df.info() 能夠給我們更加詳細的每個列的資訊。這裡我們通過這個方式,可以發現這個資料集一共收錄了801行,41列的資料。說明一共有801隻寶可夢,每隻寶可夢我們有41個特徵來描述它們。
然後就迎來了我們的第乙個問題:這麼多特徵,是否會有資料缺失呢?畢竟有些寶可夢比較神秘感,就連大木博士都不一定知道。這裡我們可以通過如下**來觀察每個特徵的缺失情況:
# 計算出每個特徵有多少百分比是缺失的
percent_missing = df.isnull().
sum()*
100/
len(df)
missing_value_df = pd.dataframe(
)
# 檢視top10缺失的
missing_value_df.sort_values(by=
'percent_missing'
, ascending=
false
).head(
10)
通過檢視以上資料,我們可以發現,type2 這個字段缺失的比率最高,達到了 48% 左右。說明超過半數的寶可夢還是單純的只有乙個屬性,剩下一般的則具有兩種屬性。
然後第二個問題就是:這麼多寶可夢,每代分別有幾隻?這裡我們可以通過簡單的 df[『generation』].value_counts() 來得到。但是為了更加直觀的表現出不同代的寶可夢的數量差別,這裡我們可以用pandas自帶的畫圖的功能來繪製乙個柱狀圖:通過檢視以上資料,我們可以發現,type2 這個字段缺失的比率最高,達到了 48% 左右。說明超過半數的寶可夢還是單純的只有乙個屬性,剩下一般的則具有兩種屬性。
然後第二個問題就是:這麼多寶可夢,每代分別有幾隻?這裡我們可以通過簡單的 df[『generation』].value_counts() 來得到。但是為了更加直觀的表現出不同代的寶可夢的數量差別,這裡我們可以用pandas自帶的畫圖的功能來繪製乙個柱狀圖:
# 檢視各代口袋妖怪的數量
df['generation'
].value_counts(
).plot.bar(
)不難發現,寶可夢數量最多的是在第5代,最少的是在第6代。然後我們再來看不同的主屬性的分布。這裡我們可以先做一些簡單的假設,比如蟲屬性的寶可夢種模擬較多因為在劇**現的頻率相當高,而且有很多種進化。
# 檢視每個系口袋妖怪的數量
2df[
'type1'
].value_counts(
).sort_values(ascending=
true
).plot.barh(
)
這裡我們將之前的柱狀圖橫過來了,更便於觀察。這裡我們可以看到,數量最多的寶可夢是水系,然後是普通,然後是草系。蟲系只排在了第四,並沒有和預期中那樣那麼多。
看完了基礎的一些分布,接下來我會想做一些簡單的相關性分析。我們可以通過以下的**生成相關性圖
```python
# 相關性熱力圖分析
plt.subplots(figsize=(20
,15))
ax = plt.axes(
)ax.set_title(
"correlation heatmap"
)corr = df.corr(
)sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
接下來我們從寶可夢在實戰中的角度來分析這組資料。這裡我們只關注六個基礎值:血量,攻擊力,防禦力,特攻,特防,速度。因為只有這六個基礎值決定了乙隻寶可夢的戰鬥力在不考慮派系克制的情況下。
```python
interested = ['hp','attack','defense','sp_attack','sp_defense','speed']
sns.pairplot(df[interested])
這裡我們可以看到大部分都是成正比例的,乙個值的提高往往會拉高另外乙個值。這點我們通過相關性熱力圖也可以看到
# 通過相關性分析heatmap分析五個基礎屬性
plt.subplots(figsize=(10
,8))
ax = plt.axes(
)ax.set_title(
"correlation heatmap"
)corr = df[interested]
.corr(
)sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values,
annot=
true
, fmt=
"f",cmap=
"ylgnbu"
)
看完這些以後,我們就可以開始計算種族值然後來選取我們的平民神獸了。畢竟不是每個人都能收服代歐奇希斯,超夢,夢幻這種傳說級別的寶可夢。這裡我們可以通過如下方式,先做乙個特徵型別轉化,然後再計算
for c in interested:
df[c]
= df[c]
.astype(
float
)df = df.assign(total_stats = df[interested]
.sum
(axis=1)
)
這樣我們就完成了用 total_stats 這個欄位來儲存種族值這一特徵。我們可以做個柱狀圖視覺化來看看種族值的分布是什麼樣的:
# 種族值分布
total_stats = df.total_stats
plt.hist(total_stats,bins=35)
plt.xlabel(
'total_stats'
)plt.ylabel(
'frequency'
)
同時我們還可以根據不同的屬性來看:
# 不同屬性的種族值分布
plt.subplots(figsize=(20
,12))
ax = sns.violinplot(x=
"type1"
, y=
"total_stats"
, data=df, palette=
"muted"
)
找到非傳說寶可夢但是種族值達到了的傳說寶可夢級別的
最後我們就可以通過簡單的過濾和排序來找到我們應該去捕捉的寶可夢了:
df[
(df.total_stats >=
570)
&(df.is_legendary ==0)
]['name'
].head(
10)
從結果上來看,我們平民寶可夢訓練師應該考慮的top10寶可夢應該是:妙蛙花,噴火龍,水箭龜,比雕,胡地,呆河馬,耿鬼,袋獸,大甲,暴鯉龍。這樣,我們就通過簡單的資料分析,完成了大多數寶可夢動漫中的訓練師不可能完成的任務。這麼想想,公升職加薪,出任ceo,贏取白富美,當上研究所所長的日子簡直指日可待呀! 阿里雲天池Python訓練營
字串 引號之間的字元集合 單引號或雙引號 反斜槓符號 單引號 雙引號 n換行 t橫向製表符 tab r回車 原始字串 所有的字串都是直接按照字面的意思來使用 不轉義特殊或不能列印的字元 在字串前邊加乙個英文本母 r 三引號允許字串跨多行 可包含換行符 製表符以及其他特殊字元 具有不可修改性 通過元素...
阿里雲天池python訓練營
函式是物件 可從函式中返回用於構建高階函式 def函式名 引數 函式 文件字串 function suite return 表示式 以def 形參必須放在圓括號中 形參只是形式 表示佔據的引數位置 函式的第一行語句可使用文件字串 存放函式說明 利用.doc 呼叫 執行的 需要縮排 return 表示...
阿里雲天池Python訓練營
本節主要介紹python中的類與物件,並針對相關用法進行展開說明。其中拓展了需要掌握及區別的內容,對於類的用法及物件的含義需重點掌握。類定義物件的結構 以類為模板建立物件 物件是類的例項 類不但包含方法定義 還包含所有例項共享的資料 class 類名 類的實現 類的名稱以大寫字母開頭 子類建構函式基...