Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
Amazon-Selection-Data
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abel_cjy
Amazon-Selection-Data
Commits
c8a20aab
Commit
c8a20aab
authored
Oct 29, 2026
by
chenyuanjie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
流量选品周计算-同环比计算增加基准月
parent
f9621843
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
53 additions
and
16 deletions
+53
-16
dwt_flow_asin_week.py
Pyspark_job/dwt/dwt_flow_asin_week.py
+53
-16
No files found.
Pyspark_job/dwt/dwt_flow_asin_week.py
View file @
c8a20aab
...
@@ -51,9 +51,15 @@ class DwtFlowAsinWeek(Templates):
...
@@ -51,9 +51,15 @@ class DwtFlowAsinWeek(Templates):
self
.
spark
=
self
.
create_spark_object
(
self
.
spark
=
self
.
create_spark_object
(
app_name
=
f
"{self.hive_tb}: {self.site_name}, {self.date_type}, {self.date_info}"
)
app_name
=
f
"{self.hive_tb}: {self.site_name}, {self.date_type}, {self.date_info}"
)
# 前1/2/3周、4周前、去年同周、本周最后一天
# 前1/2/3周、4周前、去年同周、本周最后一天
self
.
last_week
,
self
.
last_2_week
,
self
.
last_3_week
,
self
.
previous_week
,
self
.
last_year_week
,
self
.
week_end_date
=
self
.
get_week_date_info
()
self
.
last_week
,
self
.
last_2_week
,
self
.
last_3_week
,
self
.
previous_week
,
self
.
last_year_week
,
self
.
week_end_date
,
self
.
week_month
=
self
.
get_week_date_info
()
print
(
f
"前1/2/3周: {self.last_week}/{self.last_2_week}/{self.last_3_week}, 4周前: {self.previous_week}, "
print
(
f
"前1/2/3周: {self.last_week}/{self.last_2_week}/{self.last_3_week}, 4周前: {self.previous_week}, "
f
"去年同周: {self.last_year_week}, 本周最后一天: {self.week_end_date}"
)
f
"去年同周: {self.last_year_week}, 本周最后一天: {self.week_end_date}, 本周所属月: {self.week_month}"
)
# 基准周之前无数据,对比周早于基准周的指标不计算
self
.
base_week
=
"2026-41"
self
.
can_wow
=
self
.
last_week
>=
self
.
base_week
self
.
can_mom
=
self
.
previous_week
>=
self
.
base_week
self
.
can_yoy
=
self
.
last_year_week
>=
self
.
base_week
print
(
f
"基准周: {self.base_week}, 是否计算 wow/mom/yoy: {self.can_wow}/{self.can_mom}/{self.can_yoy}"
)
self
.
launch_time_interval_dict
=
self
.
get_launch_time_interval_dict
(
self
.
week_end_date
)
self
.
launch_time_interval_dict
=
self
.
get_launch_time_interval_dict
(
self
.
week_end_date
)
# 写入、分区初始化
# 写入、分区初始化
self
.
df_save
=
self
.
spark
.
sql
(
f
"select 1+1;"
)
self
.
df_save
=
self
.
spark
.
sql
(
f
"select 1+1;"
)
...
@@ -74,8 +80,8 @@ class DwtFlowAsinWeek(Templates):
...
@@ -74,8 +80,8 @@ class DwtFlowAsinWeek(Templates):
self
.
color_set
=
set
()
# 颜色词表,read_data 阶段填充
self
.
color_set
=
set
()
# 颜色词表,read_data 阶段填充
def
get_week_date_info
(
self
):
def
get_week_date_info
(
self
):
"""获取前1/2/3周、4周前、去年同周、本周最后一天"""
"""获取前1/2/3周、4周前、去年同周、本周最后一天
、本周所属月
"""
df
=
self
.
spark
.
sql
(
f
"select id, `date`, year_week, week_day from dim_date_20_to_30"
)
.
toPandas
()
df
=
self
.
spark
.
sql
(
f
"select id, `date`, year_week, week_day
, year_month
from dim_date_20_to_30"
)
.
toPandas
()
current_week_id
=
int
(
list
(
df
.
loc
[(
df
.
year_week
==
self
.
date_info
)
&
(
df
.
week_day
==
1
)]
.
id
)[
0
])
current_week_id
=
int
(
list
(
df
.
loc
[(
df
.
year_week
==
self
.
date_info
)
&
(
df
.
week_day
==
1
)]
.
id
)[
0
])
last_week
=
list
(
df
.
loc
[
df
.
id
==
current_week_id
-
7
]
.
year_week
)[
0
]
last_week
=
list
(
df
.
loc
[
df
.
id
==
current_week_id
-
7
]
.
year_week
)[
0
]
last_2_week
=
list
(
df
.
loc
[
df
.
id
==
current_week_id
-
14
]
.
year_week
)[
0
]
last_2_week
=
list
(
df
.
loc
[
df
.
id
==
current_week_id
-
14
]
.
year_week
)[
0
]
...
@@ -84,7 +90,8 @@ class DwtFlowAsinWeek(Templates):
...
@@ -84,7 +90,8 @@ class DwtFlowAsinWeek(Templates):
week_end_date
=
str
(
list
(
df
.
loc
[(
df
.
year_week
==
self
.
date_info
)
&
(
df
.
week_day
==
7
)]
.
date
)[
0
])
week_end_date
=
str
(
list
(
df
.
loc
[(
df
.
year_week
==
self
.
date_info
)
&
(
df
.
week_day
==
7
)]
.
date
)[
0
])
year
,
week
=
self
.
date_info
.
split
(
"-"
)
year
,
week
=
self
.
date_info
.
split
(
"-"
)
last_year_week
=
f
"{int(year) - 1}-{week}"
last_year_week
=
f
"{int(year) - 1}-{week}"
return
last_week
,
last_2_week
,
last_3_week
,
previous_week
,
last_year_week
,
week_end_date
week_month
=
list
(
df
.
loc
[(
df
.
year_week
==
self
.
date_info
)
&
(
df
.
week_day
==
1
)]
.
year_month
)[
0
]
return
last_week
,
last_2_week
,
last_3_week
,
previous_week
,
last_year_week
,
week_end_date
,
week_month
@staticmethod
@staticmethod
def
get_launch_time_interval_dict
(
base_date
):
def
get_launch_time_interval_dict
(
base_date
):
...
@@ -142,9 +149,18 @@ class DwtFlowAsinWeek(Templates):
...
@@ -142,9 +149,18 @@ class DwtFlowAsinWeek(Templates):
print
(
f
"{table_name} {date_type} 最新分区: {latest_date_info}"
)
print
(
f
"{table_name} {date_type} 最新分区: {latest_date_info}"
)
return
latest_date_info
return
latest_date_info
def
get_month_date_info
(
self
,
table_name
,
date_type
):
"""优先取本周所属月分区,不存在时取最新分区"""
sql
=
f
"show partitions {table_name} partition(site_name='{self.site_name}', date_type='{date_type}', date_info='{self.week_month}')"
if
self
.
spark
.
sql
(
sql
)
.
count
()
>
0
:
print
(
f
"{table_name} {date_type} 使用本周所属月分区: {self.week_month}"
)
return
self
.
week_month
print
(
f
"{table_name} {date_type} 不存在 {self.week_month} 分区,改取最新分区"
)
return
self
.
get_latest_date_info
(
table_name
,
date_type
)
def
read_data
(
self
):
def
read_data
(
self
):
print
(
"1.获取dwd_asin_measure(
最新month_week
),得到各种类型的统计、ao值、自然流量占比、月销信息、bsr销量信息"
)
print
(
"1.获取dwd_asin_measure(
本周所属月month_week,无则取最新
),得到各种类型的统计、ao值、自然流量占比、月销信息、bsr销量信息"
)
measure_date_info
=
self
.
get_
latest
_date_info
(
"dwd_asin_measure"
,
"month_week"
)
measure_date_info
=
self
.
get_
month
_date_info
(
"dwd_asin_measure"
,
"month_week"
)
sql
=
f
"""
sql
=
f
"""
select asin, round(asin_ao_val, 3) as asin_ao_val, round(asin_ao_val_matrix, 3) as matrix_ao_val,
select asin, round(asin_ao_val, 3) as asin_ao_val, round(asin_ao_val_matrix, 3) as matrix_ao_val,
asin_zr_counts, asin_sp_counts, (asin_sb1_counts + asin_sb2_counts) as asin_sb_counts,
asin_zr_counts, asin_sp_counts, (asin_sb1_counts + asin_sb2_counts) as asin_sb_counts,
...
@@ -195,6 +211,7 @@ class DwtFlowAsinWeek(Templates):
...
@@ -195,6 +211,7 @@ class DwtFlowAsinWeek(Templates):
self
.
df_fb_asin_info
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_fb_asin_info
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_fb_asin_info
=
self
.
df_fb_asin_info
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_fb_asin_info
=
self
.
df_fb_asin_info
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_fb_asin_info
.
show
(
10
,
truncate
=
False
)
self
.
df_fb_asin_info
.
show
(
10
,
truncate
=
False
)
if
self
.
can_wow
:
print
(
"5.获取上周整合结果(_rise、近7天环比_wow)"
)
print
(
"5.获取上周整合结果(_rise、近7天环比_wow)"
)
sql
=
f
"""
sql
=
f
"""
select asin, round(asin_ao_val, 3) as lastweek_asin_ao_val, asin_price as lastweek_asin_price,
select asin, round(asin_ao_val, 3) as lastweek_asin_ao_val, asin_price as lastweek_asin_price,
...
@@ -222,6 +239,7 @@ class DwtFlowAsinWeek(Templates):
...
@@ -222,6 +239,7 @@ class DwtFlowAsinWeek(Templates):
self
.
df_bought_history
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_bought_history
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_bought_history
=
self
.
df_bought_history
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_bought_history
=
self
.
df_bought_history
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_bought_history
.
show
(
10
,
truncate
=
False
)
self
.
df_bought_history
.
show
(
10
,
truncate
=
False
)
if
self
.
can_mom
:
print
(
"5.2获取4周前整合结果(近30天环比_mom)"
)
print
(
"5.2获取4周前整合结果(近30天环比_mom)"
)
sql
=
f
"""
sql
=
f
"""
select asin, round(asin_ao_val, 3) as previous_asin_ao_val, asin_price as previous_asin_price,
select asin, round(asin_ao_val, 3) as previous_asin_ao_val, asin_price as previous_asin_price,
...
@@ -235,6 +253,7 @@ class DwtFlowAsinWeek(Templates):
...
@@ -235,6 +253,7 @@ class DwtFlowAsinWeek(Templates):
self
.
df_flow_asin_last
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_flow_asin_last
=
self
.
spark
.
sql
(
sqlQuery
=
sql
)
self
.
df_flow_asin_last
=
self
.
df_flow_asin_last
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_flow_asin_last
=
self
.
df_flow_asin_last
.
repartition
(
100
)
.
persist
(
StorageLevel
.
DISK_ONLY
)
self
.
df_flow_asin_last
.
show
(
10
,
truncate
=
False
)
self
.
df_flow_asin_last
.
show
(
10
,
truncate
=
False
)
if
self
.
can_yoy
:
print
(
"6.获取同比去年同周整合结果"
)
print
(
"6.获取同比去年同周整合结果"
)
sql
=
f
"""
sql
=
f
"""
select asin, round(asin_ao_val, 3) as lastyear_asin_ao_val, asin_price as lastyear_asin_price,
select asin, round(asin_ao_val, 3) as lastyear_asin_ao_val, asin_price as lastyear_asin_price,
...
@@ -585,9 +604,13 @@ class DwtFlowAsinWeek(Templates):
...
@@ -585,9 +604,13 @@ class DwtFlowAsinWeek(Templates):
# 处理所有变化率相关指标(_rise/_wow对比上周、_mom对比4周前、_yoy对比去年同周)
# 处理所有变化率相关指标(_rise/_wow对比上周、_mom对比4周前、_yoy对比去年同周)
def
handle_change_rate
(
self
):
def
handle_change_rate
(
self
):
if
self
.
can_wow
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last_week
,
on
=
[
'asin'
],
how
=
'left'
)
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last_week
,
on
=
[
'asin'
],
how
=
'left'
)
if
self
.
can_mom
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last
,
on
=
[
'asin'
],
how
=
'left'
)
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last
,
on
=
[
'asin'
],
how
=
'left'
)
if
self
.
can_yoy
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last_year
,
on
=
[
'asin'
],
how
=
'left'
)
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_flow_asin_last_year
,
on
=
[
'asin'
],
how
=
'left'
)
null_double
=
F
.
lit
(
None
)
.
cast
(
DoubleType
())
# (current_col, base_col, suffix, rise_round)
# (current_col, base_col, suffix, rise_round)
# base_col 为不带前缀的历史字段名;rise_round: None 表示不计算 _rise;整数表示保留小数位;'int' 表示转 IntegerType
# base_col 为不带前缀的历史字段名;rise_round: None 表示不计算 _rise;整数表示保留小数位;'int' 表示转 IntegerType
columns_to_change
=
[
columns_to_change
=
[
...
@@ -603,25 +626,39 @@ class DwtFlowAsinWeek(Templates):
...
@@ -603,25 +626,39 @@ class DwtFlowAsinWeek(Templates):
(
"variation_bought_month"
,
"variation_bought_month"
,
"variation_bought_month"
,
"int"
),
(
"variation_bought_month"
,
"variation_bought_month"
,
"variation_bought_month"
,
"int"
),
]
]
for
current_col
,
base_col
,
suffix
,
rise_round
in
columns_to_change
:
for
current_col
,
base_col
,
suffix
,
rise_round
in
columns_to_change
:
if
self
.
can_wow
:
rise_col
,
wow_col
=
self
.
calculate_change
(
current_col
,
f
"lastweek_{base_col}"
)
rise_col
,
wow_col
=
self
.
calculate_change
(
current_col
,
f
"lastweek_{base_col}"
)
_
,
mom_col
=
self
.
calculate_change
(
current_col
,
f
"previous_{base_col}"
)
_
,
yoy_col
=
self
.
calculate_change
(
current_col
,
f
"lastyear_{base_col}"
)
if
rise_round
is
not
None
:
if
rise_round
==
"int"
:
if
rise_round
==
"int"
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
withColumn
(
f
"{suffix}_rise"
,
rise_col
.
cast
(
IntegerType
()))
rise_col
=
rise_col
.
cast
(
IntegerType
())
elif
rise_round
is
not
None
:
rise_col
=
F
.
round
(
rise_col
,
rise_round
)
wow_col
=
F
.
round
(
wow_col
,
4
)
else
:
else
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
withColumn
(
f
"{suffix}_rise"
,
F
.
round
(
rise_col
,
rise_round
))
rise_col
=
F
.
lit
(
None
)
.
cast
(
IntegerType
())
if
rise_round
==
"int"
else
null_double
wow_col
=
null_double
if
rise_round
is
not
None
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
withColumn
(
f
"{suffix}_rise"
,
rise_col
)
mom_col
=
F
.
round
(
self
.
calculate_change
(
current_col
,
f
"previous_{base_col}"
)[
1
],
4
)
if
self
.
can_mom
else
null_double
yoy_col
=
F
.
round
(
self
.
calculate_change
(
current_col
,
f
"lastyear_{base_col}"
)[
1
],
4
)
if
self
.
can_yoy
else
null_double
self
.
df_asin_detail
=
self
.
df_asin_detail
\
self
.
df_asin_detail
=
self
.
df_asin_detail
\
.
withColumn
(
f
"{suffix}_wow"
,
F
.
round
(
wow_col
,
4
)
)
\
.
withColumn
(
f
"{suffix}_wow"
,
wow_col
)
\
.
withColumn
(
f
"{suffix}_mom"
,
F
.
round
(
mom_col
,
4
)
)
\
.
withColumn
(
f
"{suffix}_mom"
,
mom_col
)
\
.
withColumn
(
f
"{suffix}_yoy"
,
F
.
round
(
yoy_col
,
4
)
)
.
withColumn
(
f
"{suffix}_yoy"
,
yoy_col
)
# 前1/2/3周月销_wow,供后端判断连续上升
# 前1/2/3周月销_wow,供后端判断连续上升
if
self
.
can_wow
:
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_bought_history
,
on
=
[
'asin'
],
how
=
'left'
)
\
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_bought_history
,
on
=
[
'asin'
],
how
=
'left'
)
\
.
withColumn
(
"asin_bought_wow_last_1w"
,
F
.
col
(
"lastweek_asin_bought_wow"
))
.
withColumn
(
"asin_bought_wow_last_1w"
,
F
.
col
(
"lastweek_asin_bought_wow"
))
self
.
df_flow_asin_last_week
.
unpersist
()
self
.
df_flow_asin_last_week
.
unpersist
()
self
.
df_bought_history
.
unpersist
()
else
:
self
.
df_asin_detail
=
self
.
df_asin_detail
\
.
withColumn
(
"asin_bought_wow_last_1w"
,
null_double
)
\
.
withColumn
(
"asin_bought_wow_last_2w"
,
null_double
)
\
.
withColumn
(
"asin_bought_wow_last_3w"
,
null_double
)
if
self
.
can_mom
:
self
.
df_flow_asin_last
.
unpersist
()
self
.
df_flow_asin_last
.
unpersist
()
if
self
.
can_yoy
:
self
.
df_flow_asin_last_year
.
unpersist
()
self
.
df_flow_asin_last_year
.
unpersist
()
self
.
df_bought_history
.
unpersist
()
def
handle_asin_different_source
(
self
):
def
handle_asin_different_source
(
self
):
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
self
.
df_asin_detail
=
self
.
df_asin_detail
.
join
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment