Pandas resample, groupby, grouper, agg

介绍:

本文重点介绍了pandas中resample、groupby、Grouper和agg函数的使用。

resample

Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。
降采样:高频数据到低频数据
升采样:低频数据到高频数据
主要函数:resample()(pandas对象都会有这个方法)

resample方法的参数

参数说明
freq表示重采样频率,例如‘M’、‘5min’,Second(15)
how=’mean’用于产生聚合值的函数名或数组函数,例如‘mean’、‘ohlc’、np.max等,默认是‘mean’,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’
axis=0默认是纵轴,横轴设置axis=1
fill_method = None升采样时如何插值,比如‘ffill’、‘bfill’等
closed = ‘right’在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’
label= ‘right’在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:30
loffset = None面元标签的时间校正值,比如‘-1s’或Second(-1)用于将聚合标签调早1秒
limit=None在向前或向后填充时,允许填充的最大时期数
kind = None聚合到时期(‘period’)或时间戳(‘timestamp’),默认聚合到时间序列的索引类型
convention = None当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end’

首先创建一个series,采样频率为一分钟。

%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
index = pd.date_range('1/1/2000', periods=9, freq='T')
series = pd.Series(range(9), index=index)
series
2000-01-01 00:00:00    0
2000-01-01 00:01:00    1
2000-01-01 00:02:00    2
2000-01-01 00:03:00    3
2000-01-01 00:04:00    4
2000-01-01 00:05:00    5
2000-01-01 00:06:00    6
2000-01-01 00:07:00    7
2000-01-01 00:08:00    8
Freq: T, dtype: int64

降低采样频率为三分钟:

series.resample('3T').sum()
2000-01-01 00:00:00     3
2000-01-01 00:03:00    12
2000-01-01 00:06:00    21
Freq: 3T, dtype: int64

降低采样频率为三分钟,但是每个标签使用right来代替left。

注意:bucket中的值用作标签:

series.resample('3T', label='right').sum()
2000-01-01 00:03:00     3
2000-01-01 00:06:00    12
2000-01-01 00:09:00    21
Freq: 3T, dtype: int64

降低采样频率为三分钟,但是关闭right区间,即左开右闭区间

series.resample('3T', label='right', closed='right').sum()
2000-01-01 00:00:00     0
2000-01-01 00:03:00     6
2000-01-01 00:06:00    15
2000-01-01 00:09:00    15
Freq: 3T, dtype: int64

增加采样频率到30秒

series.resample('30S').asfreq()[0:5] # asfreq是日期序列补充函数
2000-01-01 00:00:00    0.0
2000-01-01 00:00:30    NaN
2000-01-01 00:01:00    1.0
2000-01-01 00:01:30    NaN
2000-01-01 00:02:00    2.0
Freq: 30S, dtype: float64

增加采样频率到30S,使用pad方法填充nan值。

series.resample('30S').pad()[0:5]
2000-01-01 00:00:00    0
2000-01-01 00:00:30    0
2000-01-01 00:01:00    1
2000-01-01 00:01:30    1
2000-01-01 00:02:00    2
Freq: 30S, dtype: int64

增加采样频率到30S,使用bfill方法填充nan值。

series.resample('30S').bfill()[0:5]
2000-01-01 00:00:00    0
2000-01-01 00:00:30    1
2000-01-01 00:01:00    1
2000-01-01 00:01:30    2
2000-01-01 00:02:00    2
Freq: 30S, dtype: int64

通过apply运行一个自定义函数

def custom_resampler(array_like):
    return np.sum(array_like) + 5
series.resample('3T').apply(custom_resampler)
2000-01-01 00:00:00     8
2000-01-01 00:03:00    17
2000-01-01 00:06:00    26
Freq: 3T, dtype: int64

groupby && Grouper

什么是group by

groupby就是按xx分组, 它也确实是用来实现这样功能的.

data = pd.read_excel('original_data.xls')
data.sample(10)
热水器编号发生时间开关机状态加热中保温中有无水流实际温度热水量水流量节能模式加热剩余时间当前设置温度
2833R_000012014102121460439°C25%3011分钟50°C
13993R_000012014110507245830°C0%00分钟50°C
5933R_000012014102503370029°C0%00分钟50°C
14002R_000012014110507264731°C0%00分钟50°C
7228R_000012014102604431330°C0%00分钟50°C
2825R_000012014102121445539°C25%3012分钟50°C
17044R_000012014110822492443°C50%09分钟50°C
10696R_000012014103119470447°C50%250分钟50°C
15135R_000012014110608420547°C50%00分钟50°C
18449R_000012014111018594847°C50%353分钟50°C
data.groupby('实际温度')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000000000E003588>

