In [1]:
#初始化程序
import pandas as pd
import numpy as np

import time
import datetime

from pyecharts.charts import Pie, Page, Line
from pyecharts import options as opts

#防止无关报错
import warnings
warnings.filterwarnings("ignore")

#pd解决中文编码问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
In [2]:
#读入数据
data1_2_1 = pd.read_csv('../../result/result1/task1_2_1.csv', index_col=0, header=0)
data1_2_1
Out[2]:
CardNo PeoNo Sex Major AccessCardNo Date Money FundMoney Surplus CardCount Type TermNo TermSerNo conOperNo OperNo Dept
0 181316 20181316 18工业设计 21516778 2019/4/20 20:17 3.0 0.0 186.1 818 消费 49 0 0.0 235 第一食堂
1 181316 20181316 18工业设计 21516778 2019/4/20 8:47 0.5 0.0 199.5 814 消费 63 0 0.0 27 第二食堂
2 181316 20181316 18工业设计 21516778 2019/4/22 7:27 0.5 0.0 183.1 820 消费 63 0 0.0 27 第二食堂
3 181316 20181316 18工业设计 21516778 2019/4/11 9:52 4.5 0.0 101.8 788 消费 107 0 0.0 2 红太阳超市
4 181316 20181316 18工业设计 21516778 2019/4/11 7:31 1.0 0.0 108.3 786 消费 4 0 0.0 27 第二食堂
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
241074 182554 20182554 18商务日语 18427610 2019/4/16 12:24 23.7 0.0 0.0 133 无卡销户 501 0 237.0 237 第五食堂
241075 182574 20182574 18商务日语 17011610 2019/4/16 12:26 85.0 0.0 0.0 330 无卡销户 501 0 237.0 237 第五食堂
241076 180509 2018509 18投资与理财 20201146 2019/4/8 0:00 2.0 0.0 39.1 209 消费 79 20170410144137L 0.0 6 第二食堂
241077 180509 2018509 18投资与理财 20201146 2019/4/30 19:27 20.0 0.0 19.1 210 消费 50 0 0.0 249 第四食堂
241078 180509 2018509 18投资与理财 20201146 2019/4/30 19:27 12.0 0.0 7.1 211 消费 50 0 0.0 249 第四食堂

241079 rows × 16 columns

In [3]:
#开始任务3.1
In [4]:
data_consume = data1_2_1[data1_2_1['Type'] == '消费'] #只统计 消费 的订单
data_consume['Date'] = pd.to_datetime(data_consume['Date'])
data_consume = data_consume.sort_values(by = 'Date',  ascending=True, ignore_index=True)
data_consume
Out[4]:
CardNo PeoNo Sex Major AccessCardNo Date Money FundMoney Surplus CardCount Type TermNo TermSerNo conOperNo OperNo Dept
0 181944 20181944 18建筑设计 19435482 2019-04-01 06:26:00 3.0 0.0 149.45 521 消费 174 0 0.0 27 第二食堂
1 181058 20181058 18电气自动化 20017930 2019-04-01 06:33:00 2.4 0.0 115.40 620 消费 25 0 0.0 27 第二食堂
2 181058 20181058 18电气自动化 20017930 2019-04-01 06:34:00 1.5 0.0 113.90 621 消费 25 0 0.0 27 第二食堂
3 181058 20181058 18电气自动化 20017930 2019-04-01 06:35:00 0.6 0.0 113.30 622 消费 54 0 0.0 27 第二食堂
4 183391 20183391 18皮具艺术 1238278 2019-04-01 06:39:00 3.0 0.0 75.50 607 消费 26 0 0.0 27 第二食堂
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
232985 181018 20181018 18市场营销 21956266 2019-04-30 23:43:00 3.5 0.0 61.65 713 消费 187 0 0.0 2 红太阳超市
232986 180747 2018747 18物流管理 20758586 2019-04-30 23:43:00 4.0 0.0 84.70 913 消费 187 0 0.0 2 红太阳超市
232987 181022 20181022 18市场营销 19343466 2019-04-30 23:43:00 4.5 0.0 249.50 735 消费 187 0 0.0 2 红太阳超市
232988 181505 20181505 18模具设计 21634602 2019-04-30 23:47:00 3.0 0.0 134.20 677 消费 107 0 0.0 2 红太阳超市
232989 181498 20181498 18模具设计 21117354 2019-04-30 23:47:00 3.0 0.0 83.40 689 消费 107 0 0.0 2 红太阳超市

232990 rows × 16 columns

In [5]:
#统一这个月的 每个人的刷卡频次 和 每个人的消费额
data_person = data_consume.groupby('CardNo', as_index = False).agg({'PeoNo': np.size, 'Money': np.sum})
data_person = data_person.rename(columns={'PeoNo':'Num'})
data_person
Out[5]:
CardNo Num Money
0 180001 32 161.6
1 180002 46 126.8
2 180004 96 572.0
3 180005 35 185.1
4 180006 23 85.7
... ... ... ...
3198 184335 4 41.0
3199 184336 50 200.6
3200 184337 70 377.5
3201 184338 55 296.7
3202 184339 84 223.5

3203 rows × 3 columns

In [6]:
#输出 人均刷卡频次 和 人均消费额
print('人均刷卡频次', (data_person['Num'].sum() / (data_person.tail(1).index + 1) ).astype('int') ) #人均刷卡频次
print('人均消费额', (data_person['Money'].sum() / (data_person.tail(1).index + 1) ).astype('float').map(lambda x:("%.2f")%x) ) #人均刷卡频次
人均刷卡频次 Int64Index([72], dtype='int64')
人均消费额 Index(['288.78'], dtype='object')
In [7]:
#分别按 专业 性别 消费类型 分组
data_profession = data_consume.groupby(['Major', 'Sex', 'Dept'], as_index = False).agg({'PeoNo': np.size, 'Money': np.sum})
data_profession = data_profession.rename(columns={'PeoNo':'Num'})
data_profession
Out[7]:
Major Sex Dept Num Money
0 18产品艺术 医务室 8 51.8
1 18产品艺术 好利来食品店 5 36.0
2 18产品艺术 水电缴费处 17 11.7
3 18产品艺术 第一图书馆 1 0.7
4 18产品艺术 第一食堂 156 562.3
... ... ... ... ... ...
969 18首饰设计 第二食堂 11 36.4
970 18首饰设计 第五食堂 289 823.0
971 18首饰设计 第四食堂 9 64.0
972 18首饰设计 红太阳超市 1 9.0
973 18首饰设计 自然科学书库 1 0.2

974 rows × 5 columns

In [8]:
#保存前三个专业
majors = list(set(list(data_profession['Major']) ) )[0:3]
print(majors)
['18嵌入式技术', '18动漫设计', '18产品艺术']
In [9]:
#绘制 三个专业不同性别学生的消费类型的频次 饼图
page = Page(layout=Page.DraggablePageLayout) #用于拼接多张图

for major in majors:
    data_temporary = data_profession[data_profession['Major'] == major]
    male = data_temporary[data_temporary['Sex'] == '男'] #男生数据
    female = data_temporary[data_temporary['Sex'] == '女'] #女生数据
    
    #男生饼图
    pie_male = (Pie()
   .add('', [list(z) for z in zip(list(male['Dept']), list(male['Num']) )],
        radius=["30%", "75%"],
        rosetype="radius")
   .set_global_opts(title_opts=opts.TitleOpts(title = major + ' 男生 消费类型'),
                   legend_opts=opts.LegendOpts(type_="scroll", pos_right="right", orient="vertical"), #图例居右
                   )
   .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
   )
    
    #女生饼图
    pie_female = (Pie()
   .add('', [list(z) for z in zip(list(female['Dept']), list(female['Num']) )],
        radius=["30%", "75%"],
        rosetype="radius")
   .set_global_opts(title_opts=opts.TitleOpts(title = major + ' 女生 消费类型'),
                   legend_opts=opts.LegendOpts(type_="scroll", pos_right="right", orient="vertical"), #图例居右
                   )
   .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
   )    
    
    page.add(pie_male) #添加到page,拼接图片
    page.add(pie_female) #添加到page,拼接图片
    
page.render_notebook()
Out[9]:
In [10]:
#下面开始机器学习测试
In [11]:
data_tree = data_consume[['Sex', 'Major', 'Dept']]
data_tree
Out[11]:
Sex Major Dept
0 18建筑设计 第二食堂
1 18电气自动化 第二食堂
2 18电气自动化 第二食堂
3 18电气自动化 第二食堂
4 18皮具艺术 第二食堂
... ... ... ...
232985 18市场营销 红太阳超市
232986 18物流管理 红太阳超市
232987 18市场营销 红太阳超市
232988 18模具设计 红太阳超市
232989 18模具设计 红太阳超市

232990 rows × 3 columns

