0.赛题理解
- 场景:蚂蚁金服每天需要处理大量的资金流入和流出
- 条件:为了资金流动的风险达到最低,同时保证每天的正常业务运转
- 目标:精准预测未来每日的资金流入流出情况
- 数据:用户基本信息数据、用户申购赎回数据、收益率表、银行间拆借利率表
1.数据探索准备
1.1时间序列图
# 画出每日总购买与赎回量的时间序列图
fig = plt.figure(figsize=(20,6))
#表示figure的大小为长、宽(单位为inch)
plt.plot(total_balance['date'],total_balance['total_purchase_amt'],label='purchase')
#从label可知为图中黄线,横轴为时间,纵轴为购买量
plt.plot(total_balance['date'], total_balance['total_redeem_amt'],label='redeem')
#同上画出图中蓝线
plt.legend(loc='best')
#设置图例位置,best为0, only implemented for axes legends(自适应方式)
plt.title("The lineplot of total amount of Purchase and Redeem from July.13 to Sep.14")
#设置图表标题
plt.xlabel("Time")
#设置横轴
plt.ylabel("Amount")
#设置纵轴
plt.show()
#展示
1.2数据分布可视化
- 直方图 - distplot()
-
rs = np.random.RandomState(10) #设定随机数种子 s = pd.Series(rs.randn(100) * 100) sns.distplot(s, bins = 10, hist = True, kde = True, norm_hist = False, rug = True, vertical = True, color = 'b', label = 'distplot', axlabel = 'x') plt.legend() #bins ---> 箱数 #hist、ked ---> 是否显示箱/密度曲线 #norm_hist ---> 直方图是否按照密度来显示 #rug ---> 是否显示数据分布情况 #vertical ---> 是否水平显示 #color ---> 设置颜色 #label ---> 图例 #axlabel ---> x轴标注
sns.distplot(s, rug = True, rug_kws = {'color':'y'}, #设置数据频率分布颜色 kde_kws = {'color':'k', 'lw':1, 'label':'KDE', 'linestyle':'--'}, #设置密度曲线颜色、线宽、标注、 线形 hist_kws = {'histtype':'stepfilled', 'linewidth':1, 'alpha':1, 'color':'g'}) # 设置箱子的风格、线宽、透明度、颜色 # 风格包括:'bar'、'barstacked'、'step'、'stepfilled'
- 箱形图-boxplot()
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
x:指定要绘制箱线图的数据;
notch:是否是凹口的形式展现箱线图,默认非凹口;
sym:指定异常点的形状,默认为+号显示;
whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
vert:是否需要将箱线图垂直摆放,默认垂直摆放;
positions:指定箱线图的位置,默认为[0,1,2…];
widths:指定箱线图的宽度,默认为0.5;
meanline:是否用线的形式表示均值,默认用点来表示;
patch_artist:是否填充箱体的颜色;
showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
showmeans:是否显示均值,默认不显示;
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
showbox:是否显示箱线图的箱体,默认显示;
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
showfliers:是否显示异常值,默认显示;
whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
boxprops:设置箱体的属性,如边框色,填充色等;
medianprops:设置中位数的属性,如线的类型、粗细等;
labels:为箱线图添加标签,类似于图例的作用;
meanprops:设置均值的属性,如点的大小、颜色等;
-
plt.figure(figsize=(12, 5)) #表示figure 的大小为长、宽(单位为inch) ax = plt.subplot(1,2,1) #plt.subplot(i,j,n)形式,其中i,j是行列数,n是第几个图,比如(1,2,1)则是一个有两个图,该图位于第一个 plt.title('The boxplot of total purchase with each weekday') #plt.title()函数用于设置图像标题 ax = sns.boxplot(x="weekday", y="total_purchase_amt", data=total_balance_1) #表示第一张图的横坐标为“weekday”,纵坐标为“total_purchase_amt” ax = plt.subplot(1,2,2) #第二张图同理 plt.title('The boxplot of total redeem with each weekday') ax = sns.boxplot(x="weekday", y="total_redeem_amt", data=total_balance_1)
- 小提琴图
-
sns.violinplot(x=x,y=y,data=Train_data) #在sns.violinplot中,x是类别变量,y是数值型变量,data用于指定数据集
-
# 画出每个翌日的数据分布于整体数据的分布图 a = plt.figure(figsize=(10,10)) scatter_para = {'marker':'.', 's':3, 'alpha':0.3} #markers = ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd'] #matplotlib用特殊字符表示散点类型 line_kws = {'color':'k'} #更改线条的颜色 plt.subplot(2,2,1) plt.title('The distrubution of total purchase') sns.violinplot(x='weekday', y='total_purchase_amt', data = total_balance_1, scatter_kws=scatter_para, line_kws=line_kws) #画出第一张图(小提琴图) plt.subplot(2,2,2) plt.title('The distrubution of total purchase') sns.distplot(total_balance_1['total_purchase_amt'].dropna()) #画出第二张图(直方图) plt.subplot(2,2,3) plt.title('The distrubution of total redeem') sns.violinplot(x='weekday', y='total_redeem_amt', data = total_balance_1, scatter_kws=scatter_para, line_kws=line_kws) plt.subplot(2,2,4) plt.title('The distrubution of total redeem') sns.distplot(total_balance_1['total_redeem_amt'].dropna())
2.数据探索性分析
2.1函数载入
import pandas as pd
import numpy as np
import datetime
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
2.2数据载入与总览
data_balance = pd.read_csv("user_balance_table.csv")
bank = pd.read_csv("mfd_bank_shibor.csv")
share = pd.read_csv("mfd_day_share_interest.csv")
users = pd.read_csv("user_profile_table.csv")
可以以head()和shape进行简略的观测
#添加时间信息
data_balance['date'] = pd.to_datetime(data_balance['report_date'], format= "%Y%m%d")
#数据类型为“object”,通过pd.to_datetime将该列数据转换为时间类型,即datetime
#下面这种类型的语句可以对操作后的datatime直接进行取数
data_balance['day'] = data_balance['date'].dt.day
data_balance['month'] = data_balance['date'].dt.month
data_balance['year'] = data_balance['date'].dt.year
data_balance['week'] = data_balance['date'].dt.week
data_balance['weekday'] = data_balance['date'].dt.weekday
total_balance = data_balance.groupby(['date'])['total_purchase_amt','total_redeem_amt'].sum()
#按照日期统计申购总量和赎回总量
total_balance.reset_index(inplace=True)
reset_index用来重置索引,因为有时候对dataframe做处理后索引可能是乱的。
drop=True就是把原来的索引index列去掉,重置index;drop=False就是保留原来的索引,添加重置的index。
inplace=False(默认)表示原数组不变,对数据进行修改之后结果给新的数组;inplace=True表示直接在原数组上对数据进行修改。