Pandas实战:电商平台用户分析

数据分析

1.行为概况

首先,我们要对用户的行为类型有一定的理解,了解每个行为所代表的含义。

  • 浏览:作为用户与商品接触的第一个行为,它的数量级与其他行为类型相比而言是非常庞大的,因为:

    • 用户购买之前需要货比三家,可能会浏览很多个商品最后只下单一个,此时就是多个浏览对应一个下单。

    • 但大部分用户可能只是浏览了很多商品,但最终没下单的,此时就是多个浏览对应零个下单。

  • 收藏:代表用户对商品有了一定程度的意向,但不一定有购买计划。

  • 加购物车:代表用户对商品的购买意向进一步加强,但由于某种原因还在犹豫没最终决定,这个环节的成单率极高。

  • 下单:代表交易达成,此时新用户已成为老用户,老用户继续产生价值。

  • 评论:代表用户对商品反馈的活跃程度。

需求1:对所有行为类型统计数量和占比

# 行为类型数量统计
ser_type_cnt = df['type_map'].value_counts()
# 行为类型数量占比
ser_type_pct = df['type_map'].value_counts(normalize=True)
# 合并
pd.concat([ser_type_cnt, ser_type_pct],axis=1).style.format("{:.2%}",subset=['proportion']).bar(subset='proportion')

图片

观察结果:

  • 浏览行为占75.66%,印证了我们前面对的浏览行为的理解。

  • 加购物车占14.65%,下单仅占了6.97%,可以推出一些权益活动,吸引客户下单,提高下单率。

  • 此外用户评论和收藏的占比也较低,分别占2.46%和1.16%,应增强与用户之间的互动,提高评论数量和收藏率。

2.流量指标分析

指标设计可以很好的帮助我们了解业务状况、发现业务问题和异常。比如,xx企业将日活用户数作为北极星指标,针对该指标向下拆解各种细分指标,然后对各种细分指标进行优化提升,从而最终提升北极星指标,业绩大幅提升。

下面针对该项目数据中的行为类型设计一些常用的流量指标,用来监控用户行为的流量变化,比如浏览总量、浏览人数、日均访问量、人均访问数、消费用户人均访问量、消费用户人均消费次数、复购率等等。

访问量指标

针对浏览行为可以统计出一段时间内的访问量大小,即流量有多少。下面对数据中全部用户计算访问量的指标。

  • pv(page view)总访问量:一段时间内全部访问量的总和

  • uv(user view)总访客数:一段时间内全部访客的总和,注意用户是单独的个体因此需要计算唯一值

  • pv_per_day 日均访问量:一段时间内平均每天的访问量

  • pv_per_user 人均访问量:每个用户的平均访问量

需求2:计算出以上所有用户的访问量指标

# 总访问量
pv = df[df['type_map'] == '浏览']['user_id'].count()
print('总访问量:{}'.format(pv))# 总访客数
uv = df['user_id'].nunique()
print('总访客数:{}'.format(uv))# 日均访问量
pv_per_day = pv / df['date'].nunique()
print('日均访问量:%.0f' %pv_per_day)# 人均访问量=总访问量/总访客数
pv_per_user = pv / uv
print('人均访问量:%.2f' %pv_per_user)
------
总访问量:2757485
总访客数:440373
日均访问量:393926
人均访问量:6.26

消费用户流量指标

以上是对全部用户的流量指标,如果我们想分析消费用户群体,可以针对消费用户设计相关的流量指标,比如有:

  • user_pay 消费用户数量:一段时间内有下单行为的总用户数量

  • pv_pay 消费用户总访问量:一段时间内所有消费用户的浏览数量总和

  • user_pay_rate 消费用户数占比:消费用户数占总用户数的比例

  • pv_per_buy_user 消费用户人均访问量:一段时间内每个消费用户浏览数量的均值

需求3:计算出以上消费用户的流量指标

