3.4 训练场
3.4.1 数据处理
- 加载数据,并查看相关信息:基金总数据条目,基金公司数量,基金总数量,基金总规模,查看前五条数据
- 将基金规模小于1亿元的数据过滤掉,将基金收益没有数据的过滤掉。
- 将基金规模和基金收益转换为浮点数,并将处理好的数据保存。
首先我们需要下载一个 Excel 文件:
链接: https://pan.baidu.com/s/1j2pn0vVN3-wJmSZ-01oiUg?pwd=niye
提取码: niye
下载完成之后,把该文件和我们的代码放到同一个文件夹下,这一操作我们在之前的博客中已经反复说到,这里就不再进行演示
数据查看:
import numpy as np import pandas as pd fund = pd.read_excel('./fund.xlsx') print('基金总数据条目:', fund.shape) print('基金公司一共有:', fund['公司'].nunique()) # 去重 print('基金总数量是:', fund['基金数量'].sum()) # 计算基金总规模 cnt = fund['基金规模'].str.endswith('亿元') # 判断是否以'亿元'结尾 fund2 = fund[cnt] # 数据筛选 size = fund2['基金规模'].str[: -2].astype('float').sum() # 去掉'亿元' print('基金总规模是:%0.2f亿元' % (size)) print('查看前五条数据:') fund.head(5)
数据清洗:
import pandas as pd fund = pd.read_excel('./fund.xlsx') print('数据清洗前:', fund.shape) # 过滤基金规模为空的数据 cnt = fund['基金规模'].str.endswith('亿元') fund = fund[cnt] # 过滤基金规模小于1亿的数据 cnt2 = fund['基金规模'].str[: -2].astype('float') > 1 fund = fund[cnt2] # 过滤基金收益为空的数据 cnt3 = fund['基金收益'].str.endswith('%') fund = fund[cnt3] print('数据清洗后:', fund.shape) fund.to_excel('./fund_clean.xlsx', index = False) fund.head()
数据转换:
import pandas as pd fund = pd.read_excel('./fund_clean.xlsx') # 基金规模字符串转变为浮点数 fund['基金规模'] = fund['基金规模'].str[: -2].astype('float') # 基金收益字符串转变为浮点数 def convert(x): x = x[: -1] x = float(x) return x fund['基金收益'] = fund['基金收益'].apply(convert) # 修改列名 fund.columns = ['姓名', '公司', '基金数量', '年', '天', '基金规模(亿元)', '基金收益(%)'] # 数据保存 fund.to_excel('./fund_end.xlsx', index = False) fund.head(10)
3.4.2 数据挖掘与可视化
根据基金总规模,进行排序,水平条形图展示前十大公司
根据收益率,对所有数据进行降序排名,绘制前十佳基金经理。并将金额和收益率绘制到图片中。
十大基金公司:
%%time import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize = (12, 9)) sns.set_theme(style = 'darkgrid', context = 'talk', font = 'KaiTi') fund = pd.read_excel('./fund_end.xlsx') # 分组聚合 com = fund.groupby(by = '公司')[['基金规模(亿元)']].sum() # 排序 com.sort_values(by = '基金规模(亿元)', ascending = False, # 降序排序 inplace = True) # 直接对原数据进行替换 # 行索引重置:变成自然数索引 com.reset_index(inplace = True) # 画条形图 sns.barplot(x = '基金规模(亿元)', y = '公司', # x轴和y轴 data = com.iloc[: 10], # 切片出来前十个 orient = 'h') # 水平条形图
收益十佳基金经理:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize = (12, 9)) sns.set_theme(style = 'darkgrid', context = 'talk', font = 'STKaiti') fund = pd.read_excel('./fund_end.xlsx') # 降序排序并直接替换原数据 fund.sort_values(by = '基金收益(%)', ascending = False, inplace = True) sns.barplot(x = '基金收益(%)', y = '姓名', data = fund.iloc[:10], orient = 'h', palette = 'Set1') # 画板、颜色 for i in range(10): rate = fund.iloc[i]['基金收益(%)'] pe = fund.iloc[i]['基金规模(亿元)'] # 绘制基金规模 plt.text(x = rate / 2, y = i, s = str(pe) + '亿元', ha = 'center', va = 'center') # 绘制基金收益 plt.text(x = rate + 50, y = i, s = str(rate) + '%', va = 'center') _ = plt.xlim(0, 2500) # 横坐标范围 _ = plt.xticks(np.arange(0, 2500, 200)) # 横坐标刻度