六、数据(分组)计算

1 常用统计函数:

df['xxx'].mean() # 均值
df.mean().mean() # 全体平均数
df[xxx'].median() # 中位数
df[xxx'].var() # 方差
df[xxx'].std() # 标准差
max(),min() # 最大(小)值

2 diff()函数:计算上下行差值:

# 方法一:Series.diff()
df['xxx'].diff()

# 方法二:shift(1)
diff = df['xxx'] - df['xxx'].shift(1)

3 pct_change()函数:计算上下行变化率:

# 方法一:Series.pct_change()
df['xxx'].pct_change()

# 方法二:shift(1)
df['xxx']/df['xxx'].shift(1) - 1

4 shft()函数:将数据往后(前)移动x天:

shift(x)
shift(-x)

5 rolling()函数:以5个数据作为滑动窗口,取均值/总和:

df['xxx'].rolling(5).mean()
df['xxx'].rolling(10).sum()
# 应用:将收盘价5日均线、20日均线与原始数据绘制再同一个图上

#方法一:
mean_5 = data['收盘价(元)'].rolling(5).mean()
mean_20 = data['收盘价(元)'].rolling(20).mean()

font = {'family':'MicroSoft YaHei', 'weight':'bold', 'size': 12}
matplotlib.rc('font', **font)

plt.rc('figure', figsize=(16,6), dpi=150) #设置图的大小
plt.plot(data['收盘价(元)'], label='原始数据')
plt.plot(mean_5, label='5日均线')
plt.plot(mean_20, label='20日均线')

plt.legend(loc='upper right')
plt.show()

#方法二:
data['收盘价(元)'].plot()
data['收盘价(元)'].rolling(5).mean().plot()
data['收盘价(元)'].rolling(20).mean().plot()

 

 

6 expanding()函数:

DataFrame.expanding(min_periods = 1,center = False,axis = 0)

# 计算某列的移动窗口均值:
df['xxx'].expanding(min_periods = 1).mean()

rolling()函数,是固定窗口大小,进行滑动计算,expanding()函数只设置最小的观测值数量,不固定窗口大小,实现累计计算,即不断扩展;

Pandas进阶之窗口函数rolling()和expanding():https://www.jianshu.com/p/b8c795345e93

7 agg()函数:

(1)同时对xx1, xxx2两列进行计算:

df[['xxx1', 'xxx2']].agg([np.sum, np.mean, np.median, np.min, np.max, np.std, np.var])
df[['xxx1', 'xxx2']].agg(['sum', 'mean', 'median', 'min', 'max', 'std', 'var'])

(2)对'xxx1'列求平均,对'xxx2'列求和:

# 方法一:分开再汇总
salary_mean = df['salary'].mean()
score_sum = df['score'].sum()
salary_mean, score_sum

# 方法二:agg()函数
df.agg({'xxx1' : np.sum, 'xxx2' : np.mean})

8 分组计算:

(1)根据某列元素分组后计算平均值/中位数:

df.groupby('xxx').mean()
df.groupby('xxx').median()

(2)按'xxx1'分组后,'xxx2'列元素最多的是:

# 方法一:head()取行
df[['xxx1', 'xxx2']].groupby('xxx1').sum().sort_values(by='xxx2', ascending=False).head(1)

# 方法二:iloc取行
pd.DataFrame(df[['xxx1', 'xxx2']].groupby('xxx1').sum().sort_values(by='xxx2', ascending=False).iloc[0,:])

# 方法三:分组后采用agg函数求和
df[['xxx1', 'xxx2']].groupby('xxx1').agg({'xxx2':'sum'}).sort_values(by='xxx2', ascending=False).head(1)

(3)自定义函数修正日期:

def change_year(x):
    year = x.year - 100 if x.year > 1999 else x.year
    return datetime.date(year, x.month, x.day)

df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(change_year).astype('datetime64[ns]')
df.head()

9 query()函数:df.query('month == 1')等同于df[df.month==1]

(1)计算一月份('month ==1')的平均值:

df['date'] = df.index

df['year'] = df['date'].apply(lambda x: x.year)
df['month'] = df['date'].apply(lambda x: x.month)
df['day'] = df['date'].apply(lambda x: x.day)

january_df = df.query('month==1')  #query等同于df[df.month==1]    
january_df.mean()

(2)按年为频率取样:

df.query('month == 1 and day == 1')

(3)按月为频率取样:

df.query('day == 1')

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数分小白龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值