@@ -67,12 +67,27 @@ def analyze(df_file, title, save_to):
6767
6868def plot_consumption_heatmap (df , ax , title ):
6969 """绘制消费热力图"""
70+ # 构造时间周期
71+ max_date = df ['time' ].max ().date ()
72+ start_of_year = pd .to_datetime (max_date .year * 10000 + 101 , format = '%Y%m%d' ).date ()
73+ full_date_range = pd .date_range (start = start_of_year , end = max_date , freq = 'D' )
74+
75+ # 将未消费的天补一条值为0的消费,并按天累加
76+ daily_sum = (
77+ df .assign (date = df ['time' ].dt .normalize ()) # 将 time 转成日期
78+ .groupby ('date' )['amount' ]
79+ .sum ()
80+ .reindex (full_date_range , fill_value = 0 ) # 用完整日期索引补齐缺失天数
81+ .reset_index ()
82+ )
83+ daily_sum .columns = ['time' , 'amount' ]
84+
7085 # 准备数据
71- df ['weekday' ] = df ['time' ].dt .weekday
72- df ['week' ] = df ['time' ].dt .isocalendar ().week
86+ daily_sum ['weekday' ] = daily_sum ['time' ].dt .weekday
87+ daily_sum ['week' ] = daily_sum ['time' ].dt .isocalendar ().week
7388
74- # 计算每天的消费总额
75- daily_consumption = df .pivot_table (
89+ # 转换为透视表
90+ daily_consumption = daily_sum .pivot_table (
7691 values = 'amount' ,
7792 index = 'weekday' ,
7893 columns = 'week' ,
@@ -103,8 +118,20 @@ def plot_consumption_heatmap(df, ax, title):
103118
104119def plot_daily_trend (df , ax ):
105120 """绘制每日消费趋势图"""
106- # 计算每日消费总额
107- daily_sum = df .groupby (df ['time' ].dt .date )['amount' ].sum ().reset_index ()
121+ # 构造时间周期
122+ max_date = df ['time' ].max ().date ()
123+ start_of_year = pd .to_datetime (max_date .year * 10000 + 101 , format = '%Y%m%d' ).date ()
124+ full_date_range = pd .date_range (start = start_of_year , end = max_date , freq = 'D' )
125+
126+ # 将未消费的天补一条值为0的消费,并按天累加
127+ daily_sum = (
128+ df .assign (date = df ['time' ].dt .normalize ()) # 将 time 转成日期
129+ .groupby ('date' )['amount' ]
130+ .sum ()
131+ .reindex (full_date_range , fill_value = 0 ) # 用完整日期索引补齐缺失天数
132+ .reset_index ()
133+ )
134+ daily_sum .columns = ['time' , 'amount' ]
108135
109136 # 计算7日移动平均线
110137 daily_sum ['MA7' ] = daily_sum ['amount' ].rolling (
0 commit comments