这里我们得到了一个叫DataFrameGroupBy的东西, 虽然 pandas 不让我们直接看它长啥样, 但是你将它想象成上面那幅分组后的图(我手绘的)是完全没有问题的.

这里主要介绍如何鼓捣这个DataFrameGroupBy, 这个DataFrameGroupBy主要的功能能是允许你在不额外写循环的情况下, 快速对每一组数据进行操作

1.分组情况

for index, da in data.groupby('实际温度'):
    print(index)
    print(da)
28°C
        热水器编号            发生时间 开关机状态 加热中 保温中 有无水流  实际温度 热水量  水流量 节能模式 加热剩余时间  \
511   R_00001  20141019154300     开   开   关    有  28°C  0%   42    关   31分钟   
512   R_00001  20141019154302     开   开   关    有  28°C  0%   42    关   29分钟   
4334  R_00001  20141024122809     关   关   关    无  28°C  0%    0    关    0分钟   
4336  R_00001  20141024122952     关   关   关    无  28°C  0%    0    关    0分钟   
4338  R_00001  20141024123224     关   关   关    无  28°C  0%    0    关    0分钟   
...       ...             ...   ...  ..  ..  ...   ...  ..  ...  ...    ...   
6215  R_00001  20141025124503     关   关   关    无  28°C  0%    0    关    0分钟   
6216  R_00001  20141025130406     关   关   关    无  28°C  0%    0    关    0分钟   
6217  R_00001  20141025130408     关   关   关    无  28°C  0%   10    关    0分钟   
6218  R_00001  20141025153300     关   关   关    无  28°C  0%    0    关    0分钟   
6219  R_00001  20141025153306     开   开   关    无  28°C  0%    0    关   31分钟   

     当前设置温度  
511    50°C  
512    50°C  
4334   50°C  
4336   50°C  
4338   50°C  
...     ...  
6215   50°C  
6216   50°C  
6217   50°C  
6218   50°C  
6219   50°C  

[824 rows x 12 columns]
29°C
         热水器编号            发生时间 开关机状态 加热中 保温中 有无水流  实际温度 热水量  水流量 节能模式 加热剩余时间  \
4      R_00001  20141019071236     关   关   关    无  29°C  0%    0    关    0分钟   
6      R_00001  20141019071608     关   关   关    无  29°C  0%    0    关    0分钟   
8      R_00001  20141019072010     关   关   关    无  29°C  0%    0    关    0分钟   
10     R_00001  20141019072159     关   关   关    无  29°C  0%    0    关    0分钟   
12     R_00001  20141019072219     关   关   关    无  29°C  0%    0    关    0分钟   
...        ...             ...   ...  ..  ..  ...   ...  ..  ...  ...    ...   
12246  R_00001  20141102173805     开   开   关    无  29°C  0%    0    关   27分钟   
12247  R_00001  20141102173825     开   开   关    无  29°C  0%    0    关   26分钟   
12248  R_00001  20141102173827     开   开   关    无  29°C  0%    0    关   28分钟   
14239  R_00001  20141105151543     开   开   关    无  29°C  0%    0    关   29分钟   
14240  R_00001  20141105151547     开   开   关    无  29°C  0%    0    关   28分钟   

      当前设置温度  
4       50°C  
6       50°C  
8       50°C  
10      50°C  
12      50°C  
...      ...  
12246   50°C  
12247   50°C  
12248   50°C  
14239   50°C  
14240   50°C  

[1729 rows x 12 columns]
30°C
         热水器编号            发生时间 开关机状态 加热中 保温中 有无水流  实际温度  热水量  水流量 节能模式 加热剩余时间  \
