Python数据分析——教育平台的线上课程智能推荐策略(2020泰迪杯数据分析技能赛)

news2024/11/16 3:45:25

赛题背景:近年来,随着互联网与通信技术的高速发展,学习资源的建设与共享呈现出新的发展趋势,各种网课、慕课、直播课等层出不穷,各种在线教育平台和学习 应用纷纷涌现。尤其是 2020 年春季学期,受新冠疫情影响,在教育部“停课不停学”的要求下,网络平台成为“互联网+教育”成果的重要展示阵地。因此, 如何根据教育平台的线上用户信息和学习信息,通过数据分析为教育平台和用户提供精准的课程推荐服务就成为线上教育的热点问题。 本赛题提供了某教育平台近两年的运营数据,希望参赛者根据这些数据,为平台制定综合的线上课程推荐策略,以便更好地服务线上用户。

请添加图片描述

users.csv ( 用 户 信 息 表 )、 study_information.csv(学习详情表)和 login.csv(登录详情表),它们的数据说明 分别如表 1、表 2 和表 3 所示。

表 1 users.csv 字段说明

字段名描述
user_id用户 id
registration_time注册时间
recently_logged最近访问时间
learn_time学习时长(分)
number_of_classes_join加入班级数
number_of_classes_out退出班级数
school用户所属学校

表 2 study_information.csv 字段说明

字段名描述
user_id用户 id
course_id课程 id
course_join_time加入课程的时间
learn_process学习进度
price课程单价

表 3 login.csv 字段说明

字段名描述
user_id用户 id
login_time登录时间
login_place登录地址
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

#中文乱码与坐标轴负号处理
plt.rcParams['font.sans-serif'] = ['Microsoft Yahei']
plt.rcParams['axes.unicode_minus'] = False
Login = pd.read_csv('Login.csv')
Login.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timelogin_place
0用户32018-09-06 09:32:47中国广东广州
1用户32018-09-07 09:28:28中国广东广州
2用户32018-09-07 09:57:44中国广东广州
3用户32018-09-07 10:55:07中国广东广州
4用户32018-09-07 12:28:42中国广东广州
study_information = pd.read_csv('study_information.csv')
study_information.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idcourse_idcourse_join_timelearn_processprice
0用户3课程1062020-04-21 10:11:50width: 0%;0.0
1用户3课程1362020-03-05 11:44:36width: 1%;0.0
2用户3课程2052018-09-10 18:17:01width: 63%;0.0
3用户4课程262020-03-31 10:52:51width: 0%;319.0
4用户4课程342020-03-31 10:52:49width: 0%;299.0
users = pd.read_csv('users.csv')
users1 = users[['user_id','register_time','recently_logged','learn_time']]
users1.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idregister_timerecently_loggedlearn_time
0用户442512020/6/18 9:492020/6/18 9:4941.25
1用户442502020/6/18 9:472020/6/18 9:480
2用户442492020/6/18 9:432020/6/18 9:4316.22
3用户442482020/6/18 9:092020/6/18 9:090
4用户442472020/6/18 7:412020/6/18 8:151.8

任务一 数据预处理

任务1.1

对照附录 1,理解各字段的含义,进行缺失值、重复值等方面的必要处理,将处理结果保存“task1_1_X.csv”(如果包含多张数据表,X 可从 1 开始往后编号),并在报告中描述处理过程。

缺失值处理

Login.isnull().mean()
user_id        0.0
login_time     0.0
login_place    0.0
dtype: float64
study_information.isnull().mean()
user_id             0.000000
course_id           0.000000
course_join_time    0.000000
learn_process       0.000000
price               0.021736
dtype: float64

删除price的缺失,认0为免费课程

study_information = study_information.dropna(subset=['price'])
study_information.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idcourse_idcourse_join_timelearn_processprice
0用户3课程1062020-04-21 10:11:50width: 0%;0.0
1用户3课程1362020-03-05 11:44:36width: 1%;0.0
2用户3课程2052018-09-10 18:17:01width: 63%;0.0
3用户4课程262020-03-31 10:52:51width: 0%;319.0
4用户4课程342020-03-31 10:52:49width: 0%;299.0
users1.isnull().mean()
user_id            0.001523
register_time      0.000000
recently_logged    0.000000
learn_time         0.000000
dtype: float64

对user_id缺失进行删除

users1 = users.dropna(subset=['user_id'])
users1.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idregister_timerecently_loggednumber_of_classes_joinnumber_of_classes_outlearn_timeschool
0用户442512020/6/18 9:492020/6/18 9:490041.25NaN
1用户442502020/6/18 9:472020/6/18 9:48000NaN
2用户442492020/6/18 9:432020/6/18 9:430016.22NaN
3用户442482020/6/18 9:092020/6/18 9:09000NaN
4用户442472020/6/18 7:412020/6/18 8:15001.8NaN

异常值处理

#excel表格处理
users1.to_csv('new_users1.csv')
new_users1 = pd.read_csv('new_users.csv')
new_users1.columns
new_users = new_users1[[ 'user_id', 'register_time', 'recently_logged', 'number_of_classes_join','number_of_classes_out','learn_time']]
new_users.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idregister_timerecently_loggednumber_of_classes_joinnumber_of_classes_outlearn_time
0用户442512020/6/18 9:492020/6/18 9:490041.25
1用户442502020/6/18 9:472020/6/18 9:48000
2用户442492020/6/18 9:432020/6/18 9:430016.22
3用户442482020/6/18 9:092020/6/18 9:09000
4用户442472020/6/18 7:412020/6/18 8:15001.8

任务 1.2

重复值处理

print("Login表存在重复值:",any(Login.duplicated()))
print("study_information表存在重复值:",any(study_information.duplicated()))
print("users表存在重复值:",any(new_users.duplicated()))
Login表存在重复值: False
study_information表存在重复值: False
users表存在重复值: True
new_users.drop_duplicates(inplace=True)
new_users.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idregister_timerecently_loggednumber_of_classes_joinnumber_of_classes_outlearn_time
0用户442512020/6/18 9:492020/6/18 9:490041.25
1用户442502020/6/18 9:472020/6/18 9:48000
2用户442492020/6/18 9:432020/6/18 9:430016.22
3用户442482020/6/18 9:092020/6/18 9:09000
4用户442472020/6/18 7:412020/6/18 8:15001.8

任务二 平台用户活跃度分析

任务 2.1

分别绘制各省份与各城市平台登录次数热力地图,并分析用户分布情况。

——国内

Login['guobie'] = Login['login_place'].apply(lambda x:x[0:2]).tolist()
Login.head(5)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timelogin_placeguobie
0用户32018-09-06 09:32:47中国广东广州中国
1用户32018-09-07 09:28:28中国广东广州中国
2用户32018-09-07 09:57:44中国广东广州中国
3用户32018-09-07 10:55:07中国广东广州中国
4用户32018-09-07 12:28:42中国广东广州中国
Login_nei = Login.loc[Login['login_place'].str.contains("内蒙古")] 
Login_nei['shengfen'] = Login_nei['login_place'].apply(lambda x:x[2:5]).tolist()
Login_nei['chengshi'] = Login_nei['login_place'].apply(lambda x:x[5:]).tolist()
Login_nei.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timelogin_placeguobieshengfenchengshi
15646用户12342020-02-03 21:38:07中国内蒙古呼和浩特中国内蒙古呼和浩特
17145用户14912019-01-04 14:19:26中国内蒙古呼和浩特中国内蒙古呼和浩特
17283用户15442019-10-11 13:56:47中国内蒙古呼和浩特中国内蒙古呼和浩特
17698用户17152019-01-10 09:37:46中国内蒙古鄂尔多斯中国内蒙古鄂尔多斯
17809用户17652019-01-11 15:03:12中国内蒙古兴安盟中国内蒙古兴安盟
Login_hei = Login.loc[Login['login_place'].str.contains("黑龙江")] 
Login_hei['shengfen'] = Login_hei['login_place'].apply(lambda x:x[2:5]).tolist()
Login_hei['chengshi'] = Login_hei['login_place'].apply(lambda x:x[5:]).tolist()
Login_hei.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timelogin_placeguobieshengfenchengshi
5682用户1862018-10-25 19:40:12中国黑龙江中国黑龙江
5683用户1862018-10-27 11:30:15中国黑龙江中国黑龙江
5684用户1862018-10-28 12:23:24中国黑龙江中国黑龙江
5821用户1962018-10-25 19:57:47中国黑龙江中国黑龙江
6196用户2292018-10-25 21:28:13中国黑龙江哈尔滨中国黑龙江哈尔滨
#不包括内蒙古、黑龙江
Login2 = Login[~Login['login_place'].str.contains("内蒙古|黑龙江")] 
Login2['shengfen'] = Login2['login_place'].apply(lambda x:x[2:4]).tolist()
Login2['chengshi'] = Login2['login_place'].apply(lambda x:x[4:]).tolist()
Login2.head(5)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timelogin_placeguobieshengfenchengshi
0用户32018-09-06 09:32:47中国广东广州中国广东广州
1用户32018-09-07 09:28:28中国广东广州中国广东广州
2用户32018-09-07 09:57:44中国广东广州中国广东广州
3用户32018-09-07 10:55:07中国广东广州中国广东广州
4用户32018-09-07 12:28:42中国广东广州中国广东广州
Login_he1 = Login_nei.append(Login2)
Login_he2 = Login_he1.append(Login_hei)
Login_he = Login_he2[['user_id','login_time','guobie','shengfen','chengshi']]
Login_he.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_timeguobieshengfenchengshi
15646用户12342020-02-03 21:38:07中国内蒙古呼和浩特
17145用户14912019-01-04 14:19:26中国内蒙古呼和浩特
17283用户15442019-10-11 13:56:47中国内蒙古呼和浩特
17698用户17152019-01-10 09:37:46中国内蒙古鄂尔多斯
17809用户17652019-01-11 15:03:12中国内蒙古兴安盟

——国外

#各国登录统计
Login_he2 =  Login_he.groupby(by='guobie',as_index=False).count()
#不包括中国
Login_he3 = Login_he2[~Login_he2['guobie'].isin(["中国"])]
Login_he3
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
guobieuser_idlogin_timeshengfenchengshi
1南非3333
2希腊1111
3德国24242424
4挪威1111
5捷克4444
6波兰7777
7泰国2222
8瑞典1111
9瑞士1111
10英国151151151151
11荷兰8888
12越南27272727
from pyecharts.charts import Line
from pyecharts import options as opts 
x_data = list(Login_he3['guobie'])
#['South Africa','Greece','Germany','Norway','Czech Rep.','Poland','Thailand',
         # 'Sweden','Switzerland','United Kingdom','Netherlands','Vietnam']
y_data = Login_he3['user_id']

# 特殊值标记
line = (Line()
        .add_xaxis(x_data)
        .add_yaxis("国外平台登录情况",y_data)
        .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="average", name="平均值")
            ]))
        .set_global_opts(
            #title_opts=opts.TitleOpts(title="国内平台登录次数", subtitle="副标题"),                         # 标题
            toolbox_opts=opts.ToolboxOpts(),                                 # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)     # 横轴缩放
        )
        )                                                                                                
line.render_notebook()

请添加图片描述

各省份平台登录次数热力地图

#不包括国外
Login_china = Login_he[Login_he['guobie'].isin(["中国"])]

Login_china2 =  Login_china.groupby(by='shengfen',as_index=False).count()
Login_china3 = Login_china2.iloc[1:,]
Login_china3['count'] = Login_china3['user_id']
Login_china3.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
shengfenuser_idlogin_timeguobiechengshicount
1上海53655365536553655365
2云南37503750375037503750
3内蒙18701870187018701870
4内蒙古18701870187018701870
5北京49464946494649464946
type(y_data.values)
numpy.ndarray

——全国省份用户登录人数分布

from pyecharts.charts import Bar

x_data = list(Login_china3['shengfen'])
y_data = list(Login_china3['count'])

# 特殊值标记
bar = (Bar()
       .add_xaxis(x_data)
       .add_yaxis('国内平台登录次数', y_data)
       .set_series_opts(
        markpoint_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),                
            ]))
       .set_global_opts(
            #title_opts=opts.TitleOpts(title="国内平台登录次数", subtitle="副标题"),                         # 标题
            toolbox_opts=opts.ToolboxOpts(),                 # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)     # 横轴缩放
        )
       .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="average", name="平均值")
            ]))
      )

bar.render_notebook()
#bar.render('map2.html') #保存到本地

请添加图片描述

from pyecharts.charts import Map
province = ['北京市','天津市','河北省','山西省','内蒙古自治区','辽宁省','吉林省','黑龙江省','上海市','江苏省','浙江省','安徽省','福建省','江西省',
'山东省','河南省','湖北省','湖南省','广东省','广西壮族自治区','海南省','重庆市','四川省','贵州省','云南省','陕西省','甘肃省','青海省','宁夏回族自治区','新疆维吾尔自治区']

values = list(Login_china3['count'])
data = [[province[i],values[i]] for i in range(len(province))]
map = (
    Map()      
    .add("中国地图平台登录次数",data,'china')
      )
map.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(max_=125000),  #最大数据范围
    toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
    )
map.render_notebook()

请添加图片描述

各城市平台登录次数热力地图

#重点省份用户平台登陆次数分析

Login_china4 = Login_china3.sort_values(by='count',ascending=False)
Login_china5 = Login_china4.iloc[0:10,:]

x_data = list(Login_china5['shengfen'])
y_data = list(Login_china5['count'])

bar = (Bar()
       .add_xaxis(x_data)
       .add_yaxis('重点省份用户平台登陆次数分析', y_data)
       .set_series_opts(
        markpoint_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),                
            ]))
       .set_global_opts(
            title_opts=opts.TitleOpts(title="国内平台登录次数"),                         # 标题
            toolbox_opts=opts.ToolboxOpts(),                                                     # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)                         # 横轴缩放
        )
       .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="average", name="平均值")
            ]))
      )
bar.render_notebook()

请添加图片描述

——重点省份用户分布情况分析

#广东
Login_guangdong1 = Login_he[Login_he['shengfen'].isin(["广东"])]
Login_guangdong2 =  Login_guangdong1.groupby(by='chengshi',as_index=False).count()
Login_guangdong = Login_guangdong2.iloc[1:,]

Login_guangdong["new_chengshi"] = Login_guangdong['chengshi']+'市'

x_data = list(Login_guangdong['user_id'])
y_data = list(Login_guangdong['new_chengshi'])
data = [[y_data[i],x_data[i]] for i in range(len(y_data))]

map = (
    Map()      
    .add("广东各城市平台登录次数热力地图",data,'广东')
      )
map.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(max_=28000),  #最大数据范围
    toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
    )
map.render_notebook()

请添加图片描述

#湖北

Login_hubei1 = Login_he[Login_he['shengfen'].isin(["湖北"])]
Login_hubei2 =  Login_hubei1.groupby(by='chengshi',as_index=False).count()
Login_hubei = Login_hubei2.iloc[1:,]

Login_hubei["new_chengshi"] = Login_hubei['chengshi']+'市'
Login_hubei.loc[Login_hubei['new_chengshi']== '恩施土家族苗族自治州市','new_chengshi']= '恩施土家族苗族自治州'
Login_hubei.loc[Login_hubei['new_chengshi']== '神农架林区市','new_chengshi']= '神农架林区'
x_data = list(Login_hubei['user_id'])
y_data = list(Login_hubei['new_chengshi'])

data = [[y_data[i],x_data[i]] for i in range(len(y_data))]

map = (
    Map()      
    .add("湖北各城市平台登录次数热力地图",data,'湖北')
      )
map.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(max_=6800),  #最大数据范围
    toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
    )
map.render_notebook()

请添加图片描述

#贵州

Login_guizhou1 = Login_he[Login_he['shengfen'].isin(["贵州"])]
Login_guizhou2 =  Login_guizhou1.groupby(by='chengshi',as_index=False).count()
Login_guizhou = Login_guizhou2.iloc[1:,]

Login_guizhou["new_chengshi"] = Login_guizhou['chengshi']+'市'
Login_guizhou.loc[Login_guizhou['new_chengshi']== '黔东南苗族侗族自治州市','new_chengshi']= '黔东南苗族侗族自治州'
Login_guizhou.loc[Login_guizhou['new_chengshi']== '黔南布依族苗族自治州市','new_chengshi']= '黔南布依族苗族自治州'
Login_guizhou.loc[Login_guizhou['new_chengshi']== '黔西南布依族苗族自治州市','new_chengshi']= '黔西南布依族苗族自治州'

x_data = list(Login_guizhou['user_id'])
y_data = list(Login_guizhou['new_chengshi'])

data = [[y_data[i],x_data[i]] for i in range(len(y_data))]

map = (
    Map()      
    .add("贵州各城市平台登录次数热力地图",data,'贵州')
      )
map.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(max_=3700),  #最大数据范围
    toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
    )
map.render_notebook()

请添加图片描述

#河南

Login_henan1 = Login_he[Login_he['shengfen'].isin(["河南"])]
Login_henan2 =  Login_henan1.groupby(by='chengshi',as_index=False).count()
Login_henan = Login_henan2.iloc[1:,]

Login_henan["new_chengshi"] = Login_henan['chengshi']+'市'

x_data = list(Login_henan['user_id'])
y_data = list(Login_henan['new_chengshi'])

data = [[y_data[i],x_data[i]] for i in range(len(y_data))]

map = (
    Map()      
    .add("河南各城市平台登录次数热力地图",data,'河南')
      )
map.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(max_=2550),  #最大数据范围
    toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
    )
map.render_notebook()

请添加图片描述

任务 2.2

分别绘制工作日与非工作日各时段的用户登录次数柱状图,并分析用户活跃的主要时间段。

#将日期与时间分割
Login1 = Login["login_time"].str.split(" ",expand=True).fillna("")
Login1['login_data'] = Login1[0]
Login1['login_hour'] = Login1[1]
Login1['user_id'] = Login['user_id']
Login2 = Login1[['user_id','login_data','login_hour']]
Login2.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_datalogin_hour
0用户32018-09-0609:32:47
1用户32018-09-0709:28:28
2用户32018-09-0709:57:44
3用户32018-09-0710:55:07
4用户32018-09-0712:28:42

工作日分析

import datetime
import chinese_calendar

start_time = datetime.datetime(2018, 9, 6)
end_time = datetime.datetime(2020, 6, 18)

#获取工作日时期
a = chinese_calendar.get_workdays(start_time,end_time)
#chinese_calendar.get_holidays(start_time,end_time)

#转换为日期列表
date_string = [d.strftime('%Y-%m-%d') for d in a]

#筛选工作日所含数据
Login3 = Login2[Login2['login_data'].isin(date_string)]

#将小时取整
x = Login3['login_hour']
Login3['login_newhour'] = Login3['login_hour'].apply(lambda x: int(x[0:2]))
Login3.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_datalogin_hourlogin_newhour
0用户32018-09-0609:32:479
1用户32018-09-0709:28:289
2用户32018-09-0709:57:449
3用户32018-09-0710:55:0710
4用户32018-09-0712:28:4212
gongzuori = Login3.groupby(by=Login3['login_newhour'],as_index=False)['user_id'].count()
gongzuori['gongzuori'] = gongzuori['user_id']
gongzuori = gongzuori[['login_newhour','gongzuori']]
gongzuori.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
login_newhourgongzuori
003520
111315
22612
33350
44215

非工作日分析

import datetime
import chinese_calendar

start_time = datetime.datetime(2018, 9, 6)
end_time = datetime.datetime(2020, 6, 18)

#获取工作日时期
a = chinese_calendar.get_holidays(start_time,end_time)
#chinese_calendar.get_holidays(start_time,end_time)

#转换为日期列表
date_string = [d.strftime('%Y-%m-%d') for d in a]

#筛选工作日所含数据
Login4 = Login2[Login2['login_data'].isin(date_string)]

#将小时取整
x = Login4['login_hour']
Login4['login_newhour'] = Login4['login_hour'].apply(lambda x: int(x[0:2]))
Login4.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idlogin_datalogin_hourlogin_newhour
38用户32018-09-2300:56:320
88用户32018-10-1309:19:459
89用户32018-10-1316:02:5916
104用户32018-10-2017:10:3317
135用户32018-11-0418:02:0618
holidays = Login4.groupby(by=Login4['login_newhour'],as_index=False)['user_id'].count()
holidays['holidays'] = holidays['user_id']
holidays = holidays[['login_newhour','holidays']]
holidays.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
login_newhourholidays
001538
11628
22323
33148
4496
from pyecharts.charts import Line
attr = list(gongzuori['login_newhour'])
v1 = list(gongzuori['gongzuori'])
v2 = list(holidays['holidays'])

line = (Line()
       .add_xaxis(attr)
       .add_yaxis('工作日次数', v1)
       .add_yaxis('非工作日次数',v2)
       .set_global_opts(
            title_opts=opts.TitleOpts(title="用户活跃度整体情况分析"),       # 标题
            toolbox_opts=opts.ToolboxOpts(),                               # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)    # 横轴缩放
        )
      )
line.render_notebook()

请添加图片描述

任务 2.3

记𝑇end为数据观察窗口截止时间(如:赛题数据的采集截止时间为2020 年 6 月 18 日),𝑇𝑖为用户 i 的最近访问时间,𝜎𝑖 = 𝑇end − 𝑇𝑖,若𝜎𝑖 > 90天,则称用户 i 为流失用户。根据该定义计算平台用户的流失率。

用户总体情况分析

Tend = pd.date_range('20200618235959',periods=1)
new_users.drop_duplicates(inplace=True)
new_users['Tend'] = list(Tend)*43909 
new_users['longtime'] = (pd.to_datetime(new_users['Tend']) - pd.to_datetime(new_users['recently_logged'])).map(lambda x:x.days)
#new_users['longtime'] = new_users['longtime'].astype(str)
new_users3 = new_users.dropna()
#new_users['longtime'].str.split("",expand=True).fillna("")
new_users3.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idregister_timerecently_loggednumber_of_classes_joinnumber_of_classes_outlearn_timeTendlongtime
0用户442512020/6/18 9:492020/6/18 9:490041.252020-06-18 23:59:590.0
1用户442502020/6/18 9:472020/6/18 9:480002020-06-18 23:59:590.0
2用户442492020/6/18 9:432020/6/18 9:430016.222020-06-18 23:59:590.0
3用户442482020/6/18 9:092020/6/18 9:090002020-06-18 23:59:590.0
4用户442472020/6/18 7:412020/6/18 8:15001.82020-06-18 23:59:590.0
new_users3['longtime'].describe()
count    43717.000000
mean       190.146259
std        170.868948
min          0.000000
25%         49.000000
50%        115.000000
75%        343.000000
max        646.000000
Name: longtime, dtype: float64
new_users4 =  new_users3.groupby(by='longtime',as_index=False).count()

x_data = list(new_users4['longtime'])
y_data = list(new_users4['user_id'])

bar = (Bar()
       .add_xaxis(x_data)
       .add_yaxis('人数', y_data)
       .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False))
       .set_global_opts(
            title_opts=opts.TitleOpts(title="各类时间差值人数分析"),      # 标题
            toolbox_opts=opts.ToolboxOpts(),                             # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100) # 横轴缩放
        )
      )
bar.render_notebook()

请添加图片描述

流失天数及流失率分析

new_users5  = new_users3[new_users3['longtime'] >90]

new_users6 =  new_users5.groupby(by='longtime',as_index=False).count()

x_data = list(new_users6['longtime'])
y_data = list(new_users6['user_id'])

bar = (Bar()
       .add_xaxis(x_data)
       .add_yaxis('天数', y_data)
       .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False))
       .set_global_opts(
            title_opts=opts.TitleOpts(title="流失用户的流失天数分析"),                         # 标题
            toolbox_opts=opts.ToolboxOpts(),                                                     # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)                         # 横轴缩放
        )
      )
bar.render_notebook()

请添加图片描述

print('流失率:',new_users5['longtime'].count()/43717)
print('流失人数:',new_users5['longtime'].count())
流失率: 0.5796143376718439
流失人数: 25339

未流失客户流失风险等级分类分析

潜水用户:小于 90 天且大于 60 天

活跃用户:小于 60 天

高活跃用户:小于 30 天

低活跃用户:小于 60 天且大于 30 天
qianshui = new_users3[(new_users3.longtime > 60) & (new_users3.longtime < 90)]['longtime'].count()
print('潜水用户:',qianshui)
print('潜水用户占比:',qianshui/(43717-25339))
潜水用户: 4796
潜水用户占比: 0.260964196321689
gao_huoyue = new_users3[new_users3.longtime < 30]['longtime'].count()
print('高活跃用户:',gao_huoyue)
print('高活跃用户占比:',gao_huoyue/(43717-25339))
高活跃用户: 7516
高活跃用户占比: 0.40896724344324736
di_huoyue = new_users3[(new_users3.longtime > 30) & (new_users3.longtime < 60)]['longtime'].count()
print('低活跃用户:',di_huoyue)
print('低活跃用户占比:',di_huoyue/(43717-25339))
低活跃用户: 5647
低活跃用户占比: 0.3072695614321471

任务 2.4

根据任务 2.1 至任务 2.3,分析平台用户的活跃度,为该教育平台
的线上管理决策提供建议。

任务 3 线上课程推荐

任务 3.1

根据用户参与学习的记录,统计每门课程的参与人数,计算每门课程的受欢迎程度,列出最受欢迎的前 10 门课程,并绘制相应的柱图。

study_information1= study_information.groupby(by='course_id',as_index=False)['user_id'].count()
study_information1['num'] = study_information1['user_id']
study_information2 = study_information1[['course_id','num']]
study_information2.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
course_idnum
0课程02
1课程14
2课程1035
3课程1005
4课程101482

选课人数分析

study_information2['num'].sum()
190736
num1 = study_information2[(study_information2.num > 10000)]['num'].sum()
print('选课人数10000以上:',num1)
print('选课人数占比:',num1/190736)
选课人数10000以上: 13265
选课人数占比: 0.06954638872577804
num2 = study_information2[(study_information2.num > 5000) & (study_information2.num < 10000)]['num'].sum()
print('选课人数5000-10000:',num2)
print('选课人数占比:',num2/190736)
选课人数5000-10000: 53968
选课人数占比: 0.2829460615720158
num3 = study_information2[(study_information2.num > 1000) & (study_information2.num < 5000)]['num'].sum()
print('选课人数1000-5000:',num3)
print('选课人数占比:',num3/190736)
选课人数1000-5000: 89075
选课人数占比: 0.4670067527891955
num4 = study_information2[(study_information2.num > 500) & (study_information2.num < 1000)]['num'].sum()
print('选课人数500-1000:',num4)
print('选课人数占比:',num4/190736)
选课人数500-1000: 13057
选课人数占比: 0.06845587618488382
num5 = study_information2[(study_information2.num > 100) & (study_information2.num < 500)]['num'].sum()
print('选课人数100-500:',num5)
print('选课人数占比:',num5/190736)
选课人数100-500: 18819
选课人数占比: 0.09866517070715544
num6 = study_information2[(study_information2.num < 100)]['num'].sum()
print('选课人数100以下:',num6)
print('选课人数占比:',num6/190736)
选课人数100以下: 2552
选课人数占比: 0.013379750020971396
from pyecharts.charts import Pie
x_data = ["选课人数10000以上", "选课人数5000-10000", "选课人数1000-5000", "选课人数500-1000", "选课人数100-500","选课人数100以下"]
y_data = [13265, 53968, 89075, 13057, 18819,2552]

c = (
    Pie()
    .add("", [list(z) for z in zip(x_data, y_data)],radius=["30%", "70%"])   # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)]
    .set_global_opts(
        title_opts=opts.TitleOpts(title="课程参与人数分析"), # 标题
        toolbox_opts=opts.ToolboxOpts(),                                                     # 工具箱
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="10%", pos_left="80%")) #图例设置
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))  # 数据标签设置
    )
c.render_notebook()

请添加图片描述

课程受欢迎程度分析

study_information2.describe()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
num
count239.000000
mean798.058577
std1746.098741
min1.000000
25%18.500000
50%138.000000
75%458.500000
max13265.000000
study_information2['y'] = (study_information2['num']-1)/13624
study_information2 = study_information2.sort_values(by='y',ascending=False)
study_information3 = study_information2.iloc[0:10,:]
study_information3 
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
course_idnumy
214课程76132650.973576
166课程3195210.698767
79课程1785050.624193
103课程19171260.522974
91课程18062230.456694
188课程5261050.448033
169课程3457090.418967
81课程17154370.399002
187课程5053420.392029
24课程1248290.354375
x_data = list(study_information3['course_id'])
y_data_line = list(study_information3['y'])

line = (Line()
       .add_xaxis(x_data)
       .add_yaxis('课程参与百分比', y_data_line)
       .set_global_opts(
            title_opts=opts.TitleOpts(title="课程受欢迎程度分析"),                         # 标题
            toolbox_opts=opts.ToolboxOpts()                                                     # 工具箱
        )
       .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False))
      )
line.render_notebook()

请添加图片描述

x_data = list(study_information3['course_id'])
y_data_line = list(round(study_information3['y'],2))


c = (
    Pie()
    .add("", [list(z) for z in zip(x_data, y_data_line)],
         center=['45%', '55%'],radius=["25%", "70%"],rosetype="area")   # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)]
    .set_global_opts(
        title_opts=opts.TitleOpts(title="课程受欢迎程度分析"), # 标题
        toolbox_opts=opts.ToolboxOpts(),                                                     # 工具箱
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="10%", pos_left="80%")) #图例设置
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))  # 数据标签设置
    )
c.render_notebook()

任务 3.2

根据用户选择课程情况,构建用户和课程的关系表(二元矩阵),使用基于物品的协同过滤算法计算课程之间的相似度,并结合用户已选课程的记录,为总学习进度最高的 5 名用户推荐 3 门课程。

构建用户和课程的关系表(二元矩阵)

study_information['num'] =1

study_information4 = study_information[['user_id','course_id','num']]
study_information5 = study_information4.pivot(index='user_id',columns='course_id',values='num').fillna(0)
study_information5
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
course_id课程0课程1课程10课程100课程101课程102课程103课程104课程105课程106...课程9课程90课程91课程92课程93课程94课程95课程97课程98课程99
user_id
用户100.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户1000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户100000.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户100010.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户100020.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
..................................................................
用户99930.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户99940.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户99950.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户99960.00.00.00.01.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
用户99990.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0

40373 rows × 239 columns

物品的协同过滤算法

from sklearn.metrics import jaccard_score

items = study_information5.columns
from sklearn.metrics.pairwise import pairwise_distances
# 计算课程间相似度
course_similar = 1 - pairwise_distances(study_information5.T.values,metric="jaccard")
course_similar = pd.DataFrame(course_similar, columns=items, index=items)

course_similar
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
course_id课程0课程1课程10课程100课程101课程102课程103课程104课程105课程106...课程9课程90课程91课程92课程93课程94课程95课程97课程98课程99
course_id
课程01.0000000.5000000.0277780.4000000.0000000.6666671.0000001.0000000.2500000.000000...1.0000000.0000000.0000000.0000000.0000000.0019340.0086210.0055560.0034840.005291
课程10.5000001.0000000.0263160.2857140.0020620.4000000.5000000.5000000.1666670.000000...0.5000000.0000000.0000000.0000000.0000000.0019310.0084750.0110500.0052170.010526
课程100.0277780.0263161.0000000.0526320.0019380.0270270.0277780.0277780.0270270.002475...0.0277780.0000000.0000000.0285710.0000000.0318530.1718750.0862940.0322030.087805
课程1000.4000000.2857140.0526321.0000000.0020580.6000000.4000000.4000000.1428570.000000...0.4000000.0000000.0000000.0000000.0000000.0038650.0169490.0109890.0069570.015789
课程1010.0000000.0020620.0019380.0020581.0000000.0000000.0000000.0000000.0000000.000000...0.0000000.0000000.0000000.0020750.0000000.0140470.0033610.0216380.0677450.021341
..................................................................
课程940.0019340.0019310.0318530.0038650.0140470.0019320.0019340.0019340.0009650.120511...0.0019340.0009670.0000000.0009670.0009671.0000000.0922050.0349830.1452990.037351
课程950.0086210.0084750.1718750.0169490.0033610.0085470.0086210.0086210.0085470.000000...0.0086210.0086960.0000000.0000000.0000000.0922051.0000000.0769230.0632720.082143
课程970.0055560.0110500.0862940.0109890.0216380.0055250.0055560.0055560.0055250.001825...0.0055560.0055870.0000000.0055870.0000000.0349830.0769231.0000000.2613070.882051
课程980.0034840.0052170.0322030.0069570.0677450.0034780.0034840.0034840.0017360.040794...0.0034840.0017420.0017420.0000000.0017420.1452990.0632720.2613071.0000000.261589
课程990.0052910.0105260.0878050.0157890.0213410.0105820.0052910.0052910.0052630.001795...0.0052910.0053190.0000000.0053190.0000000.0373510.0821430.8820510.2615891.000000

239 rows × 239 columns

topN_items = {}
# 遍历每一行数据
for i in course_similar.index:
    # 取出每一列数据,并删除自身,然后排序数据
    _df = course_similar.loc[i].drop([i])
    _df_sorted = _df.sort_values(ascending=False)

    top2 = list(_df_sorted.index[:3])
    topN_items[i] = top2

topN_items = pd.DataFrame(topN_items,columns=items)
topN_items
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
course_id课程0课程1课程10课程100课程101课程102课程103课程104课程105课程106...课程9课程90课程91课程92课程93课程94课程95课程97课程98课程99
0课程41课程142课程140课程102课程71课程84课程0课程0课程0课程109...课程0课程205课程45课程30课程234课程117课程38课程99课程7课程97
1课程103课程0课程3课程208课程216课程0课程104课程103课程103课程124...课程103课程228课程44课程28课程233课程118课程161课程87课程6课程87
2课程104课程104课程2课程84课程236课程81课程81课程81课程104课程113...课程81课程230课程7课程88课程232课程167课程42课程85课程85课程85

3 rows × 239 columns

rs_results = {}
# 构建推荐结果
for user in study_information5.index:    # 遍历所有用户
    rs_result = set()
    for item in study_information5.loc[user].replace(0,np.nan).dropna().index:   # 取出每个用户当前已购物品列表
        # 根据每个物品找出最相似的TOP-N物品,构建初始推荐结果
        rs_result = rs_result.union(topN_items[item])
    # 过滤掉用户已购的物品
    rs_result = list(study_information5.loc[user].replace(0,np.nan).dropna().index)
    # 添加到结果中
    rs_results[user] = rs_result
    
rs_results1 = pd.DataFrame.from_dict([rs_results]) 
rs_results1
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
用户10用户100用户10000用户10001用户10002用户10003用户10004用户10005用户10006用户10007...用户9989用户999用户9990用户9991用户9992用户9993用户9994用户9995用户9996用户9999
0[课程143, 课程76][课程12][课程76][课程76][课程76][课程50, 课程52][课程76][课程76][课程76][课程188]...[课程76][课程174, 课程210][课程76][课程76][课程193][课程76][课程76][课程76][课程101, 课程12, 课程16, 课程216, 课程71][课程76]

1 rows × 40373 columns

为总学习进度最高的 5 名用户推荐 3 门课程

study_information['shichang'] = study_information['learn_process'].str.replace(r'[^0-9]', '')
study_information['shichang'] = pd.to_numeric(study_information['shichang'],errors='coerce')
study_information.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idcourse_idcourse_join_timelearn_processpricenumshichang
0用户3课程1062020-04-21 10:11:50width: 0%;0.010
1用户3课程1362020-03-05 11:44:36width: 1%;0.011
2用户3课程2052018-09-10 18:17:01width: 63%;0.0163
3用户4课程262020-03-31 10:52:51width: 0%;319.010
4用户4课程342020-03-31 10:52:49width: 0%;299.010
#study_information1 = study_information.groupby(by='user_id',as_index=False)['shichang'].mean()
study_information6 = study_information.groupby(by='user_id',as_index=False)['shichang'].sum()
study_information7 = study_information6.sort_values(by='shichang',ascending=False)

study_information7.head(5)
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
user_idshichang
1951用户11935238
3880用户138413942
23191用户326843291
27568用户369892960
15284用户249852951
user_tuijian = rs_results1[['用户1193','用户13841','用户32684','用户36989','用户24985']]
user_tuijian
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
用户1193用户13841用户32684用户36989用户24985
0[课程12, 课程130, 课程132, 课程133, 课程135, 课程141, 课程14...[课程12, 课程130, 课程132, 课程133, 课程135, 课程143, 课程14...[课程130, 课程132, 课程133, 课程134, 课程135, 课程141, 课程1...[课程130, 课程132, 课程133, 课程134, 课程135, 课程141, 课程1...[课程10, 课程130, 课程132, 课程133, 课程134, 课程135, 课程14...

任务 3.3

在任务 3.1 和任务 3.2 的基础上,结合用户学习进度数据,分析付费课程和免费课程的差异,给出线上课程的综合推荐策略。

study_information_shichang = study_information.groupby(by='course_id',as_index=False)['shichang'].mean()
study_information_shichang['shichang'] = study_information_shichang['shichang']/100
study_information_price = study_information.groupby(by='course_id',as_index=False)['price'].mean()
study_information_price2 = study_information_price.sort_values(by='price',ascending=True)
study_information_price2 = study_information_price2[study_information_price2['price']>0]
result = pd.merge(study_information_price2, study_information_shichang,on='course_id')
result = result.groupby(by='price',as_index=False)['shichang'].mean()
result.head()
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
priceshichang
029.00.081564
149.00.397283
259.00.053457
379.00.147661
499.00.111417
from pyecharts.globals import ThemeType
x_data = list(result['price'])
y_data = list(result['shichang'])

bar = (Bar()
    #init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))  # 设置主题
       .add_xaxis(x_data)
       .add_yaxis('学习进度', y_data)
        .set_colors(["#6C7C98"])  # 柱子的颜色
          #.reversal_axis()   # xy轴交换
       .set_global_opts(
            title_opts=opts.TitleOpts(title="课程价格与学习进度关系"),                         # 标题
            toolbox_opts=opts.ToolboxOpts(),                                                     # 工具箱
            datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=100)                         # 横轴缩放
        )
        .set_series_opts(
        # 为了不影响标记点,这里把标签关掉
        label_opts=opts.LabelOpts(is_show=False))
      )

bar.render_notebook()

请添加图片描述


数据分享链接:https://pan.baidu.com/s/1pKTbt24egIHO04rUFnNQ_w?pwd=djqi
提取码:djqi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SciencePub学术 | 网络通信类重点SCIEI征稿中

SciencePub学术 刊源推荐: 网络通信类重点SCI&EI征稿中&#xff01;稳定检索56年&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 网络通信类重点SCI&EI 【期刊简介】IF&#xff1a;1.0-1.5&#xff0c;JCR4区&#xff0c;中科院4区…

metasploit-framework(msf)——学习与实践

MSF是Metasploit Framework的缩写&#xff0c;是一款广泛使用的渗透测试工具&#xff0c;具有强大的攻击功能。它提供了一个模块化的平台&#xff0c;通过将各种攻击载荷、漏洞利用和辅助工具组装在一起&#xff0c;可用于模拟各种攻击&#xff0c;测试系统安全性&#xff0c;也…

【深度学习】日常笔记2

一直以来其实对调参这个词不太熟悉&#xff0c;后面知道了比如学习率就为超参数&#xff0c;是被调参的对象&#xff1a; ↑标量方程对向量的导数 大概就是↓ 在对矩阵求导时&#xff0c;我们需要使用矩阵微积分中的求导法则。对于一个标量函数 f(x)&#xff0c;它关于向量 x 的…

小程序项目—知识付费系统源码(多版本)

随着互联网的发展&#xff0c;知识付费成为了一种新的商业模式&#xff0c;越来越多的人开始通过知识付费来获取所需的知识和技能。为了更好地管理和运营知识付费系统&#xff0c;需要开发一个管理后台&#xff0c;本文将介绍知识付费系统管理后台的功能和实现。 产品介绍 &am…

云渲染对学生党有哪些好处和挑战?

云渲染是一种依托于云计算的云端服务&#xff0c;用户将本地任务提交到远程服务器&#xff0c;由远程的计算机集群资源进行运算操作&#xff0c;将上传的任务进行云端渲染后再返回本地。云渲染的优势是可以节省本地设备的性能和时间&#xff0c;提高渲染效率和质量。那么&#…

Flutter路由——Navigator2.0

Navigator 2.0提供了一系列全新的接口&#xff0c;可以实现将路由状态成为应用状态的一部分&#xff0c;新增的API如下&#xff1a; Page:用来表示Navigator路由栈中各个页面的不可变对象&#xff0c;Page是一个抽象类通常使用它的派生类&#xff1a;MaterialPage或CupertinoP…

Threejs进阶之十八:使用ExtrudeGeometry从二维图形创建三维几何体

目录 ExtrudeGeometry类构造函数options包含的参数 使用ExtrudeGeometry从二维图形创建三维图形的基本步骤1.创建二维图形2.创建轮廓线&#xff08;outline&#xff09;3.创建材质和网格对象补充内容&#xff1a;将拉伸图形生成为线框模式 上一节我们介绍了Threejs中二维图形相…

(转载)基于模拟退火算法的TSP问题求解(matlab实现)

1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成&am…

【6.08 代随_51day】 最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期1.方法图解步骤递归代码 买卖股票的最佳时机含手续费1.方法代码 最佳买卖股票时机含冷冻期 力扣连接&#xff1a;309. 最佳买卖股票时机含冷冻期&#xff08;中等&#xff09; 1.方法 1.具体…

【uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录】

uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录 前言一、实现思路1. 后端接口a. LoginByCodeb. LoginMpAlic. LoginMpWx 二、最终实现流程图1.流程图在这里插入图片描述 总结 前言 项目背景 : 项目是使用 uniapp 来实现的多端小程序 , 当前实…

LVS负载均衡群集部署——DR直接路由模式

这里写目录标题 一 、 LVS-DR 工作原理二、数据包流向分析三、LVS-DR 模式的特点四、ARP问题4.1 问题一&#xff1a;IP地址冲突4.2 问题二&#xff1a;第二次再有访问请求 五、部署LVS-DR集群5.1 配置Tomcat 多实例服务器5.2 配置web节点服务器配置web1节点服务器配置Nginx七层…

00后干一年跳槽就20K,测试老油条表示真怕被这个“卷王”干掉····

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

2023-06-05 stonedb-在聚合的场景查询为空无法执行case属性-问题分析-及定位问题的思路

目录 摘要: 查询SQL: 处理该问题的思路分析: 削减查询SQL的操作符 tianmu引擎的查询SQL innodb引擎的查询SQL mysql/sql和innodb执行分析: 执行过程的trace日志: 摘出一些涉及查询执行的部分 思路分析: mysql/sql层的核心处理: Item_func_case::fix_fields 调用堆…

【OpenCV DNN】Flask 视频监控目标检测教程 07

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 07 3.7 OpenCVFlask实时监控人脸识别cvFlask08 项目的文件树cvFlask08 项目的Python程序cvFlask08 项目的网页模板cvFlask08 项目的运行 本系列从零开始&#xff0c;详细…

2023上海国际嵌入式展 | 如何通过人工智能驱动的自动化测试工具提升嵌入式开发效率

2023年6月14日到16日&#xff0c;龙智将在2023上海国际嵌入式展&#xff08;embedded world China 2023&#xff09;A055展位亮相。同时&#xff0c;6月14日下午3:00-3:30&#xff0c;龙智资深DevSecOps顾问巫晓光将于创新技术及应用发展论坛第二论坛区&#xff08;A325展位&am…

idea代码检查插件

1&#xff0c;SonarLint Idea 安装 Sonar 插件提升代码质量_idea sonar插件_打代码的苏比特的博客-CSDN博客 2&#xff0c;immomo Mybatis XML Mapper SQL注入漏洞发现与一键修复-----项目静态代码安全审计idea插件工具MOMO CODE SEC INSPECTOR-Java_idea sql注入 插件_North…

【蓝桥刷题】备战国赛——交通信号

蓝桥杯2022国赛真题——交通信号 &#x1f680; 每日一题&#xff0c;冲刺国赛 &#x1f680; 题目导航&#xff1a; 交通信号 &#x1f387;思路&#xff1a; d i j k s t r a dijkstra dijkstra &#x1f531;思路分析&#xff1a; 要求从一点到另一点的最短距离&#xff0…

软件测试的生命周期、Bug

一、软件测试的生命周期 1、软件的生命周期&#xff1a; 需求分析&#xff1a;分析需求是否正确、完整。 设计&#xff1a;项目的上线时间、开始开发时间、测试时间、人员... 计划&#xff1a;设计技术文档、进行UI设计... 编码&#xff1a;写代码&#xff08;实现用户需求&am…

Tomcat启动闪退的详细解决方法(捕获的野生的java1.8.0_321和野生的Tomcat8实验)

1.实验说明 本实验将采用捕获的野生的java1.8.0_321和野生的Tomcat8进行实验。而且不需要安装服务。 2.配置声明&#xff1a; java -version javac -version CATALINA_HOME 说明&#xff1a;CATALINA_HOME配置到放置到tomcat的目录 Path 说明&#xff1a;Path路径配置到tomca…

如和使用matlab实现香农编码和解码

文章目录 前言效果截图如下代码解析完整代码完结 撒花 前言 在网上看了好多 , 都是对香农进行编码的案例 , 却没有 进行解码的操作 , 今天就来补齐这个欠缺 效果截图如下 代码解析 text 你好; % 待编码的文本定义一个字符串类型的变量text&#xff0c;其值为’你好’。 [en…