# 消费用户的唯一id
user_pay = df[df['type_map'] == '下单']['user_id'].unique()
print('消费用户数量:{}'.format(len(user_pay)))# 消费用户的总访问量
pv_pay = df[df['user_id'].isin(user_pay)]['type_map'].value_counts()['浏览']
print('消费用户总访问量:{}'.format(pv_pay))# 消费用户数占比
user_pay_rate = len(user_pay) / uv
print('消费用户数占比:%.2f%%' %(user_pay_rate*100))# 消费用户人均访问量
pv_per_buy_user = pv_pay / len(user_pay)
print('消费用户人均访问量:%.2f' %pv_per_buy_user)# 消费用户人均消费次数
cnt_per_buy_user = df[df['type_map'] == '下单'].shape[0]/len(user_pay)
print('消费用户人均消费次数:%.2f' %cnt_per_buy_user)
------
消费用户数量:187549
消费用户总访问量:1400380
消费用户数占比:42.59%
消费用户人均访问量:7.47
消费用户人均消费次数:1.18

复购率

复购行为指的是一个客户的历史下单次数至少一次以上,即再第一次购买后,过了一段时间又有了第二次、第三次购买行为。

需求5:计算出下单次数一次以上的客户占总下单人数比例

注意:这里的复购逻辑是以人为维度,可以包括不同sku商品的下单,只要该用户总下单次数>1就算复购。因此我们对下单的用户分组统计总下单次数,然后筛选出下单次数>1的客户占总下单客户数的比例。

# 每个用户消费总次数
df_pay_num = df[df['type_map']=='下单'].groupby(['user_id'])['type'].count().to_frame(name='num')
# 消费次数>=2的客户数
repay_num = df_pay_num[df_pay_num['num']>1].shape[0]
# 消费总客户数
total_pay_num = df_pay_num.shape[0]
# 复购率
repay_rate =round(repay_num/total_pay_num,4)
print('用户维度的复购率:%.2f%%' %(repay_rate*100))
------
用户维度的复购率:11.55%

对于用户维度的复购率而言,11.55%是比较低的,有很大的提升空间。可以联合运营部门设计一些权益活动吸引老客下单,提升复购率。

需求6:计算出每个商品下单次数一次以上的客户占该商品总下单人数比例

以上的复购率口径是人的维度,只要在电商平台下单次数大于1次就算复购。如果我们从商品的角度出发,也可以分析每个商品的复购率。

# 对用户和商品id分组统计下单的次数
df_sku_user_pay = df[df['type_map']=='下单'].groupby(['sku_id','user_id'], as_index=False)['type'].count()
df_sku_user_pay.head()

图片

# 筛选每个商品下用户下单次数大于1的
df_sku_user_repay = df_sku_user_pay[df_sku_user_pay['type']>1]
df_sku_user_repay.head()

图片

# 对商品分组统计下单次数大于1的客户数
df_sku_repay_cnt = df_sku_user_repay.groupby(['sku_id'], as_index=False)['user_id'].count().sort_values(by='user_id',ascending=False)
# 对商品分组统计下单的总客户数
df_sku_pay_cnt = df.groupby(['sku_id'], as_index=False)['type'].count()
# 商品无复购客户的填充为0,计算复购率,按复购数量倒序排序
df_sku_repay_rate = (pd.merge(df_sku_pay_cnt,df_sku_repay_cnt, on='sku_id', how='left').fillna(0).rename(columns={'type':'pay_cnt','user_id':'repay_cnt'}).assign(repay_rate=lambda x:x['repay_cnt']/x['pay_cnt']).sort_values(by='repay_cnt',ascending=False))
df_sku_repay_rate.head(10)

图片

以上就得到了每个sku商品的复购率。下面通过可视化看下复购率大于0的分布状况,是明显的有偏分布,大多数sku的复购率都在10%以内,极少数高比如50%是因为总下单数量小,没有统计意义。

plt.subplots(figsize=(15, 5))
df_sku_repay_rate.loc[df_sku_repay_rate['repay_rate']>0,'repay_rate'].hist(bins=50)
plt.show()

图片

sku_repay_avg = df_sku_repay_rate.loc[df_sku_repay_rate['repay_rate']>0,'repay_rate'].mean()
sku_repay_med = df_sku_repay_rate.loc[df_sku_repay_rate['repay_rate']>0,'repay_rate'].median()
sku_repay_max = df_sku_repay_rate.loc[df_sku_repay_rate['repay_cnt']>0,'repay_rate'].max()
print('sku商品复购率大于0的均值:%.2f%%' %(sku_repay_avg*100))
print('sku商品复购率大于0的中位数:%.2f%%' %(sku_repay_med*100))
print('sku商品复购率的最大值:%.2f%%' %(sku_repay_max*100))
------
sku商品复购率大于0的均值:3.82%
sku商品复购率大于0的中位数:1.61%
sku商品复购率的最大值:50.00%

