【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))

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