当前位置: 首页 > news >正文

数据分析实战 - 2 订单销售数据分析(pandas 进阶)

题目来源:和鲸社区的题目推荐:

刷题源链接(用于直接fork运行
https://www.heywhale.com/mw/project/6527b5560259478972ea87ed

刷题准备

请依次运行这部分的代码(下方4个代码块),完成刷题前的数据准备

数据准备:
链接:https://pan.baidu.com/s/1F7iyHys1edRaOTR0LzxiYQ?pwd=m1ve
提取码:m1ve
–来自百度网盘超级会员V4的分享

导包及读取数据

import pandas as pd
# 如遇到OSerror,可以稍等十几秒,等待数据加载完成即可读取df = pd.read_csv("./data/order.csv")
df.head()
订单日期年份订单数量产品ID客户ID交易类型销售区域ID销售大区国家区域产品类别产品型号名称产品名称产品成本利润单价销售金额
02016/1/12016152814432BA14西南区中国大中华区配件Rawlings Heart of THE Hide-11.5棒球手套500.01199.01699.01699.0
12016/1/22016152818741BA14西南区中国大中华区配件Rawlings Heart of THE Hide-11.5棒球手套500.01199.01699.01699.0
22016/1/22016152827988BA14西南区中国大中华区配件Rawlings Heart of THE Hide-11.5棒球手套500.01199.01699.01699.0
32016/1/52016152825710BA14西南区中国大中华区配件Rawlings Heart of THE Hide-11.5棒球手套500.01199.01699.01699.0
42016/1/62016152814999BA14西南区中国大中华区配件Rawlings Heart of THE Hide-11.5棒球手套500.01199.01699.01699.0

数据预处理

# 删除重复值
# df.drop_duplicates(inplace=True)
df.drop_duplicates(inplace = True)
# 查看数据信息
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 60391 entries, 0 to 60397
Data columns (total 17 columns):#   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  0   订单日期    60391 non-null  object 1   年份      60391 non-null  int64  2   订单数量    60391 non-null  int64  3   产品ID    60391 non-null  int64  4   客户ID    60391 non-null  object 5   交易类型    60391 non-null  int64  6   销售区域ID  60391 non-null  int64  7   销售大区    60391 non-null  object 8   国家      60391 non-null  object 9   区域      60391 non-null  object 10  产品类别    60391 non-null  object 11  产品型号名称  60391 non-null  object 12  产品名称    60391 non-null  object 13  产品成本    60391 non-null  float6414  利润      60391 non-null  float6415  单价      60391 non-null  float6416  销售金额    60391 non-null  float64
dtypes: float64(4), int64(5), object(8)
memory usage: 8.3+ MB

数据集中无缺失值,因此不需要进行缺失值处理

开始刷题

任务1

主管想了解 2013-2016 年各年份的总销售额情况,需要你统计各年份的销售金额,并依据年份降序输出各年的总销售额。

# 你的代码# 观察年份
df['年份'].unique() # array([2016, 2015, 2014, 2013])
# 直接根据年份根据销售金额统计总销售额
gmv_by_year = df.groupby(by = ['年份'])['销售金额'].sum().reset_index().sort_values(by = ['年份'],ascending = False)
gmv_by_year
年份销售金额
3201622390338.42
2201516063868.36
12014182951.85
02013106308.27

任务2

主管想了解在 2013-2016 年各月份的订单数量都有多少?

需要你新增一列数据记录每笔订单的购买年份及月份信息,其值需从订单日期中拆分出来,之后再统计各月份的订单数量并输出订单数量最多的月份,同时并分析订单数量的时间变化趋势。

思考:订单数量是否可以直接使用sum()方法直接统计? 回答:订单数量只有1,意味着是每一单一行数据,sum()会漏掉空值,如果存在的空值的话,单纯计数使用size()会更好一些。

df['订单数量'].unique()
array([1], dtype=int64)
# 你的代码# 抽取月份信息
df['月份'] = pd.to_datetime(df['订单日期']).dt.strftime("%m")
# 分年分月汇总数据
gmv_by_month = df.groupby(by = ['年份','月份'])['销售金额'].size().reset_index().sort_values(by = ['年份'],ascending = False)
gmv_by_month.columns = ['年份','月份','订单数量']
gmv_by_month.head()
年份月份订单数量
362016072209
352016065544
342016055515
332016045088
322016034706
# 使用idxmax()找到订单数量最多的行
max_order_index = gmv_by_month['订单数量'].idxmax() 
# 根据上一步找到的索引,使用loc定位这一行
max_order_row = gmv_by_month.loc[max_order_index]
# 输出结果
print(f"订单数量最多的年月为{max_order_row['年份']}-{max_order_row['月份']},订单数量为{max_order_row['订单数量']}")
订单数量最多的年月为2016-06,订单数量为5544

任务3*

主管想了解 2016 年各个国家的订单数量、销售额及利润详情;

需要你统计在 2016年间各国的订单数量、销售额及利润并依据年份输出结果。

# 你的代码
# 指定年份,分国家的订单数量汇总,销售额求和,利润求和
country_2016 = df[df['年份']==2016].groupby(by = ['国家'])['订单数量','销售金额','利润'].sum().reset_index()
country_2016
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\3368580504.py:3: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.country_2016 = df[df['年份']==2016].groupby(by = ['国家'])['订单数量','销售金额','利润'].sum().reset_index()
国家订单数量销售金额利润
0中国116318127428.303525236.48
1中国台湾35792361700.11969703.64
2中国澳门67574361739.641783523.75
3中国香港30611976666.78803100.02
4新加坡29752083231.41838558.78
5韩国42603479572.181538321.46

任务4*

主管想了解在 2013-2016 年间哪些产品所带来的利润最高;

需要你统计不同产品(产品名称)的订单数量,并根据该产品所属类别(产品类别)分别输出不同类别产品订单数量最多的前 3 种产品。

# 你的代码
# 根据产品类别,产品名称分组,汇总订单数量。根据订单数量降序取前三
goods_grouped = df.groupby(by = ['产品类别','产品名称'])['订单数量'].sum().reset_index()
goods_grouped
产品类别产品名称订单数量
0服装击打手套1430
1服装帽子2190
2服装捕手护具562
3服装棒球服3332
4服装皮带1019
5服装袜子568
6垒球2167
7硬式棒球8068
8软式棒球4970
9配件三角网架2121
10配件垒垫908
11配件头盔6439
12配件打击T座249
13配件棒球手套17327
14配件球棒与球棒袋7980
15配件球网328
16配件装备包733
# 接着获取每个产品类别的前三订单数量的产品# 已产品类别继续分组,直接在分组的结果上应用nlargest()
goods_top3 = goods_grouped.groupby(by = ['产品类别']).apply(lambda x:x.nlargest(3,'订单数量')).reset_index(drop = True)
goods_top3
产品类别产品名称订单数量
0服装棒球服3332
1服装帽子2190
2服装击打手套1430
3硬式棒球8068
4软式棒球4970
5垒球2167
6配件棒球手套17327
7配件球棒与球棒袋7980
8配件头盔6439

说明:

1:apply函数中的x在此处代表dataframe的每个分组

2:nlargest()使用方法举例:

df.nlargest(3, '订单数量')  df['订单数量'].nlargest(3)  

任务5 (方法一:直接写逻辑,重点理解apply的用法)

主管想了解在面向中国的订单中,各月份的订单数量以及利润是怎样的情况;

需要你统计面向中国的各月份订单数量及利润,并同时输出这个订单数量和利润的同比增长及环比增长。

# 你的代码
# 筛选中国的数据,按月汇总订单数量及利润
china_describe = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
china_describe.head() # 观察数据
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\3318811943.py:3: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.china_describe = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
年份月份订单数量利润
0201307411710.0
1201308431890.0
2201309502160.0
3201310562380.0
4201311602640.0
china_describe
年份月份订单数量利润
0201307411710.00
1201308431890.00
2201309502160.00
3201310562380.00
4201311602640.00
5201312913930.00
6201401672810.00
7201402341300.00
8201403733170.00
9201404763220.00
10201405933850.00
11201406823580.00
12201407961857.00
13201408981942.00
1420140950976.00
1520141048927.00
16201411581200.00
17201412861800.00
18201501611220.00
19201502621215.00
20201503511050.00
21201504721418.00
22201505932017.00
23201506861802.00
2420150744090558.85
252015081369461863.99
262015091309396373.18
272015101504509619.29
282015111543528140.77
292015121921568262.25
302016011580486949.53
312016021653506787.84
322016031686491470.15
332016041800541664.95
342016052104598067.76
352016061988569919.58
36201607820330376.67
df[:1]['订单数量']
0    1
Name: 订单数量, dtype: int64
df[:1]['订单数量'].values
array([1], dtype=int64)
df[:1]['订单数量'].values[0]
1
# 计算上述两个维度的同比增长以及环比增长
def calculate_yoy(row, column_name):"""它需要当前行和列名称作为参数,并查找去年同月的数据。如果找到了去年的数据,它将计算增长率;否则返回 None。"""last_year = china_describe[(china_describe['年份'] == row['年份'] - 1) & (china_describe['月份'] == row['月份'])]if last_year.empty:return Nonereturn (row[column_name] - last_year[column_name].values[0]) / last_year[column_name].values[0] * 100def calculate_mom(row, column_name):last_month_year = row['年份']if row['月份'] == '01':last_month_month = '12'last_month_year -= 1else:last_month_month = str(int(row['月份']) - 1).zfill(2) # zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。last_month = china_describe[(china_describe['年份'] == last_month_year) & (china_describe['月份'] == last_month_month)]if last_month.empty:return Nonereturn (row[column_name] - last_month[column_name].values[0]) / last_month[column_name].values[0] * 100china_describe['订单数量同比'] = china_describe.apply(lambda row: calculate_yoy(row, '订单数量'), axis=1)
china_describe['订单数量环比'] = china_describe.apply(lambda row: calculate_mom(row, '订单数量'), axis=1)
china_describe['利润同比'] = china_describe.apply(lambda row: calculate_yoy(row, '利润'), axis=1)
china_describe['利润环比'] = china_describe.apply(lambda row: calculate_mom(row, '利润'), axis=1)
china_describe
年份月份订单数量利润订单数量同比订单数量环比利润同比利润环比
0201307411710.00NaNNaNNaNNaN
1201308431890.00NaN4.878049NaN10.526316
2201309502160.00NaN16.279070NaN14.285714
3201310562380.00NaN12.000000NaN10.185185
4201311602640.00NaN7.142857NaN10.924370
5201312913930.00NaN51.666667NaN48.863636
6201401672810.00NaN-26.373626NaN-28.498728
7201402341300.00NaN-49.253731NaN-53.736655
8201403733170.00NaN114.705882NaN143.846154
9201404763220.00NaN4.109589NaN1.577287
10201405933850.00NaN22.368421NaN19.565217
11201406823580.00NaN-11.827957NaN-7.012987
12201407961857.00134.14634117.0731718.596491-48.128492
13201408981942.00127.9069772.0833332.7513234.577275
1420140950976.000.000000-48.979592-54.814815-49.742533
1520141048927.00-14.285714-4.000000-61.050420-5.020492
16201411581200.00-3.33333320.833333-54.54545529.449838
17201412861800.00-5.49450548.275862-54.19847350.000000
18201501611220.00-8.955224-29.069767-56.583630-32.222222
19201502621215.0082.3529411.639344-6.538462-0.409836
20201503511050.00-30.136986-17.741935-66.876972-13.580247
21201504721418.00-5.26315841.176471-55.96273335.047619
22201505932017.000.00000029.166667-47.61039042.242595
23201506861802.004.878049-7.526882-49.664804-10.659395
2420150744090558.85358.333333411.6279074776.6208944925.463374
252015081369461863.991296.938776211.13636423682.903708410.015299
262015091309396373.182518.000000-4.38276140512.006148-14.179674
272015101504509619.293033.33333314.89686854875.11219028.570578
282015111543528140.772560.3448282.59308543911.7308333.634376
292015121921568262.252133.72093024.49773231470.1250007.596740
302016011580486949.532490.163934-17.75117139813.895902-14.309013
312016021653506787.842566.1290324.62025341610.9333334.073997
322016031686491470.153205.8823531.99637046706.680952-3.022505
332016041800541664.952400.0000006.76156638099.22073310.213194
342016052104598067.762162.36559116.88888929551.35151210.412859
352016061988569919.582211.627907-5.51330831527.057714-4.706520
36201607820330376.6786.363636-58.752515264.819860-42.031002

提问:为什么上述计算中取值要使用.values[0]取值呢?

回答:# 因为使用apply对每一行数据进行计算,得到的去年数据也是一行,不能使用df[column_name][index]这种方式取值。

索引过程示例:

df[:1]['订单数量']  '''  
output:  
0    1  
Name: 订单数量, dtype: int64  
'''  df[:1]['订单数量'].values   # output : array([1])  df[:1]['订单数量'].values[0] # output : 1  ;正确的取值方式  

提问:apply函数应用在DataFrame的行或列中,也可以应用到单独一个Series的每个元素中,我如何判断此处是针对行还是列,还是行的某个值?

回答:当您在 pandas 中使用 apply 函数,是否应用于行还是列主要取决于参数 axis 的值。

  • axis=0 或者不指定 axis:函数会应用于每一列,即针对列进行操作。
  • axis=1:函数会应用于每一行,即针对行进行操作。

在我们之前的代码中:

df['订单数量同比'] = df.apply(lambda row: calculate_yoy_corrected(row, '订单数量'), axis=1)  

我们指定了 axis=1,这意味着 apply 函数将 lambda 函数应用于数据帧的每一行。lambda 函数会将整行数据(即当前行的所有列值)作为参数传递给 calculate_yoy_corrected 函数,这就是为什么我们可以在 calculate_yoy_corrected 函数内部访问行的 ‘年份’ 和 ‘月份’ 列的值。

如果您将 apply 函数应用于一个 Series,那么该函数会应用于 Series 的每个元素。例如:

df['年份'].apply(lambda x: x + 1)  

上述代码会将每个 ‘年份’ 值加 1。

总之,要确定 apply 是应用于行还是列,您可以查看 axis 参数的值。如果 apply 是直接应用于一个 Series,那么它会应用于该 Series 的每个元素。

提问2:lambda函数在处理数据的时候一行一行读取,但是计算是根据整体的数据计算的吗,因为涉及环比同比计算不可能只根据一行数据计算

您是对的。当 apply 函数与 lambda 函数一起使用并设置为 axis=1 时,lambda 函数确实会逐行处理数据。但是,当我们在 lambda 函数内部调用其他函数(如 calculate_yoycalculate_mom)时,那些函数可以访问并使用整个数据框 df 来进行计算。

例如,在我们的 calculate_mom 函数中:

last_month = df[(df['年份'] == last_month_year) & (df['月份'] == last_month_month)]  

这里,我们使用整个 df 数据框来查找上个月的数据,尽管 apply 函数正在处理当前行。

因此,虽然 lambda 函数逐行处理数据,但它内部调用的函数可以使用整个数据框进行计算。这正是我们能够计算环比和同比的原因,因为这些计算需要查看其他月份的数据。

任务5 (方法二:简便方法,推荐)

需要注意的是,时间需要升序排列,这样计算出来的才是正确的

# 筛选中国的数据,按月汇总订单数量及利润
china_describe2 = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
china_describe2.head() # 观察数据
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\3967723160.py:2: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.china_describe2 = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
年份月份订单数量利润
0201307411710.0
1201308431890.0
2201309502160.0
3201310562380.0
4201311602640.0
china_describe2['订单数量环比'] = china_describe2['订单数量'].pct_change().fillna(0)*100
china_describe2['利润环比'] = china_describe2['利润'].pct_change().fillna(0)*100
china_describe2['订单数量同比'] = china_describe2.groupby(by = ['月份'])['订单数量'].pct_change().fillna(0)*100
china_describe2['利润同比'] = china_describe2.groupby(by = ['月份'])['利润'].pct_change().fillna(0)*100
china_describe2
年份月份订单数量利润订单数量环比利润环比订单数量同比利润同比
0201307411710.000.0000000.0000000.0000000.000000
1201308431890.004.87804910.5263160.0000000.000000
2201309502160.0016.27907014.2857140.0000000.000000
3201310562380.0012.00000010.1851850.0000000.000000
4201311602640.007.14285710.9243700.0000000.000000
5201312913930.0051.66666748.8636360.0000000.000000
6201401672810.00-26.373626-28.4987280.0000000.000000
7201402341300.00-49.253731-53.7366550.0000000.000000
8201403733170.00114.705882143.8461540.0000000.000000
9201404763220.004.1095891.5772870.0000000.000000
10201405933850.0022.36842119.5652170.0000000.000000
11201406823580.00-11.827957-7.0129870.0000000.000000
12201407961857.0017.073171-48.128492134.1463418.596491
13201408981942.002.0833334.577275127.9069772.751323
1420140950976.00-48.979592-49.7425330.000000-54.814815
1520141048927.00-4.000000-5.020492-14.285714-61.050420
16201411581200.0020.83333329.449838-3.333333-54.545455
17201412861800.0048.27586250.000000-5.494505-54.198473
18201501611220.00-29.069767-32.222222-8.955224-56.583630
19201502621215.001.639344-0.40983682.352941-6.538462
20201503511050.00-17.741935-13.580247-30.136986-66.876972
21201504721418.0041.17647135.047619-5.263158-55.962733
22201505932017.0029.16666742.2425950.000000-47.610390
23201506861802.00-7.526882-10.6593954.878049-49.664804
2420150744090558.85411.6279074925.463374358.3333334776.620894
252015081369461863.99211.136364410.0152991296.93877623682.903708
262015091309396373.18-4.382761-14.1796742518.00000040512.006148
272015101504509619.2914.89686828.5705783033.33333354875.112190
282015111543528140.772.5930853.6343762560.34482843911.730833
292015121921568262.2524.4977327.5967402133.72093031470.125000
302016011580486949.53-17.751171-14.3090132490.16393439813.895902
312016021653506787.844.6202534.0739972566.12903241610.933333
322016031686491470.151.996370-3.0225053205.88235346706.680952
332016041800541664.956.76156610.2131942400.00000038099.220733
342016052104598067.7616.88888910.4128592162.36559129551.351512
352016061988569919.58-5.513308-4.7065202211.62790731527.057714
36201607820330376.67-58.752515-42.03100286.363636264.819860

提问:计算同比使用了groupby,这样经过分组计算的数据,和直接计算的数据放一起不会造成对应不上的麻烦吗

回答:伟大的观察!

当您将’ groupby() ‘与’ pct_change() ‘等操作结合使用时,结果数据仍然保留其原始顺序和索引,并且该操作应用于每个组。因此,即使在分组并应用’ pct_change() '方法之后,数据的顺序仍然保持不变,并且结果与原始数据正确地对齐。

在前面的代码中:

df['订单数量_YoY '] = df.groupby(“月份”)(“订单数量的].pct_change () .fillna (0) * 100  

事情是这样的:

  1. 数据按“月”进行分组。
  2. 在每个月份组中,’ pct_change() '方法计算同比变化。
  3. 结果保留了原始DataFrame的顺序和索引。
  4. 计算同比变化分配给新列”订单数量_YoY”。

因此,数据中没有不匹配或不对齐。计算值与DataFrame中的原始行正确对齐。

提问:如果分组后跟着聚合函数比如sum也会不变吗,或者说.fillna函数很重要,即使使用了聚合函数,因为会被填充数字,也不会担心顺序对不上的情况

回答:你的问题涉及到熊猫行为的几个细微差别。让我们来分析一下:

  1. ** ’ groupby() ‘后面跟着转换(如’ pct_change() ')😗*

当您使用’ groupby() ‘和’ pct_change() '等转换函数时,生成的Series或DataFrame将保持与原始序列相同的形状和索引。这确保了转换后的数据与原始数据保持一致。

  1. ** ’ groupby() ‘后面跟着聚合(如’ sum() ')😗*

当您使用’ groupby() ‘后面跟着’ sum() ‘这样的聚合函数时,生成的Series或DataFrame通常更小(除非使用’ as_index=False '),因为它将数据聚合到组中。这意味着如果没有进一步处理,结果数据可能不会直接与原始数据对齐。

  1. ** ’ .fillna() '的作用:**

’ .fillna() ‘方法用于处理缺失值(nan)。在前面的代码中,它的主要作用是在计算’ pct_change() '时处理由每组中的第一个值产生的nan。它不会直接影响数据的形状或对齐方式。然而,重要的是要使用它来确保丢失的值得到适当的处理。

总结:

-对于像’ pct_change() ‘这样的转换,数据在’ groupby() ‘之后保持其形状,确保对齐。
-对于像’ sum() '这样的聚合,数据可能不会保持其原始形状,从而导致潜在的不对齐。

  • ’ .fillna() '方法对于处理nan是必不可少的,但它本身并不影响数据对齐。

如果您不确定如何转换数据,那么在每一步检查结果或使用较小的数据子集来测试和理解转换总是一个很好的做法。

任务5 (方法三:方法二的进一步优化,推荐方法)

计算同比增长率和环比增长率,使用pct_change这个函数可以用来计算百分比变化率,当periods=1计算的是环比增长率,当periods=12计算的是同比增长率

# 筛选中国的数据,按月汇总订单数量及利润
china_describe3 = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
china_describe3.head() # 观察数据
# 计算同环比
china_describe3['订单数量环比'] = china_describe3['订单数量'].pct_change()*100
china_describe3['利润环比'] = china_describe3['利润'].pct_change()*100
china_describe3['订单数量同比'] = china_describe3['订单数量'].pct_change(periods = 12)*100
china_describe3['利润同比'] = china_describe3['利润'].pct_change(periods = 12)*100
china_describe3
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\2071208107.py:2: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.china_describe3 = df[df['国家']=='中国'].groupby(by = ['年份','月份'])['订单数量','利润'].sum().reset_index()
年份月份订单数量利润订单数量环比利润环比订单数量同比利润同比
0201307411710.00NaNNaNNaNNaN
1201308431890.004.87804910.526316NaNNaN
2201309502160.0016.27907014.285714NaNNaN
3201310562380.0012.00000010.185185NaNNaN
4201311602640.007.14285710.924370NaNNaN
5201312913930.0051.66666748.863636NaNNaN
6201401672810.00-26.373626-28.498728NaNNaN
7201402341300.00-49.253731-53.736655NaNNaN
8201403733170.00114.705882143.846154NaNNaN
9201404763220.004.1095891.577287NaNNaN
10201405933850.0022.36842119.565217NaNNaN
11201406823580.00-11.827957-7.012987NaNNaN
12201407961857.0017.073171-48.128492134.1463418.596491
13201408981942.002.0833334.577275127.9069772.751323
1420140950976.00-48.979592-49.7425330.000000-54.814815
1520141048927.00-4.000000-5.020492-14.285714-61.050420
16201411581200.0020.83333329.449838-3.333333-54.545455
17201412861800.0048.27586250.000000-5.494505-54.198473
18201501611220.00-29.069767-32.222222-8.955224-56.583630
19201502621215.001.639344-0.40983682.352941-6.538462
20201503511050.00-17.741935-13.580247-30.136986-66.876972
21201504721418.0041.17647135.047619-5.263158-55.962733
22201505932017.0029.16666742.2425950.000000-47.610390
23201506861802.00-7.526882-10.6593954.878049-49.664804
2420150744090558.85411.6279074925.463374358.3333334776.620894
252015081369461863.99211.136364410.0152991296.93877623682.903708
262015091309396373.18-4.382761-14.1796742518.00000040512.006148
272015101504509619.2914.89686828.5705783033.33333354875.112190
282015111543528140.772.5930853.6343762560.34482843911.730833
292015121921568262.2524.4977327.5967402133.72093031470.125000
302016011580486949.53-17.751171-14.3090132490.16393439813.895902
312016021653506787.844.6202534.0739972566.12903241610.933333
322016031686491470.151.996370-3.0225053205.88235346706.680952
332016041800541664.956.76156610.2131942400.00000038099.220733
342016052104598067.7616.88888910.4128592162.36559129551.351512
352016061988569919.58-5.513308-4.7065202211.62790731527.057714
36201607820330376.67-58.752515-42.03100286.363636264.819860

任务6

主管想了解面向 中国 的订单中,哪个销售大区在 2016 年的订单数量以及利润最高?

需要你统计输出其结果,同时,主管还想知道不同销售大区的订单数量最多的产品、最少的产品分别是哪几类(产品类型),需要你统计并输出其结果。

# 你的代码
# 输出中国地区各销售大区2016年的订单数量以及最高利润
china_bigarea_2016 = df[(df['国家']=='中国') & (df['年份']==2016)].groupby(by = ['销售大区'])['订单数量','利润'].sum().reset_index()
print(china_bigarea_2016,'\n')
print(f"中国2016年{china_bigarea_2016['销售大区'][china_bigarea_2016['订单数量'].idxmax()]}的订单数量最高,订单数量为:{china_bigarea_2016['订单数量'][china_bigarea_2016['订单数量'].idxmax()]};\n{china_bigarea_2016['销售大区'][china_bigarea_2016['利润'].idxmax()]}的利润最高,利润为:{china_bigarea_2016['利润'][china_bigarea_2016['利润'].idxmax()]}",'\n')# 不同销售大区订单数量最多/最少的产品类型是哪些
china_bigarea_2016_2 = df[(df['国家']=='中国') & (df['年份']==2016)].groupby(by = ['销售大区','产品类别'])['订单数量'].sum().reset_index()
# print(china_bigarea_2016_2,'\n')
# 不同销售大区订单数量最多的产品类型
china_bigarea_2016_2_max = china_bigarea_2016_2.groupby(by = ['销售大区']).apply(lambda x:x.nlargest(1,'订单数量')).reset_index(drop = True)
print(china_bigarea_2016_2_max,'\n')
# 不同销售大区订单数量最少的产品类型
china_bigarea_2016_2_min = china_bigarea_2016_2.groupby(by = ['销售大区']).apply(lambda x:x.nsmallest(1,'订单数量')).reset_index(drop = True)
print(china_bigarea_2016_2_min,'\n')
  销售大区  订单数量          利润
0  东北区    15     6529.89
1  东南区    30     7592.59
2   中部    10     4207.80
3  西北区  4952  1583580.11
4  西南区  6624  1923326.09 中国2016年西南区的订单数量最高,订单数量为:6624;
西南区的利润最高,利润为:1923326.09 销售大区 产品类别  订单数量
0  东北区   配件    11
1  东南区   配件    20
2   中部   配件     8
3  西北区   配件  3316
4  西南区   配件  4273 销售大区 产品类别  订单数量
0  东北区    球     1
1  东南区    球     4
2   中部   服装     2
3  西北区    球   750
4  西南区   服装  1139 

C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\973851953.py:3: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.china_bigarea_2016 = df[(df['国家']=='中国') & (df['年份']==2016)].groupby(by = ['销售大区'])['订单数量','利润'].sum().reset_index()

任务7

主管想了解在所有订单中,服装类(产品类别)产品的整体订单数量月变化趋势如何,需要你统计并依据年份输出各月份的订单数量。

# 你的代码
# 获取服装品类的数据
cloth_cat_by_month = df[df['产品类别']=='服装'].groupby(by = ['年份','月份'])['订单数量'].sum().reset_index()
cloth_cat_by_month
年份月份订单数量
0201507179
1201508642
2201509684
3201510689
4201511677
5201512837
6201601776
7201602772
8201603772
9201604838
10201605848
11201606951
12201607436
# 绘图观察数据变化趋势
import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# Convert 年份 and 月份 to a single datetime column
cloth_cat_by_month['年月'] = pd.to_datetime(cloth_cat_by_month['年份'].astype(str) + '-' + cloth_cat_by_month['月份'].astype(str) )# Plot
plt.figure(figsize=(12, 6))
plt.plot(cloth_cat_by_month['年月'], cloth_cat_by_month['订单数量'], marker='o', linestyle='-')# Adding data labels
for idx, row in cloth_cat_by_month.iterrows():plt.annotate(row['订单数量'], (row['年月'], row['订单数量']), textcoords="offset points", xytext=(0,5), ha='center')plt.title('服装订单数量随时间变化趋势')
plt.xlabel('年月')
plt.ylabel('订单数量')
plt.grid(True)
plt.tight_layout() # 自动调整子图的位置,在某些情况下,如果不使用tight_layout(), 图形元素可能会重叠或被剪裁。
plt.show()


在这里插入图片描述

任务8

基于任务7的输出结果,主管需要你统计在各年份订单数量最低的月份里,在 服装类(产品类别)的产品中,哪些产品(产品名称)的订单是最少的?

# 你的代码# 获取服装名称的数据
cloth_goods_by_month = df[df['产品类别']=='服装'].groupby(by = ['年份','月份','产品名称'])['订单数量'].sum().reset_index()
# 获取7月数据,因为7月订单数量最低
cloth_goods_by_month_7 = cloth_goods_by_month[cloth_goods_by_month['月份']=='07']
# 获取订单数量最低的产品名称
cloth_goods_by_month_7.groupby(by = ['年份','月份']).apply(lambda x : x.nsmallest(1,'订单数量')).reset_index(drop = True)
年份月份产品名称订单数量
0201507皮带5
1201607袜子25
# 任务8补充,如果绘图数据展示不好分辨,还是需要判断订单数量最小的年月
# 筛选数据
cloth_goods_by_month_2 = df[df['产品类别']=='服装'].groupby(by = ['年份','月份'])['订单数量'].sum().reset_index()
# 找按年分组订单数量最小的索引
cloth_min_index = cloth_goods_by_month_2.groupby(by = ['年份'])['订单数量'].idxmin()
# 输出结果
cloth_min = cloth_goods_by_month_2.loc[cloth_min_index]
cloth_min
年份月份订单数量
0201507179
12201607436

任务9

主管想知道在面向 中国大中华区域 的订单中不同用户的购物特点是怎样的;

需要你先依据 客户ID 统计每位客户的购物次数及购物花费总金额,并在此基础计算每位客户的平均购物花费。

# 你的代码
# 该区域数据
dzh_of_china = df[(df['国家']=='中国') & (df['区域']=='大中华区')]
# 统计购物次数以及花费总金额
dzh_of_china_describe = dzh_of_china.groupby(by = ['客户ID'])['订单数量','销售金额'].sum().reset_index()
dzh_of_china_describe
# 该区域客户总数
dzh_kehu_counts = len(dzh_of_china_describe)
# 每位客户的平均花费
dzh_of_china_describe['平均购物花销'] = dzh_of_china_describe['销售金额']/ dzh_of_china_describe['订单数量']
dzh_of_china_describe
C:\Users\chengyuanting\AppData\Local\Temp\ipykernel_14224\4058715340.py:5: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.dzh_of_china_describe = dzh_of_china.groupby(by = ['客户ID'])['订单数量','销售金额'].sum().reset_index()
客户ID订单数量销售金额平均购物花销
013033BA56965.901393.180000
113034BA53986.80797.360000
213035BA64026.70671.116667
313036BA3442.99147.663333
413037BA33902.991300.996667
...............
781431370BA21418.90709.450000
781531371BA1129.00129.000000
781631373BA1129.00129.000000
781731374BA31458.80486.266667
781831375BA1129.00129.000000

7819 rows × 4 columns

任务10

根据任务9所计算的结果,主管想更加直观的了解不同客户的购物特点,

需要你新增两列分别对客户购物次数以及平均购物花费进行分组划分,针对购物次数可以划分为"高"、"中"、"低"等共三种频次;

针对平均购物花费可将其划分为 "高"、"中"、"低"三种消费等级;

之后再将两列结果进行合并,经过排列组合形成如 "高高"、"高中"等共九种用户购物特征;

最后再统计不同特征的用户最喜欢购买的产品(产品类别)是哪些,并将结果输出。

任务10 方法一:均等分箱

# 定义箱子
bins_order = [0,dzh_of_china_describe['订单数量'].quantile(0.33),dzh_of_china_describe['订单数量'].quantile(0.66),dzh_of_china_describe['订单数量'].max()+1]
labels_order = ['低','中','高']bins_cost = [0,dzh_of_china_describe['平均购物花销'].quantile(0.33),dzh_of_china_describe['平均购物花销'].quantile(0.66),dzh_of_china_describe['平均购物花销'].max()+1]
labels_cost = ['低','中','高']# 为消费频次等级和购物等级两列
dzh_of_china_describe['购物频次'] = pd.cut(dzh_of_china_describe['订单数量'],bins = bins_order,labels = labels_order,right = False)
dzh_of_china_describe['消费等级'] = pd.cut(dzh_of_china_describe['平均购物花销'],bins = bins_cost,labels = labels_cost,right = False)# 合并两种购物特征
dzh_of_china_describe['购物特征'] = dzh_of_china_describe['购物频次'].astype('str') + dzh_of_china_describe['消费等级'].astype('str')# 将购物特征合并到大众华区的数据上
merged_df = pd.merge(dzh_of_china,dzh_of_china_describe[['客户ID','购物特征']],on = '客户ID')# 输出偏好产品
# favorite_products = merged_df.groupby(by = ['购物特征'])['产品类别'].apply(lambda x : x.value_counts().nlargest(1))
favorite_products = merged_df.groupby(by = ['购物特征'])['产品类别'].apply(lambda x : x.value_counts().idxmax())
favorite_products
购物特征
中中    配件
中低     球
中高    配件
低中    配件
低低     球
低高    配件
高中    配件
高低     球
高高    配件
Name: 产品类别, dtype: object

cut函数的right参数决定了区间的闭合方式。

  • 如果 right=True(默认值):则每个区间的右边是闭合的,也就是说,区间会是这样的形式:[a, b]、[b, c]、[c, d] 等。
  • 如果 right=False:则每个区间的左边是闭合的,也就是说,区间会是这样的形式:(a, b]、(b, c]、(c, d] 等。

具体例子:
考虑一个简单的数据集:[1, 2, 3, 4, 5]和一个区间边界[1, 3, 5]

  • 使用 right=True,数据将被分箱为:[1, 3] 和 [3, 5]。此时,数字3将属于第二个箱子。
  • 使用 right=False,数据将被分箱为:(1, 3] 和 (3, 5]。此时,数字3将属于第一个箱子。

因此,right参数的值会影响数据点如何被分配到不同的箱子中。

任务10 方法二:聚类分箱

dzh_of_china_describe2 = dzh_of_china_describe[['客户ID','订单数量','销售金额','平均购物花销']].copy()
dzh_of_china_2 = dzh_of_china.copy()
from sklearn.cluster import KMeans# Using K-means for clustering binning on "订单数量"
kmeans_order = KMeans(n_clusters=3, random_state=0).fit(dzh_of_china_describe2[['订单数量']])
dzh_of_china_describe2['购物频次_cluster'] = kmeans_order.labels_# Map the cluster labels to the desired labels: '低', '中', '高'
order_centers = kmeans_order.cluster_centers_.flatten()
order_label_map = {i: '低' if center == min(order_centers) else '高' if center == max(order_centers) else '中' for i, center in enumerate(order_centers)}
dzh_of_china_describe2['购物频次'] = dzh_of_china_describe2['购物频次_cluster'].map(order_label_map)# Drop the cluster label column
dzh_of_china_describe2.drop('购物频次_cluster', axis=1, inplace=True)dzh_of_china_describe2
C:\Users\chengyuanting\AppData\Roaming\Python\Python39\site-packages\sklearn\cluster\_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warningsuper()._check_params_vs_input(X, default_n_init=10)
客户ID订单数量销售金额平均购物花销购物频次
013033BA56965.901393.180000
113034BA53986.80797.360000
213035BA64026.70671.116667
313036BA3442.99147.663333
413037BA33902.991300.996667
..................
781431370BA21418.90709.450000
781531371BA1129.00129.000000
781631373BA1129.00129.000000
781731374BA31458.80486.266667
781831375BA1129.00129.000000

7819 rows × 5 columns

# Using K-means for clustering binning on "平均购物花销"
kmeans_cost = KMeans(n_clusters=3, random_state=0).fit(dzh_of_china_describe2[['平均购物花销']])
dzh_of_china_describe2['消费等级_cluster'] = kmeans_cost.labels_# Map the cluster labels to the desired labels: '低', '中', '高'
cost_centers = kmeans_cost.cluster_centers_.flatten()
cost_label_map = {i: '低' if center == min(cost_centers) else '高' if center == max(cost_centers) else '中' for i, center in enumerate(cost_centers)}
dzh_of_china_describe2['消费等级'] = dzh_of_china_describe2['消费等级_cluster'].map(cost_label_map)# Drop the cluster label column
dzh_of_china_describe2.drop('消费等级_cluster', axis=1, inplace=True)dzh_of_china_describe2
C:\Users\chengyuanting\AppData\Roaming\Python\Python39\site-packages\sklearn\cluster\_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warningsuper()._check_params_vs_input(X, default_n_init=10)
客户ID订单数量销售金额平均购物花销购物频次消费等级
013033BA56965.901393.180000
113034BA53986.80797.360000
213035BA64026.70671.116667
313036BA3442.99147.663333
413037BA33902.991300.996667
.....................
781431370BA21418.90709.450000
781531371BA1129.00129.000000
781631373BA1129.00129.000000
781731374BA31458.80486.266667
781831375BA1129.00129.000000

7819 rows × 6 columns

# 合并两种购物特征
dzh_of_china_describe2['购物特征'] = dzh_of_china_describe2['购物频次'].astype('str') + dzh_of_china_describe2['消费等级'].astype('str')# 将购物特征合并到大众华区的数据上
merged_df2 = pd.merge(dzh_of_china,dzh_of_china_describe2[['客户ID','购物特征']],on = '客户ID')# 输出偏好产品
# favorite_products2 = merged_df2.groupby(by = ['购物特征'])['产品类别'].apply(lambda x : x.value_counts().nlargest(1))
favorite_products2 = merged_df2.groupby(by = ['购物特征'])['产品类别'].apply(lambda x : x.value_counts().idxmax())
favorite_products2
购物特征
中中    配件
中低    配件
中高    配件
低中    配件
低低    配件
低高    配件
高中    配件
高低    配件
高高    配件
Name: 产品类别, dtype: object

提问:上述聚类分箱时,是怎么保证高的数据不会打错高中低标签呢

回答:
当我们使用K-means聚类进行分箱时,算法会为我们的数据找到三个中心(假设我们选择了3个簇)。这三个中心分别代表了数据的三个“平均”或“典型”值。为了将这三个中心与“低”、“中”和“高”标签正确地匹配起来,我们执行了以下操作:

  1. 获取这三个中心的值。
  2. 找到这三个值中的最小值、最大值和中间值。
  3. 将最小值映射到“低”,将最大值映射到“高”,将中间值映射到“中”。

通过这种方式,我们确保了正确地标记了每个数据点的标签。

这是上述代码的相关部分,用于映射簇标签到我们的“低”、“中”和“高”标签:

order_centers = kmeans_order.cluster_centers_.flatten()  
order_label_map = {i: '低' if center == min(order_centers) else '高' if center == max(order_centers) else '中' for i, center in enumerate(order_centers)}  
df['购物频次'] = df['购物频次_cluster'].map(order_label_map)  

在这里,order_centers是我们得到的三个中心的值,然后我们使用字典推导式为每个中心创建一个映射,最后使用map函数应用这个映射到数据框中的簇标签上。

相关文章:

数据分析实战 - 2 订单销售数据分析(pandas 进阶)

题目来源&#xff1a;和鲸社区的题目推荐&#xff1a; 刷题源链接&#xff08;用于直接fork运行 https://www.heywhale.com/mw/project/6527b5560259478972ea87ed 刷题准备 请依次运行这部分的代码&#xff08;下方4个代码块&#xff09;&#xff0c;完成刷题前的数据准备 …...

测试服务器端口是否开通,计算退休时间

本案例知识点 netstat -tuln | grep 80 nestat 目前主机打开的网络服务端口&#xff0c;-tuln目前主机启动的服务&#xff0c;如图 报错说参数太多&#xff0c;仔细检查发现if后的中括号内&#xff0c;变量少双引号导致&#xff0c;改完之后运行显示22,25端口开放&#xff0…...

Prometheus接入AlterManager配置企业微信告警(基于K8S环境部署)

文章目录 一、创建企业微信机器人二、配置AlterManager告警发送至企业微信三、Prometheus接入AlterManager配置四、部署PrometheusAlterManager(放到一个Pod中)五、测试告警 注意&#xff1a;请基于 PrometheusGrafana监控K8S集群(基于K8S环境部署)文章之上做本次实验。 一、创…...

11.1 Linux 设备树

一、什么是设备树&#xff1f; 设备树(Device Tree)&#xff0c;描述设备树的文件叫做 DTS(DeviceTree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff1a; 树的主干就是系统总线&#xff0c; IIC 控制器、 GPIO 控制…...

万宾科技管网水位监测助力智慧城市的排水系统

以往如果要了解城市地下排水管网的水位变化&#xff0c;需要依靠人工巡检或者排查的方式&#xff0c;这不仅加大了人员的工作量&#xff0c;而且也为市政府带来了更多的工作难题。比如人员监管监测不到位或无法远程监控等情况&#xff0c;都会降低市政府对排水管网的管理能力&a…...

Glide transform CircleCrop()圆图,Kotlin

Glide transform CircleCrop()圆图&#xff0c;Kotlin import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CircleCropclass MainActivity : AppCompatActivity() {o…...

从NetSuite Payment Link杂谈财务自动化、数字化转型

最近在进行信息化的理论学习&#xff0c;让我有机会跳开软件功能&#xff0c;用更加宏大的视野&#xff0c;来审视我们在哪里&#xff0c;我们要到哪去。 在过去20多年&#xff0c;我们的财务软件经历了电算化、网络化、目前处于自动化、智能化阶段。从NetSuite这几年的功能发…...

1.UML面向对象类图和关系

文章目录 4种静态结构图类图类的表示类与类之间的关系依赖关系(Dependency)关联关系(Association)聚合(Aggregation)组合(Composition)实现(Realization)继承/泛化(Inheritance/Generalization)常用的UML工具reference欢迎访问个人网络日志🌹🌹知行空间🌹🌹 4种静态结构…...

JAVA小说小程序系统是怎样开发的

随着移动互联网的普及&#xff0c;小说阅读已经成为人们休闲娱乐的重要方式之一。为了满足广大读者的需求&#xff0c;我们开发了一款基于JAVA编程语言的小说小程序系统。本系统旨在提供一种便捷、高效、有趣的阅读体验&#xff0c;让用户能够随时随地阅读最新、最热门的小说。…...

【深度学习】pytorch——Tensor(张量)详解

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch——Tensor 简介创建Tensortorch.Tensor( )和torch.tensor( )的区别torch.Tensor( )torch.tensor( ) tensor可以是一个数&#xff08;标量&#xff09;、一维数组&#xff08;向量&#xff09;、二维数组&…...

装修服务预约小程序的内容如何

大小装修不断&#xff0c;市场中大小品牌也比较多&#xff0c;对需求客户来说&#xff0c;可以线下咨询也可以线上寻找品牌&#xff0c;总是可以找到满意的服务公司&#xff0c;而对装修公司来说如今线下流量匮乏&#xff0c;很多东西也难以通过线下方式承载&#xff0c;更需要…...

easypoi 导出Excel 使用总结

easypoi 导出Excel 导出Excel需要设置标题&#xff0c;且标题是多行&#xff0c;标题下面是列表头 设置表格标题 ExportParams headExportParams new ExportParams();StringBuilder buffer new StringBuilder("");buffer.append("1、课程名称&#xff1a;....…...

MySQL性能优化的最佳20条经验

概述 关于数据库的性能&#xff0c;这并不只是DBA才需要担心的事。当我们去设计数据库表结构&#xff0c;对操作数据库时(尤其是查表时的SQL语句)&#xff0c;我们都需要注意数据操作的性能。下面讲下MySQL性能优化的一些点。 1. 为查询缓存优化你的查询 大多数的MySQL服务器…...

【Liunx基础】之指令(一)

【Liunx基础】之指令&#xff08;一&#xff09; 1.ls指令2.pwd命令3.cd指令4.touch指令5.mkdir指令(重要)6.rmdir指令与rm指令&#xff08;重要&#xff09;7.man指令&#xff08;重要&#xff09;8.cp指令&#xff08;重要&#xff09; &#x1f4c3;博客主页&#xff1a; 小…...

jQuery案例专题

jQuery案例专题 本学期主要担任的课程是js和jQuery&#xff0c;感觉用到的有一些案例挺有意思的&#xff0c;就对其进行了一下整理。 目录&#xff1a; 电影院的幕帘特效 手风琴特效 星光闪烁 网页轮播图 1.电影院的幕帘特效代码如下 html <!DOCTYPE html > <html…...

【Linux】服务器间免登陆访问

准备两台服务器&#xff0c;服务器A&#xff0c;服务器B 在服务器A中实现免登陆服务器B 进入服务器A操作 进入目录/root/.ssh cd /root/.ssh秘钥对使用默认文件名 生成秘钥对&#xff0c;在输入秘钥文件时直接回车则会使用默认文件名&#xff1a;id_rsa ssh-keygen -t rsa…...

【信息安全原理】——IP及路由安全(学习笔记)

目录 &#x1f552; 1. IPv4协议及其安全性分析&#x1f552; 2. IPsec&#xff08;IP Security&#xff09;&#x1f558; 2.1 IPsec安全策略&#x1f564; 2.1.1 安全关联&#xff08;Security Association, SA&#xff09;&#x1f564; 2.1.2 安全策略&#xff08;Security…...

【jvm】虚拟机之本地方法栈

目录 一、说明二、注意 一、说明 1. Java虚拟机栈用于管理Javaj法的调用&#xff0c;而本地方法栈用于管理本地方法的调用。 2. 本地方法栈&#xff0c;也是线程私有的。 3. 允许被实现成固定或者是可动态扩展的内存大小。 (在内存溢出方面是相同&#xff09; 4. 如果线程请求分…...

『CV学习笔记』图像超分辨率等图像处理任务中的评价指标PSNR(峰值信噪比)

图像超分辨率等图像处理任务中的评价指标PSNR(峰值信噪比) 文章目录 一. PSNR(峰值信噪比)1.1. 定义1.2. 作用1.3. 例子1.4 . PSNR评价标准二. 参考文献一. PSNR(峰值信噪比) 1.1. 定义 峰值信噪比(Peak Signal-to-Noise Ratio, PSNR)是图像超分辨率等图像处理任务中常用的一…...

【51nod 连续区间】 题解(序列分治)

题目描述 区间内的元素元素排序后 任意相邻两个元素值差为 1 1 1 的区间称为“连续区间”。 如 3 , 1 , 2 3,1,2 3,1,2 是连续区间&#xff0c; 3 , 1 , 4 3,1,4 3,1,4 不是连续区间。 给出一个 1 ∼ n 1 \sim n 1∼n 的排列&#xff0c;问有多少连续区间。 …...

10.30校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招&#xff5c;极目智能2024届校招 校招&#xff5c;极目智能2024届校招 2、校招&#xff5c;杭州极弱磁场国家重大科技基础设施研究院2024秋季校园招聘正式启动&#xff01; 校招&…...

相比typescript,python的动态类型有什么优缺点?

以下是Python的动态类型相对于TypeScript的静态类型的一些优缺点&#xff1a; 1、Python的动态类型优点&#xff1a; 更灵活&#xff1a;Python的动态类型允许你在运行时更灵活地改变变量的类型&#xff0c;这对于快速原型设计和快速开发非常有帮助。 代码更简洁&#xff1a;…...

高效处理文件:批量顺序编号重命名方法

每个人都面临着文件管理的挑战&#xff0c;特别是那些需要处理大量文件的人。如何高效地管理这些文件一直是一个难题。为了解决这个问题&#xff0c;我向大家推荐一款强大的文件管理工具——固乔文件管家。这个工具可以帮助你快速有效地给文件进行批量重命名和编号&#xff0c;…...

JAVA深化篇_29—— 线程使用之线程联合以及Thread类中的其他常用方法【附有详细说明及代码案例】

线程联合 当前线程邀请调用方法的线程优先执行&#xff0c;在调用方法的线程执行结束之前&#xff0c;当前线程不能再次执行。线程A在运行期间&#xff0c;可以调用线程B的join()方法&#xff0c;让线程B和线程A联合。这样&#xff0c;线程A就必须等待线程B执行完毕后&#xf…...

〖Python网络爬虫实战㊲〗- JavaScript 逆向实战(一)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度…...

2023辽宁省数学建模A题铁路车站的安全标线完整原创论文详细讲解(含matlab代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模A题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B预计下午两点前更新完毕&#xff0c;A全…...

(14)学习笔记:动手深度学习(Pytorch神经网络基础)

文章目录 神经网络的层与块块的基本概念自定义块 问答 神经网络的层与块 块的基本概念 以多层感知机为例&#xff0c; 整个模型接受原始输入&#xff08;特征&#xff09;&#xff0c;生成输出&#xff08;预测&#xff09;&#xff0c; 并包含一些参数&#xff08;所有组成层…...

Leetcode-1 两数之和

暴力穷举 class Solution {public int[] twoSum(int[] nums, int target) {int[] num new int[2];for(int i0;i<nums.length-1;i){for(int ji1;j<nums.length;j){if(nums[i]nums[j]target){num[0]i;num[1]j;}}}return num;} }HashMap&#xff0c;记录下标和对应值&…...

Screens for Mac 中文版 远程桌面连接控制工具

Screens Mac 版是Mac os平台上的一款Mac VNC 客户终端,能够自由访问远程计算机设备&#xff0c; Screens Mac 版支持各种强大的远程控制辅助工具&#xff0c;例如剪切板共享、快捷方式自定义、安全连接、多屏幕支持、快速扫描连接等。 Screens 4 for mac支持多种远程桌面协议&…...

解决vmware安装ubuntu虚拟机显示不全以及无法实现windows与虚拟机之间无法相互复制粘贴问题

01、存在问题 02、解决方案 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop reboot //重启重启后界面如下&#xff1a; 存在Bug 如果遇到一下问题&#xff0c;请先执行下列命令&#x…...