d = data_2_1.groupby('校园卡号').agg({'消费次数':np.size,'消费金额':np.sum})[['消费金额','消费次数']] # 封装箱线图 boxplot(data = d) # 依据箱线图去除异常数据 d = d[ (d['消费金额'] < 800) & (d['消费次数'] < 180)] print(d.mean()) data_3_zhuanye = data_2_1.query("专业名称 in ['18国际金融','18会计','18商务日语']") a = data_3_zhuanye.groupby(['专业名称','性别'])['消费金额'].mean().unstack() a = np.round(a,2) # 小数点两位且四舍五入 with sns.color_palette('Blues_r'): bar = a.plot.bar() plt.xticks(rotation =0) plt.title('平均每次刷卡金额') for i in bar.containers: plt.bar_label(i)
时间: 2023-09-24 18:07:08 浏览: 107
这段代码看起来是一个数据分析的过程。首先,将数据按照校园卡号分组,统计每个校园卡号的消费次数和消费金额,然后绘制箱线图以便去除异常数据。接着,将统计结果中消费金额小于800元且消费次数小于180的数据保留下来,并计算这些数据的平均值。最后,从原始数据中筛选出专业名称为'18国际金融'、'18会计'、'18商务日语'的记录,并按照性别和消费金额进行分组计算平均值,将结果绘制成条形图。其中,使用了Python中的pandas和seaborn库。
相关问题
def create_popularity_recommendation(train_data,user_id,item_id): train_data_grouped = train_data.groupby([item_id]).agg({user_id:'count'}).reset_index() train_data_grouped.rename(columns = {user_id:'score'},inplace=True) train_data_sort = train_data_grouped.sort_values(['score',item_id], ascending = [0,1]) train_data_sort['Rank'] = train_data_sort['score'].rank(ascending=0, method='first') popularity_recommentation = train_data_sort.head(20) return popularity_recommentation
这是一个基于流行度的推荐算法函数,使用给定的训练数据(train_data)和用户ID(user_id)、物品ID(item_id),返回一份表示最受欢迎的推荐(popularity recommendation)的数据表。首先,将训练数据按照物品ID分组,计算每个物品ID对应的用户数量并按照数量进行降序排列,然后根据排名生成推荐结果,最后返回前20个结果。
key = pd.PeriodIndex(data['DATA_DATE'], freq='m') month = data.groupby(by=['CONS_NO', key]) # 按月进行分组 month_sum = month.sum() # 求和的比值 s_e_1, t_f_1 = date_filter(month_sum) s_e_sum = s_e_1.groupby('CONS_NO').sum() t_f_sum = t_f_1.groupby('CONS_NO').sum() se_tf_sum_ratio = date_merge(s_e_sum, t_f_sum, 'sum_ratio') print("每个用户七八月电量和与三四月电量和的比值:\n", se_tf_sum_ratio) month_max = month.max() # 求最大值的比值 s_e_2, t_f_2 = date_filter(month_max) s_e_max = s_e_2.groupby('CONS_NO').max().loc[:, 'KWH'] t_f_max = t_f_2.groupby('CONS_NO').max().loc[:, 'KWH'] se_tf_max_ratio = date_merge(s_e_max, t_f_max, 'max_ratio') print("每个用户七八月电量最大值与三四月电量最大值的比值:\n", se_tf_max_ratio) month_min = month.min() # 求最小值的比值 s_e_3, t_f_3 = date_filter(month_min) s_e_min = s_e_3.groupby('CONS_NO').min().loc[:, 'KWH'] t_f_min = t_f_3.groupby('CONS_NO').min().loc[:, 'KWH'] se_tf_min_ratio = date_merge(s_e_min, t_f_min, 'min_ratio') print("每个用户七八月电量最小值与三四月电量最小值的比值:\n", se_tf_min_ratio) month_mean_sum = month.sum() # 求平均值的比值 s_e_4, t_f_4 = date_filter(month_mean_sum) s_e_mean = s_e_4.groupby('CONS_NO').apply(lambda x: x.sum() / 122) # 先计算每个用户七八月份总的用电量,然后除以总天数,得到平均值 t_f_mean = t_f_4.groupby('CONS_NO').apply(lambda x: x.sum() / 122) # 同上 se_tf_mean_ratio = date_merge(s_e_mean, t_f_mean, 'mean_ratio') print("每个用户七八月电量平均值与三四月电量平均值的比值:\n", se_tf_mean_ratio)优化这段代码
1. 可以将 date_filter 和 date_merge 函数合并为一个函数,避免重复代码。
2. 可以使用 agg 方法代替 apply 方法,进一步提高性能。
3. 可以使用 inplace=True 参数来避免不必要的赋值操作,减少内存占用。
4. 可以使用 pd.Grouper 代替 pd.PeriodIndex 和 groupby(by=...),使代码更加简洁。
优化后的代码如下:
```
import pandas as pd
# 定义日期过滤器和数据合并函数
def date_filter_and_merge(df, func):
s_e, t_f = func(df)
s_e = s_e.groupby('CONS_NO').agg(sum=('KWH', 'sum'), max=('KWH', 'max'), min=('KWH', 'min'), mean=('KWH', 'sum')) / 122
t_f = t_f.groupby('CONS_NO').agg(sum=('KWH', 'sum'), max=('KWH', 'max'), min=('KWH', 'min'), mean=('KWH', 'sum')) / 122
ratio = s_e / t_f
return ratio
# 读取数据
data = pd.read_csv('data.csv')
# 按月进行分组
month = data.groupby(['CONS_NO', pd.Grouper(key='DATA_DATE', freq='m')])
# 计算比值
se_tf_sum_ratio = date_filter_and_merge(month, lambda x: x.sum())
se_tf_max_ratio = date_filter_and_merge(month, lambda x: x.max())
se_tf_min_ratio = date_filter_and_merge(month, lambda x: x.min())
se_tf_mean_ratio = date_filter_and_merge(month, lambda x: x.sum())
# 输出结果
print("每个用户七八月电量和与三四月电量和的比值:\n", se_tf_sum_ratio)
print("每个用户七八月电量最大值与三四月电量最大值的比值:\n", se_tf_max_ratio)
print("每个用户七八月电量最小值与三四月电量最小值的比值:\n", se_tf_min_ratio)
print("每个用户七八月电量平均值与三四月电量平均值的比值:\n", se_tf_mean_ratio)
```
阅读全文