直接上项目:
import pandas as pd
import numpy as np
import warnings
import datetime
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# 设置数据集路径
dataset_path = '/kaggle/input/prdata/Purchase Redemption Data/'
# 读取数据
data_balance = pd.read_csv(dataset_path+'user_balance_table.csv')
# 为数据集添加时间戳
data_balance['date'] = pd.to_datetime(data_balance['report_date'], format= "%Y%m%d")
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().reset_index()
# 生成测试集区段数据
start = datetime.datetime(2014,9,1)
testdata = []
while start != datetime.datetime(2014,10,1):
temp = [start, np.nan, np.nan]
testdata.append(temp)
start += datetime.timedelta(days = 1)
testdata = pd.DataFrame(testdata)
testdata.columns = total_balance.columns
# 拼接数据集
total_balance = pd.concat([total_balance, testdata], axis = 0)
# 为数据集添加时间戳
total_balance['day'] = total_balance['date'].dt.day
total_balance['month'] = total_balance['date'].dt.month
total_balance['year'] = total_balance['date'].dt.year
total_balance['week'] = total_balance['date'].dt.week
total_balance['weekday'] = total_balance['date'].dt.weekday
import matplotlib.pylab as plt
# 画出每日总购买与赎回量的时间序列图
fig = plt.figure(figsize=(20,6))
plt.plot(total_balance['date'], total_balance['total_purchase_amt'],label='purchase')
plt.plot(total_balance['date'], total_balance['total_redeem_amt'],label='redeem')
plt.legend(loc='best')
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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXIUQSN4-1597938713726)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820233633327.png)]
# 画出4月份以后的时间序列图
total_balance_1 = total_balance[total_balance['date'] >= pd.to_datetime('2014-4-1')]
fig = plt.figure(figsize=(20,6))
plt.plot(total_balance_1['date'], total_balance_1['total_purchase_amt'])
plt.plot(total_balance_1['date'], total_balance_1['total_redeem_amt'])
plt.legend()
plt.title("The lineplot of total amount of Purchase and Redeem from April.14 to Sep.14")
plt.xlabel("Time")
plt.ylabel("Amount")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNpz2Zmr-1597938713729)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820233832868.png)]
# 分别画出每个月中每天购买赎回量的时间序列图
fig = plt.figure(figsize=(15,15))
plt.subplot(4,1,1)
plt.title("The time series of total amount of Purchase and Redeem for August, July, June, May respectively")
total_balance_2 = total_balance[total_balance['date'] >= pd.to_datetime('2014-8-1')]
plt.plot(total_balance_2['date'], total_balance_2['total_purchase_amt'])
plt.plot(total_balance_2['date'], total_balance_2['total_redeem_amt'])
plt.legend()
total_balance_3 = total_balance[(total_balance['date'] >= pd.to_datetime('2014-7-1')) & (total_balance['date'] < pd.to_datetime('2014-8-1'))]
plt.subplot(4,1,2)
plt.plot(total_balance_3['date'], total_balance_3['total_purchase_amt'])
plt.plot(total_balance_3['date'], total_balance_3['total_redeem_amt'])
plt.legend()
total_balance_4 = total_balance[(total_balance['date'] >= pd.to_datetime('2014-6-1')) & (total_balance['date'] < pd.to_datetime('2014-7-1'))]
plt.subplot(4,1,3)
plt.plot(total_balance_4['date'], total_balance_4['total_purchase_amt'])
plt.plot(total_balance_4['date'], total_balance_4['total_redeem_amt'])
plt.legend()
total_balance_5 = total_balance[(total_balance['date'] >= pd.to_datetime('2014-5-1')) & (total_balance['date'] < pd.to_datetime('2014-6-1'))]
plt.subplot(4,1,4)
plt.plot(total_balance_5['date'], total_balance_5['total_purchase_amt'])
plt.plot(total_balance_5['date'], total_balance_5['total_redeem_amt'])
plt.legend()
plt.xlabel("Time")
plt.ylabel("Amount")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQ6c4F7g-1597938713732)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820234026779.png)]
# 分别画出13年8月与9月每日购买赎回量的时序图
fig = plt.figure(figsize=(15,9))
total_balance_last8 = total_balance[(total_balance['date'] >= pd.to_datetime('2013-8-1')) & (total_balance['date'] < pd.to_datetime('2013-9-1'))]
plt.subplot(2,1,1)
plt.plot(total_balance_last8['date'], total_balance_last8['total_purchase_amt'])
plt.plot(total_balance_last8['date'], total_balance_last8['total_redeem_amt'])
plt.legend()
total_balance_last9 = total_balance[(total_balance['date'] >= pd.to_datetime('2013-9-1')) & (total_balance['date'] < pd.to_datetime('2013-10-1'))]
plt.subplot(2,1,2)
plt.plot(total_balance_last9['date'], total_balance_last9['total_purchase_amt'])
plt.plot(total_balance_last9['date'], total_balance_last9['total_redeem_amt'])
plt.legend()
plt.xlabel("Time")
plt.ylabel("Amount")
plt.show()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-naw8sxVN-1597938713735)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820234249449.png)]
# 画出每个翌日的数据分布于整体数据的分布图
a = plt.figure(figsize=(10,10))
scatter_para = {'marker':'.', 's':3, 'alpha':0.3}
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())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHkWwoZa-1597938713737)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820234405742.png)]
# 按翌日对数据聚合后取均值
week_sta = total_balance_1[['total_purchase_amt', 'total_redeem_amt', 'weekday']].groupby('weekday', as_index=False).mean()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PDnwa884-1597938713739)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820234502509.png)]
ps.写写我自己遇到的错误吧。严重至极:
源代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTPmcD8P-1597938713740)(C:%5CUsers%5C29146%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200820234719934.png)]
这里的datetime.data得换成pd.to_datetime。