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)优化这段代码
时间: 2023-10-16 14:09:50 浏览: 217
Freq_Count_Test-8.15.zip_freq count_频率计
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)
```
阅读全文