In [27]:
data_consume
Out[27]:
CardNo PeoNo Sex Major AccessCardNo Date Money FundMoney Surplus CardCount Type TermNo TermSerNo conOperNo OperNo Dept
0 181944 20181944 18建筑设计 19435482 2019-04-01 06:26:00 3.0 0.0 149.45 521 消费 174 0 0.0 27 第二食堂
1 181058 20181058 18电气自动化 20017930 2019-04-01 06:33:00 2.4 0.0 115.40 620 消费 25 0 0.0 27 第二食堂
2 181058 20181058 18电气自动化 20017930 2019-04-01 06:34:00 1.5 0.0 113.90 621 消费 25 0 0.0 27 第二食堂
3 181058 20181058 18电气自动化 20017930 2019-04-01 06:35:00 0.6 0.0 113.30 622 消费 54 0 0.0 27 第二食堂
4 183391 20183391 18皮具艺术 1238278 2019-04-01 06:39:00 3.0 0.0 75.50 607 消费 26 0 0.0 27 第二食堂
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
232985 181018 20181018 18市场营销 21956266 2019-04-30 23:43:00 3.5 0.0 61.65 713 消费 187 0 0.0 2 红太阳超市
232986 180747 2018747 18物流管理 20758586 2019-04-30 23:43:00 4.0 0.0 84.70 913 消费 187 0 0.0 2 红太阳超市
232987 181022 20181022 18市场营销 19343466 2019-04-30 23:43:00 4.5 0.0 249.50 735 消费 187 0 0.0 2 红太阳超市
232988 181505 20181505 18模具设计 21634602 2019-04-30 23:47:00 3.0 0.0 134.20 677 消费 107 0 0.0 2 红太阳超市
232989 181498 20181498 18模具设计 21117354 2019-04-30 23:47:00 3.0 0.0 83.40 689 消费 107 0 0.0 2 红太阳超市

232990 rows × 16 columns

In [12]:
data_dummies = pd.get_dummies(data_tree)
data_dummies
Out[12]:
Sex_女 Sex_男 Major_18产品艺术 Major_18会计 Major_18动漫设计 Major_18商务日语 Major_18商务英语 Major_18国贸实务 Major_18国际商务 Major_18国际金融 ... Dept_第二食堂 Dept_第五教学楼 Dept_第五食堂 Dept_第六教学楼 Dept_第四教学楼 Dept_第四食堂 Dept_红太阳超市 Dept_自然科学书库 Dept_青鸾苑宿管办 Dept_飞凤轩宿管办
0 1 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
3 0 1 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
4 1 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
232985 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232986 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232987 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232988 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232989 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0

232990 rows × 71 columns

In [13]:
print(data_dummies.columns.values.tolist())
['Sex_女', 'Sex_男', 'Major_18产品艺术', 'Major_18会计', 'Major_18动漫设计', 'Major_18商务日语', 'Major_18商务英语', 'Major_18国贸实务', 'Major_18国际商务', 'Major_18国际金融', 'Major_18宝玉石鉴定', 'Major_18审计', 'Major_18嵌入式技术', 'Major_18工业工程', 'Major_18工业机器人', 'Major_18工业设计', 'Major_18工商企管', 'Major_18工程造价', 'Major_18市场营销', 'Major_18市政工程', 'Major_18建筑工程', 'Major_18建筑设计', 'Major_18投资与理财', 'Major_18旅游管理', 'Major_18机械制造', 'Major_18机械制造(学徒)', 'Major_18模具设计', 'Major_18汽车检测', 'Major_18物流管理', 'Major_18环境艺术', 'Major_18电子商务', 'Major_18电气自动化', 'Major_18皮具艺术', 'Major_18社会工作', 'Major_18艺术设计', 'Major_18视觉传播', 'Major_18计算机应用', 'Major_18计算机网络', 'Major_18软件技术', 'Major_18连锁经营', 'Major_18酒店管理', 'Major_18金融管理', 'Major_18首饰设计', 'Dept_人文社科', 'Dept_医务室', 'Dept_基础课部', 'Dept_外语系', 'Dept_好利来食品店', 'Dept_宿管办', 'Dept_工商系部', 'Dept_教师食堂', 'Dept_机电系', 'Dept_水电缴费处', 'Dept_第一图书馆', 'Dept_第一教学楼', 'Dept_第一食堂', 'Dept_第七教学楼', 'Dept_第三教学楼', 'Dept_第三食堂', 'Dept_第二图书馆', 'Dept_第二教学楼', 'Dept_第二食堂', 'Dept_第五教学楼', 'Dept_第五食堂', 'Dept_第六教学楼', 'Dept_第四教学楼', 'Dept_第四食堂', 'Dept_红太阳超市', 'Dept_自然科学书库', 'Dept_青鸾苑宿管办', 'Dept_飞凤轩宿管办']
In [14]:
#设置 feature
features = data_dummies.loc[:, 'Sex_女':'Major_18首饰设计']
# features_taget = data_dummies.loc[:, 'Dept_人文社科':'Dept_飞凤轩宿管办']
#提取numpy数组
X = features.values
# y = features_taget.values
print(X.shape)
(232990, 43)
In [15]:
features
Out[15]:
Sex_女 Sex_男 Major_18产品艺术 Major_18会计 Major_18动漫设计 Major_18商务日语 Major_18商务英语 Major_18国贸实务 Major_18国际商务 Major_18国际金融 ... Major_18社会工作 Major_18艺术设计 Major_18视觉传播 Major_18计算机应用 Major_18计算机网络 Major_18软件技术 Major_18连锁经营 Major_18酒店管理 Major_18金融管理 Major_18首饰设计
0 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
232985 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
232986 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
232987 1 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
232988 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
232989 0 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

232990 rows × 43 columns

In [16]:
#设置feature_target 目标变量
y_df = data_dummies.loc[:, 'Dept_人文社科':'Dept_飞凤轩宿管办']
feature_target_name = y_df.columns.values.tolist()  #保存每个索引对应的名称
y_np = y_df.values
[rows, cols] = y_np.shape

#将每个分类的索引添加到列表,并转为np数组
features_taget = []
for i in range(rows):
    features_taget.append(np.argwhere(y_np[i] == 1)[0][0] )

features_taget = np.array(features_taget)    
print(features_taget)
y = features_taget
print(y.shape)
[18 18 18 ... 24 24 24]
(232990,)
In [17]:
y_df
Out[17]:
Dept_人文社科 Dept_医务室 Dept_基础课部 Dept_外语系 Dept_好利来食品店 Dept_宿管办 Dept_工商系部 Dept_教师食堂 Dept_机电系 Dept_水电缴费处 ... Dept_第二食堂 Dept_第五教学楼 Dept_第五食堂 Dept_第六教学楼 Dept_第四教学楼 Dept_第四食堂 Dept_红太阳超市 Dept_自然科学书库 Dept_青鸾苑宿管办 Dept_飞凤轩宿管办
0 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
232985 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232986 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232987 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232988 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0
232989 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0

232990 rows × 28 columns

In [18]:
feature_target_name
Out[18]:
['Dept_人文社科',
 'Dept_医务室',
 'Dept_基础课部',
 'Dept_外语系',
 'Dept_好利来食品店',
 'Dept_宿管办',
 'Dept_工商系部',
 'Dept_教师食堂',
 'Dept_机电系',
 'Dept_水电缴费处',
 'Dept_第一图书馆',
 'Dept_第一教学楼',
 'Dept_第一食堂',
 'Dept_第七教学楼',
 'Dept_第三教学楼',
 'Dept_第三食堂',
 'Dept_第二图书馆',
 'Dept_第二教学楼',
 'Dept_第二食堂',
 'Dept_第五教学楼',
 'Dept_第五食堂',
 'Dept_第六教学楼',
 'Dept_第四教学楼',
 'Dept_第四食堂',
 'Dept_红太阳超市',
 'Dept_自然科学书库',
 'Dept_青鸾苑宿管办',
 'Dept_飞凤轩宿管办']
In [19]:
y
Out[19]:
array([18, 18, 18, ..., 24, 24, 24])
In [20]:
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3)
In [21]:
print(X_train)
[[1 0 0 ... 0 0 0]
 [0 1 0 ... 0 0 0]
 [1 0 0 ... 0 0 0]
 ...
 [0 1 0 ... 0 0 0]
 [1 0 0 ... 0 0 0]
 [0 1 0 ... 0 0 0]]
In [22]:
print(y_train)
[18 15 18 ... 20 18 18]
In [23]:
from sklearn.tree import DecisionTreeClassifier
# clf = DecisionTreeRegressor(n_neighbors=1, n_jobs=-1)
tree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))
Accuracy on training set: 0.495
Accuracy on test set: 0.494
In [24]:
prediction = tree.predict([X_train[248]])
prediction = int(prediction)
feature_target_name[prediction]
Out[24]:
'Dept_第五食堂'
In [25]:
prediction = tree.predict([X_train[248]])
prediction
Out[25]:
array([20])
In [26]:
prediction = int(prediction)
feature_target_name[prediction]
Out[26]:
'Dept_第五食堂'
In [ ]: