# %%
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.charts import Map
from pyecharts.charts import *
# %%
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'
# %%
# 1.读取titanic.csv数据文件,DataFrame命名为df
df =pd.read_csv('./titanic.csv', encoding='utf-8')
# %%
# 2.预览前10行数据
df.head(10)
# %%
# 3.查看字段信息(含字段名称、数据类型、非空行计数、存储大小等)
df.info()
# %%
# 4.查看各列的空值数量
df.isnull().sum().to_frame().rename(columns={0:'空值数量'})
# %%
# 5.查看描述统计信息,数值保留两位小数
df.describe().round(2)
# %%
# 6.删除【甲板】字段,并替换原表
df.drop(columns='甲板', inplace=True)
# %%
# 7.以均值填充【年龄】的缺失值
df['年龄'].fillna(value=df['年龄'].mean(), inplace=True)
# %%
# 8.以频数最高的类别填充【登船港口】的缺失值
df['登船港口'].fillna(value=df['登船港口'].value_counts().idxmax(), inplace=True)
# %%
# 9.筛选性别为女或乘客类型为小孩的数据
df.loc[(df['性别'] == '女') | (df['乘客类型'] == '小孩')]
# %%
# 10.筛选单身的性别为女的年龄大于等于18的数据
df.loc[(df['是否单身'] == '是') & (df['性别'] == '女') & (df['年龄']>=18)]
# %%
# 11.多级排序,【存活情况】升序,【登船港口】降序,忽略索引(重置从0开始)
df.sort_values(by=['存活情况', '登船港口'], ascending=[True, False], ignore_index=True)
# %%
# 12.求整体上的幸存率,存活人数/总人数
# 【是否幸存】,1表示存活,0表示死亡
df['是否幸存'].sum()/df['是否幸存'].count()
# %%
# 13.求【年龄】的极差(最大值-最小值)
a = df['年龄'].max()-df['年龄'].min()
a
# %%
# 14.求【年龄】的上四分位数(Q3)
Q3 = df['年龄'].quantile(q=0.75)
Q3
# %%
# 15.以【存活情况】为分组,统计【年龄】的均值
df1 = df[['存活情况', '年龄']]
df1.groupby('存活情况')['年龄'].mean().to_frame().reset_index()
# %%
# 16.以【是否成年男性】为分组,统计【是否幸存】的均值(即幸存率)
df1 = df[['是否成年男性', '是否幸存']]
df1.groupby('是否成年男性')['是否幸存'].mean().to_frame().reset_index()
# %%
# 17.数据透视表,行为【客舱等级】,列【存活情况】,值为【是否幸存】,计算类型为计数
df3 = df.pivot_table(index='客舱等级', columns='存活情况', values='是否幸存', aggfunc='count', fill_value=0)
df3.head()
# %%
# 18.以【乘客类型】为分组,统计【是否幸存】的计数、求和及均值,DataFrame命名为tb1
# 【count】重命名为【总人数】
# 【sum】重命名为【幸存人数】
# 【mean】重命名为【幸存率】
# tb1 = df.groupby('乘客类型').agg({'是否幸存': 'count'}).rename({'是否幸存':'总人数'},axis=1).reset_index()
# tb2 = df.groupby('乘客类型').agg({'是否幸存': 'sum'}).rename({'是否幸存':'幸存人数'},axis=1).reset_index()
# tb3 = df.groupby('乘客类型').agg({'是否幸存': 'mean'}).rename({'是否幸存':'幸存率'},axis=1).reset_index()
# tb1 = df.groupby('乘客类型').agg(总人数=('是否幸存','count'),幸存人数=('是否幸存','sum'),幸存率=('是否幸存','mean')).reset_index()
# tb1
tb1 = df.groupby('乘客类型').agg({'是否幸存': ['count', 'sum', 'mean']})
tb1.columns = ['总人数', '幸存人数', '幸存率']
tb1.reset_index()
# %%
# 19.先统计【性别】频数分布(生成新表),再绘制饼图,文本标签设为百分比,分辨率建议150
series = df['性别'].value_counts()
plt.figure(dpi=150)
plt.title('男女人数比例')
plt.pie(labels=series.index, x=series.values,autopct='%.2f%%')
plt.show()
# %%
# 20.绘制【年龄】的直方图(频数分布),分辨率建议150
# 建议seaborn绘图,分组区间为默认值
plt.figure(dpi=150,figsize=(15,10))
sns.displot(df['年龄'])
plt.show()
# %%
# 21.绘制【年龄】的核密度估计图,分辨率建议150
plt.figure(dpi=150)
sns.kdeplot(x=df['年龄'], shade=True)
plt.show()
# %%
# 22.绘制箱线图,x轴为是否幸存,y轴为船票价格,分辨率建议150
plt.figure(dpi=150)
sns.boxplot(
data=df,
x='是否幸存',
y='船票价格',
)
plt.show()
# %%
# 23.新增字段【年龄段】
# 分组区间为[0, 18)、[18, 30)、[30, 40)、[40, 50)、[50, 60)、[60, 70)、[70, 90)
# 分组区间为左闭右开
df['年龄段'] = pd.cut(x=df['年龄'], right=False, bins=[0, 18, 30, 40,50,60,70,90])
# %%
# 24.统计各年龄段的频数分布
df2 = df['年龄段'].value_counts().reset_index()
df2.rename(
columns={'index': '年龄段', '年龄段': '频数'},
inplace=True)
df2
# %%
# 25.以【年龄段】分组,求【是否幸存】的均值,DataFrame命名为tb2
# 分组聚合后,将【是否幸存】重命名为【幸存率】
tb2 = df.groupby('年龄段').agg({'是否幸存': 'mean'}).rename({'是否幸存':'幸存率'},axis=1).reset_index()
tb2
# %%
# 26.将tb2【年龄段】数据类型转为str
tb2['年龄段']=tb2['年龄段'].astype(str)
# %%
# 27.绘制柱形图(tb2为基础),x轴为年龄段,y轴为幸存率
# 【年龄段】数据类型非str可能报错
x=tb2['年龄段']
y=tb2['幸存率']
plt.figure(dpi=150)
plt.bar(x,y,width=0.5)
plt.xlabel('年龄段')
plt.ylabel('幸存率')
plt.show()
# %%
# 28.以【是否单身】分组,求【是否幸存】的均值,DataFrame命名为tb3
# 分组聚合后,将【是否幸存】重命名为【幸存率】
tb3 = df.groupby('是否单身').agg({'是否幸存': 'mean'}).rename({'是否幸存':'幸存率'},axis=1).reset_index()
tb3
# %%
# 29.绘(tb3为基础),单身乘客与非单身乘客的幸存率
sns.barplot(data=tb3, x='幸存率', y='是否单身')
plt.show()
。