0      R_00001  20141019063917     关   关   关    无  30°C   0%    0    关    0分钟   
1      R_00001  20141019070154     关   关   关    无  30°C   0%    0    关    0分钟   
2      R_00001  20141019070156     关   关   关    无  30°C   0%    8    关    0分钟   
3      R_00001  20141019071230     关   关   关    无  30°C   0%    0    关    0分钟   
5      R_00001  20141019071602     关   关   关    无  30°C   0%    0    关    0分钟   
...        ...             ...   ...  ..  ..  ...   ...  ...  ...  ...    ...   
16754  R_00001  20141108214826     开   开   关    无  30°C   0%    0    关   28分钟   
18143  R_00001  20141110160157     开   开   关    无  30°C  25%    0    关   28分钟   
18144  R_00001  20141110160159     开   开   关    无  30°C  25%    0    关   27分钟   
18146  R_00001  20141110160228     开   开   关    无  30°C  25%    0    关   28分钟   
18147  R_00001  20141110160230     开   开   关    无  30°C  25%    0    关   27分钟   

      当前设置温度  
0       50°C  
1       50°C  
2       50°C  
3       50°C  
5       50°C  
...      ...  
16754   50°C  
18143   50°C  
18144   50°C  
18146   50°C  
18147   50°C  

[918 rows x 12 columns]
31°C
         热水器编号            发生时间 开关机状态 加热中 保温中 有无水流  实际温度  热水量  水流量 节能模式 加热剩余时间  \
599    R_00001  20141019155213     开   开   关    无  31°C   0%    0    关   26分钟   
600    R_00001  20141019155219     开   开   关    无  31°C   0%    0    关   25分钟   
1418   R_00001  20141020073544     关   关   关    有  31°C   0%   62    关    0分钟   
1419   R_00001  20141020073546     关   关   关    有  31°C   0%   65    关    0分钟   
1420   R_00001  20141020073548     关   关   关    有  31°C   0%   62    关    0分钟   
...        ...             ...   ...  ..  ..  ...   ...  ...  ...  ...    ...   
18145  R_00001  20141110160205     开   开   关    无  31°C  25%    0    关   26分钟   
18148  R_00001  20141110160326     开   开   关    无  31°C  25%    0    关   26分钟   
18149  R_00001  20141110160407     开   开   关    无  31°C  25%    0    关   25分钟   
18326  R_00001  20141110163715     开   开   关    无  31°C  25%    0    关   26分钟   
18327  R_00001  20141110163808     开   开   关    无  31°C  25%    0    关   25分钟   

      当前设置温度  
599     50°C  
600     50°C  
1418    50°C  
1419    50°C  
1420    50°C  
...      ...  
18145   50°C  
18148   50°C  
18149   50°C  
18326   50°C  
18327   50°C  

[800 rows x 12 columns]

2.进行mean、sum等操作

data.groupby('实际温度')['水流量'].mean()
实际温度
28°C     0.682039
29°C     7.914401
30°C     3.990196
31°C    10.140000
32°C     7.120347
33°C    10.966903
34°C    13.509168
35°C    12.672078
36°C    10.804082
37°C    14.778990
38°C    15.113074
39°C    18.557143
40°C    18.666667
41°C    20.398533
42°C    21.271560
43°C    14.246231
44°C    12.282230
45°C    11.093502
46°C    19.127957
47°C    15.839080
48°C    11.774783
49°C    12.658098
50°C    21.065473
51°C     5.186047
Name: 水流量, dtype: float64
data.groupby('实际温度')['加热剩余时间'].value_counts()
实际温度  加热剩余时间
28°C  0分钟        819
      31分钟         3
      29分钟         2
29°C  0分钟       1540
      25分钟        92
                ... 
49°C  1分钟        140
      2分钟          6
50°C  0分钟       1617
      1分钟          2
51°C  0分钟         86
Name: 加热剩余时间, Length: 132, dtype: int64

注: 这时, 组内操作的结果不是单个值, 是一个序列, 我们可以用.unstack()将它展开:

data.groupby('实际温度')['加热剩余时间'].value_counts().unstack()
加热剩余时间0分钟10分钟11分钟12分钟13分钟14分钟15分钟16分钟17分钟18分钟...29分钟2分钟31分钟3分钟4分钟5分钟6分钟7分钟8分钟9分钟
实际温度
28°C819.0NaNNaNNaNNaN
29°C1540.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...35.0NaN1.0NaNNaNNaNNaNNaNNaNNaN
30°C857.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...2.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
31°C625.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
32°C653.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
33°C625.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
34°C522.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
35°C405.0NaNNaNNaNNaNNaNNaNNaN1.01.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
36°C317.0NaNNaNNaNNaNNaNNaNNaN1.042.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
37°C344.0NaNNaNNaNNaN59.033.046.0113.0119.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
38°C270.0NaNNaNNaNNaN8.055.0186.030.017.0...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
39°C216.0NaN18.011.020.0118.0156.07.014.0NaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
40°C149.039.015.052.098.063.013.0NaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
41°C212.01.081.0105.0NaN9.0NaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaN1.0
42°C160.0123.0101.011.0NaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaN40.0110.0
43°C227.0NaN11.0NaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaN1.05.04.040.0110.0
44°C360.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaN12.076.0114.012.0
45°C342.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaN1.04.037.0156.084.07.0NaN
46°C502.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaN5.0NaN29.0135.0237.0NaN14.0NaNNaN
47°C903.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaN83.0NaN150.0121.012.0NaNNaNNaNNaN
48°C961.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaN135.0NaNNaN6.0NaNNaNNaNNaNNaN
49°C1021.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaN6.0NaNNaNNaNNaNNaNNaNNaNNaN
50°C1617.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
51°C86.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaN

24 rows × 31 columns

3.聚合

对分组后的数据进行聚合:

data.groupby('实际温度').agg(['min', 'max'])
热水器编号发生时间开关机状态加热中保温中...热水量水流量节能模式加热剩余时间当前设置温度
minmaxminmaxminmaxminmaxminmax...minmaxminmaxminmaxminmaxminmax
实际温度
28°CR_00001R_000012014101915430020141025153306...0%0%0420分钟31分钟50°C50°C
29°CR_00001R_000012014101907123620141105151547...0%0%0670分钟31分钟50°C50°C
30°CR_00001R_000012014101906391720141110160230...0%25%0560分钟29分钟50°C50°C
31°CR_00001R_000012014101915521320141110163808...0%25%0660分钟28分钟50°C50°C
32°CR_00001R_000012014101915525020141110163908...0%25%0630分钟26分钟50°C50°C
33°CR_00001R_000012014101915531820141110163951...0%25%0630分钟25分钟50°C50°C
34°CR_00001R_000012014101915540020141110164051...0%25%0630分钟24分钟50°C50°C
35°CR_00001R_000012014101915551920141110164146...0%25%0660分钟22分钟50°C50°C
36°CR_00001R_000012014101915574920141110220338...0%25%0620分钟21分钟50°C50°C
37°CR_00001R_000012014101915581720141110220527...0%25%0510分钟19分钟50°C50°C
38°CR_00001R_000012014101915593420141110220609...0%25%0510分钟18分钟50°C50°C
39°CR_00001R_000012014101915594020141110220710...0%25%0500分钟17分钟50°C50°C
40°CR_00001R_000012014101916011120141110220804...0%25%0520分钟15分钟50°C50°C
41°CR_00001R_000012014101916023920141110220859...0%25%0530分钟9分钟50°C50°C
42°CR_00001R_000012014101916032220141110220959...0%50%0620分钟9分钟50°C50°C
43°CR_00001R_000012014101916052520141110221042...0%50%0720分钟9分钟50°C50°C
44°CR_00001R_000012014101916055720141110221142...0%50%0680分钟9分钟50°C50°C
45°CR_00001R_000012014101916063820141110221219...25%50%0680分钟8分钟50°C50°C
46°CR_00001R_000012014101916080320141110221335...100%50%0680分钟7分钟50°C50°C
47°CR_00001R_000012014101916085520141110221444...100%50%0630分钟5分钟50°C50°C
48°CR_00001R_000012014101916104020141110221551...100%50%0630分钟4分钟50°C50°C
49°CR_00001R_000012014101916110620141110231954...25%50%0630分钟2分钟50°C50°C
50°CR_00001R_000012014101916114920141110232000...100%50%0770分钟1分钟50°C50°C
51°CR_00001R_000012014101918133520141110195611...50%50%0500分钟0分钟50°C50°C

24 rows × 22 columns

对分组后的部分列进行聚合
某些情况,只需要对部分数据进行不同的聚合操作,可以通过字典来构建

num_agg = {'水流量':['min', 'mean', 'max']}
data.groupby('实际温度').agg(num_agg)
水流量
minmeanmax
实际温度
28°C00.68203942
29°C07.91440167
30°C03.99019656
31°C010.14000066
32°C07.12034763
33°C010.96690363
34°C013.50916863
35°C012.67207866
36°C010.80408262
37°C014.77899051
38°C015.11307451
39°C018.55714350
40°C018.66666752
41°C020.39853353
42°C021.27156062
43°C014.24623172
44°C012.28223068
45°C011.09350268
46°C019.12795768
47°C015.83908063
48°C011.77478363
49°C012.65809863
50°C021.06547377
51°C05.18604750
num_agg = {'水流量':['min', 'mean', 'max'], '加热剩余时间':['min', 'max']}
data.groupby('实际温度').agg(num_agg)
水流量加热剩余时间
minmeanmaxminmax
实际温度
28°C00.682039420分钟31分钟
29°C07.914401670分钟31分钟
30°C03.990196560分钟29分钟
31°C010.140000660分钟28分钟
32°C07.120347630分钟26分钟
33°C010.966903630分钟25分钟
34°C013.509168630分钟24分钟
35°C012.672078660分钟22分钟
36°C010.804082620分钟21分钟
37°C014.778990510分钟19分钟
38°C015.113074510分钟18分钟
39°C018.557143500分钟17分钟
40°C018.666667520分钟15分钟
41°C020.398533530分钟9分钟
42°C021.271560620分钟9分钟
43°C014.246231720分钟9分钟
44°C012.282230680分钟9分钟
45°C011.093502680分钟8分钟
46°C019.127957680分钟7分钟
47°C015.839080630分钟5分钟
48°C011.774783630分钟4分钟
49°C012.658098630分钟2分钟
50°C021.065473770分钟1分钟
51°C05.186047500分钟0分钟

4.grouper

data.groupby(['实际温度', pd.Grouper(key='开关机状态')])['水流量'].sum()
实际温度  开关机状态
28°C  关          478
      开           84
29°C  关         5889
      开         7795
30°C  关         2544
      开         1119
31°C  关         3110
      开         5002
32°C  关         2100
      开         3639
33°C  关         3823
      开         5455
34°C  关         6261
      开         3317
35°C  关         4980
      开         2826
36°C  关         2987
      开         2307
37°C  关         3119
      开         7714
38°C  关         2104
      开         6450
39°C  关         2492
      开         7900
40°C  关         2104
      开         5904
41°C  关         4920
      开         3423
42°C  关         3290
      开         8303
43°C  关         3304
      开         2366
44°C  关         4048
      开         3002
45°C  关         2607
      开         4393
46°C  关         7228
      开        10561
47°C  关         9643
      开        11027
48°C  关         9596
      开         3945
49°C  关         9936
      开         4836
50°C  关        19012
      开        15093
51°C  开          446
Name: 水流量, dtype: int64

方法总结

  • 首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby(‘实际温度’)
  • 然后选择需要研究的列, 比如[‘加热剩余时间’], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series
  • 对SeriesGroupby进行操作, 比如.mean(), 相当于对每个组的Series求均值

注: 如果不选列, 那么第三步的操作会遍历所有列, pandas会对能成功操作的列进行操作, 最后返回的一个由操作成功的列组成的DataFrame

可视化

https://www.jianshu.com/p/42f1d2909bb6

Pandas中,groupby函数可以根据指定的列对DataFrame进行分组,并对每个分组应用聚合函数。agg函数是groupby函数的一个参数,用于指定要应用的聚合函数。例如,可以使用agg函数来计算每个分组中的最大值、平均值和总和。 使用agg函数时,可以将聚合函数作为一个列表传递给f_agg参数。例如,可以使用['max', 'mean', 'sum']来计算每个分组中的最大值、平均值和总和。 另外,groupby对象还有其他一些有用的方法,如transform和apply。transform方法可以对每个分组进行操作,并返回一个与原始DataFrame具有相同形状的新DataFrame。例如,可以使用transform方法来填充每个分组中的空值。 apply方法可以对每个分组应用自定义的函数,并返回一个包含结果的新DataFrame。例如,可以使用apply方法来填充每个分组中的空值。 综上所述,使用groupby的agg方法可以对DataFrame进行分组并应用聚合函数,而transform和apply方法可以对每个分组进行操作,并返回一个新的DataFrame。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Pandas DataFrame: groupby agg的使用](https://blog.csdn.net/chenhepg/article/details/125567150)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值