python DataFrame的shift()方法

在python数据分析中,可以使用shift()方法对DataFrame对象的数据进行位置的前滞、后滞移动。

                   在这里插入图片描述在这里插入图片描述在这里插入图片描述

语法

DataFrame.shift(periods=1, freq=None, axis=0)

  • periods可以理解为移动幅度的次数,shift默认一次移动1个单位,也默认移动1次(periods默认为1),则移动的长度为1 * periods。
    periods可以是正数,也可以是负数。负数表示前滞,正数表示后滞。
  • freq是一个可选参数,默认为None,可以设为一个timedelta对象。适用于索引为时间序列数据时。
    freq为None时,移动的是其他数据的值,即移动periods*1个单位长度。
    freq部位None时,移动的是时间序列索引的值,移动的长度为periods * freq个单位长度。
  • axis默认为0,表示对列操作。如果为行则表示对行操作。

移动滞后没有对应值的默认为NaN。
         在这里插入图片描述


示例


period为正,无freq

import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
data = [51.0, 52.33, 51.21, 54.23, 56.78]
index = ['2022-2-28', '2022-3-1', '2022-3-2', '2022-3-3', '2022-3-4']
df = pd.DataFrame(data=data, index=index, columns=['close'])
df.index.name = 'date'
print(df)
print("=========================================")
df['昨收'] = df['close'].shift()
df['change'] = df['close'] - df['close'].shift()
print(df)

在这里插入图片描述


period为负,无freq

import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
data = [51.0, 52.33, 51.21, 54.23, 56.78]
index = ['2022-2-28', '2022-3-1', '2022-3-2', '2022-3-3', '2022-3-4']
index = pd.to_datetime(index)
index.name = 'date'

df = pd.DataFrame(data=data, index=index, columns=['昨收'])
print(df)
print("=========================================")
df['close'] = df['昨收'].shift(-1)
df['change'] = df['昨收'].shift(-1) - df['close']
print(df)

在这里插入图片描述


period为正,freq为正

import pandas as pd
import datetime
pd.set_option('display.unicode.east_asian_width', True)
data = [51.0, 52.33, 51.21, 54.23, 56.78]
index = ['2022-2-28', '2022-3-1', '2022-3-2', '2022-3-3', '2022-3-4']
index = pd.to_datetime(index)
index.name = 'date'
df = pd.DataFrame(data=data, index=index, columns=['close'])
print(df)
print("=========================================")
print(df.shift(periods=2, freq=datetime.timedelta(3)))

如图,索引列的时间序列数据滞后了6天。(二乘以三)
在这里插入图片描述

period为正,freq为负

import pandas as pd
import datetime
pd.set_option('display.unicode.east_asian_width', True)
data = [51.0, 52.33, 51.21, 54.23, 56.78]
index = ['2022-2-28', '2022-3-1', '2022-3-2', '2022-3-3', '2022-3-4']
index = pd.to_datetime(index)
index.name = 'date'
df = pd.DataFrame(data=data, index=index, columns=['close'])
print(df)
print("=========================================")
print(df.shift(periods=3, freq=datetime.timedelta(-3)))

如图,索引列的时间序列数据前滞了9天(三乘以负三)
在这里插入图片描述

period为负,freq为负

import pandas as pd
import datetime
pd.set_option('display.unicode.east_asian_width', True)
data = [51.0, 52.33, 51.21, 54.23, 56.78]
index = ['2022-2-28', '2022-3-1', '2022-3-2', '2022-3-3', '2022-3-4']
index = pd.to_datetime(index)
index.name = 'date'
df = pd.DataFrame(data=data, index=index, columns=['close'])
print(df)
print("=========================================")
print(df.shift(periods=-3, freq=datetime.timedelta(-3)))

如图,索引列的时间序列数据滞后了9天(负三乘以负三)
在这里插入图片描述

  • 49
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Pandas 中,`groupby` 函数可以把数据按照指定的列进行分组,然后对每个分组进行相应的操作。如果我们需要对每个分组中的某一列进行位移操作,可以使用 `shift` 函数。 例如,假设我们有一个 DataFrame,其中包含了每个城市每天的温度数据,我们想要计算每个城市两天之间的温度变化,可以按照城市进行分组,然后对温度列进行 `shift` 操作,如下所示: ```python import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'city': ['Beijing', 'Beijing', 'Beijing', 'Shanghai', 'Shanghai', 'Shanghai'], 'date': ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-01', '2020-01-02', '2020-01-03'], 'temperature': [1, 2, 3, 4, 5, 6] }) # 按照城市分组,并对温度列进行 shift 操作 df['temperature_change'] = df.groupby('city')['temperature'].shift(-1) - df['temperature'] print(df) ``` 输出结果如下: ``` city date temperature temperature_change 0 Beijing 2020-01-01 1 1.0 1 Beijing 2020-01-02 2 1.0 2 Beijing 2020-01-03 3 NaN 3 Shanghai 2020-01-01 4 1.0 4 Shanghai 2020-01-02 5 1.0 5 Shanghai 2020-01-03 6 NaN ``` 可以看到,我们成功地计算出了每个城市两天之间的温度变化。在这个例子中,我们使用了 `shift(-1)` 对温度列进行位移操作,表示往后移动一行。如果我们想要往前移动一行,可以使用 `shift(1)`。同时,我们还需要对计算出的结果进行命名,这里我们把它命名为 `temperature_change`。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

侯小啾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值