3.转化漏斗分析

浏览->收藏->加购物车->下单->评论,是一个用户从了解商品->交易产品->熟悉产品的过程。在这个过程中,由于每一个转化环节都会有一定流量的损失,因此流量最终会形成一个漏斗。

比如有10个用户浏览了商品,但最后加入购物车或者下单的只有7个,其他3个只是看看并没有后续行为,那么此时浏览到下单的转化率就是70%,其他环节的转化漏斗也是同理。

清楚地了解各环节转化率后,有助于我们发现薄弱环节并进行优化。同样地,各环节转化率也可以作为我们关注的指标,并按周期进行监测。

需求7:计算用户从浏览到下单的转化率及漏斗可视化

# 筛选用户的浏览数据
df_pv = df[df['type_map']=='浏览']
# 筛选客户的下单数据
df_pay = df[df['type_map']=='下单']cols = ['user_id','sku_id','action_time','type_map']
# 将用户浏览和下单行为进行匹配
df_pv_pay = pd.merge(df_pv[cols], df_pay[cols], on=['user_id','sku_id'], how='inner', suffixes=('_pv', '_pay'))
df_pv_pay.head()

图片

以上通过内连接将同用户同商品下存在浏览和下单行为的匹配出来。

但此时的数据还不能直接统计使用,仍需要两个关键的步骤。

第一个是,因为浏览到下单是有先后顺序的,我们的条件是下单时间一定要晚于浏览时间,因此这里我们对这个时间进一步筛选。

# 筛选下单时间在浏览时间之后的数据
t_0 = df_pv_pay.shape[0]
df_pv_pay = df_pv_pay[df_pv_pay['action_time_pay'] > df_pv_pay['action_time_pv']]
t_1 = df_pv_pay.shape[0]
print('时间筛选前数量 %.0f'%t_0)
print('时间筛选后数量 %.0f'%t_1)
print('时间筛选后减少数量 %.0f'%(t_0-t_1))
------
时间筛选前数量 300673
时间筛选后数量 215070
时间筛选后减少数量 85603

第二个是,用户在下单一个商品之前可能有不止一次的浏览,即多个浏览对应一个下单,同理也存在一个浏览对应多个下单记录的情况(如下图所示)。

要分析从浏览到下单的转化率,我们需要以用户+商品的维度考虑,即对于同一用户同一商品下的多重行为记录要进行去重处理。举例说就是,同用户用商品下不论有多少次浏览行为,只要下单了那么都算作为一个转化,不应算作多个。

图片

基于以上去重逻辑,我们使用groupby对同用户同商品的重复行为进行去重。

pv_pay_dict= {}
# 去重后的浏览用户数
pv_cnt = df_pv.groupby(['user_id','sku_id'])['type_map'].count().shape[0]
# 去重后的下单用户数
pay_cnt = df_pv_pay.groupby(['user_id','sku_id'])['type_map_pv'].count().shape[0]pv_pay_rate = round(pay_cnt*100/pv_cnt,4)
pv_pay_dict['浏览'] = 100
pv_pay_dict['下单'] = pv_pay_rate
print('浏览用户数 %.0f'%pv_cnt)
print('浏览到下单的用户数 %.0f'%pay_cnt)
print('浏览->下单转化率 %.2f%%'%pv_pay_rate)
------
浏览用户数 2228233
浏览到下单的用户数 162772
浏览->下单转化率 7.30%

从浏览到下单的转化率仅为7.3%,还有很大的优化空间。

接下来,我们使用pyecharts第三方包漏斗可视化。

from pyecharts import options as opts
from pyecharts.charts import Funnel
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LABpv_pay=(Funnel(opts.InitOpts(width="600px", height="300px")).add(series_name="",data_pair=[[k,v] for  k,v in pv_pay_dict.items()],tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%"),label_opts=opts.LabelOpts(is_show=True, position="inside"),itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1)))
pv_pay.load_javascript()
pv_pay.render_notebook()

图片

需求8:计算用户从浏览->加购物车->下单的转化率及漏斗可视化

多了一个环节,但分析过程与上面一样。

首先我们分别对浏览和加购物车、加购物车和下单做内连接的匹配。

这里注意一下:因为两次都是内连接,这意味着最终下单的客户一定是有浏览->加购物车->下单的行为轨迹的。但实际业务场景中,有的用户从浏览直接下单而不加入购物车,所以这种直接下单的用户群是没有包含在内的。

# 筛选用户的加购物车数据
df_cart = df[df['type_map']=='加购物车']
# 浏览用户与加购物车匹配
df_pv_cart = pd.merge(df_pv[cols], df_cart[cols], on=['user_id','sku_id'], how='inner', suffixes=('_pv', '_cart'))
# 加购物车用户与下单匹配
df_cart_pay = pd.merge(df_cart[cols], df_pay[cols], on=['user_id','sku_id'], how='inner', suffixes=('_cart', '_pay'))
# 加购物车用户与下单匹配
df_pv_cart_pay = pd.merge(df_pv_cart, df_cart_pay, on=['user_id','sku_id','action_time_cart','type_map_cart'], how='inner')

同样按照行为时间顺序进一步筛选。

# 加购物车时间大于浏览时间
t_0 = df_pv_cart.shape[0]
df_pv_cart = df_pv_cart[df_pv_cart['action_time_cart'] > df_pv_cart['action_time_pv']]
t_1 = df_pv_cart.shape[0]
print('时间筛选前数量 %.0f'%t_0)
print('时间筛选后数量 %.0f'%t_1)
print('时间筛选后减少数量 %.0f'%(t_0-t_1))
------
时间筛选前数量 895540
时间筛选后数量 569174
时间筛选后减少数量 326366# 下单时间大于加购物车时间
t_0 = df_cart_pay.shape[0]
df_cart_pay = df_cart_pay[df_cart_pay['action_time_pay'] > df_cart_pay['action_time_cart']]
t_1 = df_cart_pay.shape[0]
print('时间筛选前数量 %.0f'%t_0)
print('时间筛选后数量 %.0f'%t_1)
print('时间筛选后减少数量 %.0f'%(t_0-t_1))
------
时间筛选前数量 196214
时间筛选后数量 182881
时间筛选后减少数量 13333

然后使用groupby对同用户同商品的重复行为进行去重。

pv_pay_cart_dict= {}
# 去重后浏览客户数
pv_cnt = df_pv.groupby(['user_id','sku_id'])['type_map'].count().shape[0]
# 去重后加购物车用户数
cart_cnt = df_pv_cart.groupby(['user_id','sku_id'])['type_map_pv'].count().shape[0]
# 去重后下单用户数
pay_cnt = df_cart_pay.groupby(['user_id','sku_id'])['type_map_cart'].count().shape[0]
# 浏览到加购物车转化率
pv_cart_rate = round(cart_cnt*100/pv_cnt,4)
# 浏览到加购物车到下单的转化率
pv_cart_pay_rate = round(pay_cnt*100/pv_cnt,4)
# 加购物车到下单的转化率
cart_pay_rate = round(pay_cnt*100/cart_cnt,4)pv_pay_cart_dict['浏览'] = 100
pv_pay_cart_dict['加购物车'] = pv_cart_rate
pv_pay_cart_dict['下单'] = cart_pay_rate
print('浏览用户数 %.0f'%pv_cnt)
print('加购物车用户数 %.0f'%cart_cnt)
print('下单的用户数 %.0f'%pay_cnt)
print('浏览->加购物车转化率 %.2f%%'%pv_cart_rate)
print('浏览->加购物车->下单转化率 %.2f%%'%pv_cart_pay_rate)
print('加购物车->下单转化率 %.2f%%'%cart_pay_rate)
------
浏览用户数 2228233
加购物车用户数 354064
下单的用户数 137195
浏览->加购物车转化率 15.89%
浏览->加购物车->下单转化率 6.16%
加购物车->下单转化率 38.75%

同样用pyecharts进行漏斗可视化。

pv_cart_pay=(Funnel(opts.InitOpts(width="600px", height="400px")).add(series_name="",sort_='none',data_pair=[[k,v] for  k,v in pv_pay_cart_dict.items()],tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%")))
pv_cart_pay.render_notebook()

图片

我们观察到,需求7中得到的转化率为7.3%,而需求8中得到的转化率为6.16%,同样都是从浏览到下单的转化,为什么结果却是不一样的呢?

这是因为,加购物车与下单并不是一种包含关系,而是一种相交的关系。二者的关系有以下三种情况(如下图)。

  • 用户将商品加入购物车然后下单

  • 用户没有加购物车直接下单

  • 用户加入购物车但最后没下单

所以,需求7中的转化率更大,因为从浏览直接到下单,既包括了加购物车后下单也包括了直接下单;而需求8中的转化是从浏览,到加购物车,再到下单,是包含在需求7内的,所以转化率小。

图片

4.消费时长分析

用户从浏览到下单的过程中,可能会有不同的路径,比如,浏览->下单,浏览->加购物车->下单,浏览->收藏->加购物车->下单。

不同的行为路径可能有不同的特性,比如消费时长。

为了更深入研究用户行为,下面我们分析不同路径用户的消费时长,即用户从浏览开始到下单之前所用的总时长,并统计时长的分布。

需求9:统计浏览->加购物车->下单的用户消费时长分布,并进行分布可视化

需求8中我们将浏览->加购物车->下单行为进行了内连接,下面对用户和商品进行分组统计浏览与下单的时间差。其中浏览时间筛选最早浏览时间,代表第一次接触商品,下单时间筛选最早的下单时间,代表浏览和加购物车后最近的下单。

pcp_interval = (df_pv_cart_pay.groupby(['user_id', 'sku_id'],as_index=False).apply(lambda x: (x.action_time_pay.min() - x.action_time_pv.min())).rename(columns={None:'interval'}))

图片

以上我们得到了下单与浏览行为的时间间隔,但此时的interval变量是timedelta时间差类型,我们需要进一步转化成数值类型。

# 获取时间差成分,筛选小时数
pcp_interval['interval'] = pcp_interval['interval'].dt.components['hours']

这是使用了components方法将时间差分解,并最终转换为0-24小时的小时数值。最后使用seaborn对时间间隔进行了分布可视化。

# 时间间隔分布可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.countplot(x='interval', data=pcp_interval, palette='Set1')
# 消费时长分布占比的注释
for p in ax.patches:ax.annotate('{:.2f}%'.format(100*p.get_height()/len(pcp_interval['interval'])), (p.get_x() + 0.1, p.get_height() + 100))
ax.set_yscale("log")
plt.title('消费时间间隔')

图片

通过分布结果来看,大部分用户在一个小时内完成了商品下单,大部分用户的消费意愿比较明确。

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

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

相关文章

Python与ArcGIS系列(十四)批量输出shp(自定义工具)

目录 0 简述1 批量保存当前工作空间的所有图层shp2 批量保存mdb的所有图层shp0 简述 在处理gis数据的时候,会遇到这种情况:需要将n个mdb文件内的所有图层全部保存成shp格式,或者,将当前工作空间加载的所有图层批量输出shp。这时候如果我们手动一个个去保存就十分麻烦,通过…

ElasticSearch之Create index API

创建指定名称的index。 命令样例如下: curl -X PUT "https://localhost:9200/testindex_002?pretty" -H Content-Type: application/json -d {"settings": {"index": {"number_of_shards": 3,"number_of_replicas&…

Spring-Boot---项目创建和使用

文章目录 什么是Spring-Boot?Spring-Boot项目的创建使用Idea创建使用网页创建 项目目录介绍项目启动 什么是Spring-Boot? Spring的诞生是为了简化Java程序开发的;而Spring-Boot的诞生是为了简化Spring程序开发的。 Spring-Boot具有很多优点…

实验4 在线等价类(并查集)

0x01 实验目的 掌握在线等价类的使用,要求使用模拟指针实现。 0x02 实验内容 使用模拟指针实现本实验。输入一个1-9的正整数n,代表要创建n个元素,例如输入5,则代表创建一个1,2,3,4,5组成的元素表。再输入一个大于0正整数r&…

【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享

系列文章目录 分享一些fpga内使用riscv软核的经验,共大家参考。后续内容比较多,会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 前言 在efinix fpga中使用riscv是一…

算法基础--双指针

前面已经写了两篇关于算法方面的文章,这几天想了下,决定把这个算法整理成一个系列,除了是帮助自己巩固算法知识外,还能够把自己总结的每种算法的套路保存下来并分享给大家,这样以后即使是哪天想要重拾起来,…

实验六 单脉冲触发中断实验(汇编与微机原理)

实验目的: 掌握可编程中断控制器8259一般的使用方法。 掌握8259初始化的编程方法及中断服务程序的编写方法,中断程序的调试方法。 实验内容: 用单脉冲按钮的正脉冲输出作为中断控制器8259的中断源产生中断请求,在中断服务程序…

Doris数据备份及恢复

Doris 支持将当前数据以文件的形式,通过 broker 备份到远端存储系统中。之后可以通过 恢复 命令,从远端存储系统中将数据恢复到任意 Doris 集群。通过这个功能,Doris 可以支持将数据定期的进行快照备份。也可以通过这个功能,在不同集群间进行数据迁移。 该功能需要 Doris 版…

【多传感器融合】BEVFusion: 多任务-多传感器融合框架 ICRA 2023

前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation ICRA 2023 | MIT提出 本文分享MIT这…

SCAU:字母分类统计

字母分类统计 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC;VC 描述 输入一行以换行符结束的字符,统计并输出其中英文字母、数字、空格和其它字符的个数。输入格式 一行字符,以换行符结束输出格式 一行4个数字分别为&#…

持续集成部署-k8s-高级调度-亲和力

持续集成部署-k8s-高级调度-亲和力 1. 亲和力的基本概念2. 亲和性和非亲和性3. 节点亲和力的使用4. 节点亲和性权重5. 验证节点亲和性6. Pod 间亲和性与反亲和性7. Pod 间亲和性与反亲和性的类型8. 调度一组具有 Pod 间亲和性的 Pod9. 验证 Pod 亲和性 1. 亲和力的基本概念 在…

prometheus基础,结合node_exporter监控节点

文章目录 一、Prometheus是什么二、exporters是什么三、node_exporter四、安装 Prometheus 和 node_exporter下载运行 prometheus运行 node_exporter 五、配置 Prometheus 收集监控数据总结 一、Prometheus是什么 Prometheus 是一个开源的监控和警报工具,它记录任何…

Centos7安装docker、java、python环境

文章目录 前言一、docker的安装二、docker-compose的安装三、安装python3和配置pip3配置python软链接(关键) 四、Centos 7.6操作系统安装JAVA环境 前言 每次vps安装docker都要看网上的文章,而且都非常坑,方法千奇百怪&#xff0c…

c++ 构造

#include <iostream> using namespace std; class Coordinate { public: // 无参构造函数 // 如果创建一个类你没有写任何构造函数&#xff0c;则系统自动生成默认的构造函数&#xff0c;函数为空&#xff0c;什么都不干 // 如果自己显示定义了一…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

对象转成json后转成byte[]后在转成string会提示序列化失败,第一个字符是问号

问题复现 一个对象需要转成json 后转成byte[]后经过网络传输&#xff0c;后再次反序列化为对象&#xff0c;但是最后反序列的时候会报错&#xff0c;打印json发现开头是一个问号 省流 使用这个进行反序列化 /// <summary>/// 反序列化方法/// </summary>/// <…

Java 中如何正确的将 float 转换成 double?

为什么 double 转 float 不会出现数据误差&#xff0c;而 float 转 double 却误差如此之大&#xff1f; double d 3.14; float f (float)d; System.out.println(f);输出结果是:3.14; float f 127.1f; double d f; System.out.println(d);输出结果是&#xff1a;127.09999…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…

【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应

运动物体的微多普勒效应为人体动作识别提供了可能&#xff0c;基于雷达的居家检测具有良好的隐私保护性&#xff0c;且不易受环境因素影响&#xff08;如光照、温度等&#xff09;&#xff0c;近年来已受到国内外学者的广泛关注。由于雷达信号的非平稳特性&#xff0c;通过短时…

Oracle-CDB容器数据库修改service_names踩坑

前言: 最近在对一套Oracle容器数据库进行迁移测试时&#xff0c;为了保持新环境与旧环境的服务名一致&#xff0c;需要在新环境添加旧环境的服务名&#xff0c;在CDB的根容器通过service_name参数添加旧环境的服务名之后&#xff0c;发现数据库PDB的服务名全部被注销&#xff0…