【Python學習】Python數據科學基礎案例

一、足球運動員分析

# 導入分析需要用到的庫
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

# 加載數據集
player = pd.read_csv(r'FullData.csv')
# 設置展示的最大列數
pd.set_option('max_columns', 100)
player.head()

# 對數據集進行簡單的處理查看
# 使用info方法查看缺失信息。(以及每列的類型信息)
# player.info()
player = player[player['Club_Position'].notnull()]
player.info()

# 查看是否有異常值
player.describe()

# 檢查是否包含重複值
player.duplicated().any()
# 如果有重複值,可以用以下方法去除重複值
# player.drop_duplicates(inplace=True)

# player.head()
# 替換數據中的‘cm’和‘kg’
player['Height'] = player['Height'].map(lambda x: int(x.replace('cm', '')))
player['Weight'] = player['Weight'].map(lambda x: int(x.replace('kg', '')))
# 或者
# player['Height'] = player['Height'].str.replace('cm', '').astype(np.int)
# player['Weight'] = player['Weight'].str.replace('kg', '').astype(np.int)

# 運動員的身高、體重、評分信息分佈
player[['Height', 'Weight', 'Rating']].plot(kind='kde')

# 運動員左腳與右腳在數量上的偏差
player['Preffered_Foot'].value_counts()
# 畫圖展示
player["Preffered_Foot"].value_counts().plot(kind="bar")

# 從球員平均評分上考慮,擁有top10評分能力俱樂部/國家【超過20人】

# 從俱樂部角度分析
s = player.groupby('Club')['Rating'].agg(['count', 'sum', 'mean'])
s = s[s['count'] > 20]
# 根據人員數量排序
# s.sort_values('count', ascending = False)
# 根據平均分排序
s.sort_values('mean', ascending=False)

# 從國家角度分析
s = player.groupby('Nationality')['Rating'].agg(['count', 'sum', 'mean'])
s = s[s['count'] > 20]
# 根據人員數量排序
# s.sort_values('count', ascending = False)
# 根據平均分排序,顯示前十名
s.sort_values('mean', ascending=False).head(10)

# 哪個俱樂部擁有更多中心球員(在俱樂部年以上)
# 獲取加入俱樂部的年份
year = player['Club_Joining'].map(lambda x: str(x).split('/')[-1])
year = year.astype(np.int)

t = player[(2017 - year >= 5) & (player['Club'] != 'Free Agents')]
t['Club'].value_counts().head(10).plot(kind='bar')

# 足球運動員是否與出生月份相關
# 1 全體運動員
t = player['Birth_Date'].str.split('/', expand=True)
t[0].value_counts().plot(kind='bar')
# 2 知名運動員(80分以上)
t = player[player['Rating'] >= 80]
t = player['Birth_Date'].str.split('/', expand=True)
t[0].value_counts().plot(kind='bar')

# 足球運動員的號碼與位置是否有關
# 去除替補球員與後備隊球員
t = player[(player['Club_Position'] != 'Sub') & (player['Club_Position'] != 'Res')]
x = t.groupby(['Club_Kit', 'Club_Position']).size()
x[x > 50].plot(kind='bar')

# 身高與體重那個是否具有相關性
player.plot.scatter(x='Height', y='Weight')

# 哪些指標對評分影響較大
player.corr()

# 假設不清楚後兩列具體含義,分析可能的含義
# 對位置進行分組
g = player.groupby('Club_Position')
g['GK_Positioning'].agg('mean').plot(kind='bar')

# 年齡與評分具有怎樣的關係
t = player[['Age', 'Rating']]
t['Age'] = pd.cut(player['Age'], bins=[0, 20, 30, 40, 100], labels=['小', '中', '大', '很大'])
t.groupby('Age')['Rating'].mean().plot(kind='line', xticks=[0, 1, 2, 3, 4], marker='o')

二、Facebook營銷組合分類

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split


def load_data(path):
    # 加載數據集,注意數據集中沒有標題行,需要將header的值設爲None
    data = pd.read_csv(path, header=None)
    # 將加載的數據分爲特徵x與標籤y
    x, y = data.iloc[:, :-1], data.iloc[:, -1]
    # 對特徵矩陣x進行編輯
    lb = LabelEncoder()
    x = x.apply(lambda col: lb.fit_transform(col))
    # 進行one-hot編碼
    ohe = OneHotEncoder()
    x = pd.DataFrame(ohe.fit_transform(x).toarray())
    # tensorflew不支持數值列,需要轉換
    x.columns = x.columns.map(lambda x: f'c{x}')
    return x, y


def train_input_fn(features, labels):
    # 創建數據集
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
    # 對數據及進行訓練、重複與批處理操作
    dataset = dataset.shuffle(10000, seed=0).repeat(10).batch(50)
    return dataset


def eval_input_fn(features, labels=None):
    # 將特徵轉換成字典類型
    features = dict(features)
    # 如果要進行未知數據的預測,則沒有標籤
    if labels is None:
        inputs = features
    else:
        inputs = (features, labels)
    # 創建數據集
    dataset = tf.data.Dataset.from_tensor_slices(inputs)
    # 每次取出100條數據
    dataset = dataset.batch(100)
    return dataset


x, y = load_data(r'data.csv')
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.25, random_state=0)

# 定義特徵列列表
my_feature_columns = []
for key in train_x.keys():
    # 創建tensorflew特徵列,並加入特徵列表中
    my_feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(feature_columns=my_feature_columns, hidden_units=[512] * 2, n_classes=10,
                                        optimizer="SGD")
classifier.train(input_fn=lambda: train_input_fn(train_x, train_y))
classifier.evaluate(input_fn=lambda: eval_input_fn(test_x, test_y))

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