演示步骤:
- 读取连续3年的天气数据
- 方法1:Pandas.Series.pct.change
- 方法2:Pandas.Series.shift
- 方法3:Pandas.Series.dif
pct_change、shift、diff,都实现了跨越多行的数据计算
# 读取连续3年的天气数据
import pandas as pd
%matplotlib inline
df = pd.read_csv('./beijing_tianqi_2017-2019.csv',index_col='ymd',parse_dates=True)
# df.info()
df.head()
# 数据处理
df['bWendu'] = df['bWendu'].str.replace("℃",'').astype('int32')
df['yWendu'] = df['yWendu'].str.replace("℃",'').astype('int32')
# 新的df,为每个月的平均气温
df = df[['bWendu']].resample('M').mean()
# 将索引按照日期升序排列
df.sort_index(ascending=True,inplace=True)
df.head()
# 去除索引为 '2017-04-30'的数据,不连续月份
# df = df[~(df.index == '2017-04-30')]
df.index
df.plot()
# 方法1:pandas.Series.pct_change
'''pct_change方法直接算好了“(新-旧)/旧”的百分比'''
df['bWendu_way1_huanbi'] = df['bWendu'].pct_change(periods =1)
df['bWendu_way1_tongbi'] = df['bWendu'].pct_change(periods =12)
df.head(15)
# 方法2:pandas.Series.shift
'''shift用于移动数据,但是保持索引不变'''
pd.concat(
[df['bWendu'],
df['bWendu'].shift(periods = 1),
df['bWendu'].shift(periods = 12)],
axis = 1
).head(15)
# 环比
series_shifts1 = df['bWendu'].shift(periods=1)
df['bWendu_way2_huanbi'] = (df['bWendu'] - series_shifts1)/series_shifts1
# 同比
series_shifts2 = df['bWendu'].shift(periods=12)
df['bWendu_way2_tongbi'] = (df['bWendu'] - series_shifts2)/series_shifts2
df.head(15)
# 方法3:pandas.Series.diff
'''pandas.Series.diff 用于新值减去旧值'''
pd.concat(
[df['bWendu'],
df['bWendu'].diff(periods = 1),
df['bWendu'].diff(periods = 12)],
axis = 1
).head(15)
# 环比
series_diff1 = df['bWendu'].diff(periods=1)
df['bWendu_way3_huanbi'] = series_diff1/(df['bWendu'] - series_diff1 )
# 同比
series_diff2 = df['bWendu'].diff(periods=12)
df['bWendu_way3_tongbi'] = series_diff2/(df['bWendu'] - series_diff2 )
df.head(15)
原始数据前5行: