Pandas按前向滚动天数间隔分组

carvr3hs  于 2024-01-04  发布在  其他
关注(0)|答案(3)|浏览(74)

我有每日的股票数据,包括符号,日期,关闭多个符号。我试图完成以下任务:
1.查找前向滚动最小关闭值
1.窗口大小= 5日历天(不是5行)。
1.按符号分组
数据

Date, Symbol, Close
2021-01-01, AAPL, 10
2021-01-02, AAPL, 12
2021-01-03, AAPL, 3
2021-01-04, AAPL, 20
2021-01-05, AAPL, 15
2021-01-01, MSFT, 12
2021-01-02, MSFT, 20
2021-01-03, MSFT, 12
2021-01-04, MSFT, 20
2021-01-05, MSFT, 20

字符串
当前尝试:

df.assign(min_roll=df.iloc[::-1].groupby(df['Symbol']).rolling(on='Date',window='5D',min_periods=1)['Close'].min().sort_index(level=1).reset_index(0,drop=True))


按日期降序排序,以便按日期前向滚动df.iloc[::-1]
当应用rolling(on='Date'window='5D'时,我得到一个错误:

ValueError: cannot reindex on an axis with duplicate labels


如果没有时间间隔组件,代码将按预期工作5行(不是日历天)

df.assign(min_roll=df.iloc[::-1].groupby(df['Symbol']).rolling(5,min_periods=1)['Close'].min().sort_index(level=1).reset_index(0,drop=True))


我做错了什么?

m3eecexj

m3eecexj1#

你的问题是,你试图指定一个窗口,它通过索引,作为5D,没有一个日期时间索引。
要解决此问题,请使用此:

df.set_index('Date', inplace=True)

字符串
我在应用以下代码时得到了这个:

import pandas as pd

data = {
    'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
    'Symbol': ['AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'MSFT', 'MSFT', 'MSFT', 'MSFT', 'MSFT'],
    'Close': [10, 12, 3, 20, 15, 12, 20, 12, 20, 20]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df = df.sort_values(by=['Symbol', 'Date'])
df['Forward_Rolling_Min'] = df.groupby('Symbol')['Close'].rolling(window='5D').min().reset_index(level=0, drop=True)
print(df)


结果如下:

Symbol  Close  Forward_Rolling_Min
Date                                         
2021-01-01   AAPL     10                 10.0
2021-01-02   AAPL     12                 10.0
2021-01-03   AAPL      3                  3.0
2021-01-04   AAPL     20                  3.0
2021-01-05   AAPL     15                  3.0
2021-01-01   MSFT     12                 12.0
2021-01-02   MSFT     20                 12.0
2021-01-03   MSFT     12                 12.0
2021-01-04   MSFT     20                 12.0
2021-01-05   MSFT     20                 12.0


所以作为一个总结:你的问题是DF的索引,如果我的语义对你不起作用,也许我的语法会;)

rryofs0p

rryofs0p2#

可以使用DataFrame.merge代替assign

out = (df.merge(df.iloc[::-1].groupby(df['Symbol'])
                .rolling(on='Date',window='5D',min_periods=1)['Close']
                .min().rename('min_roll'), on=['Symbol','Date']))
print(out)
        Date Symbol  Close  min_roll
0 2021-01-01   AAPL     10       3.0
1 2021-01-02   AAPL     12       3.0
2 2021-01-03   AAPL      3       3.0
3 2021-01-04   AAPL     20      15.0
4 2021-01-05   AAPL     15      15.0
5 2021-01-01   MSFT     12      12.0
6 2021-01-02   MSFT     20      12.0
7 2021-01-03   MSFT     12      12.0
8 2021-01-04   MSFT     20      20.0
9 2021-01-05   MSFT     20      20.0

字符串

8aqjt8rx

8aqjt8rx3#

下面的工作对我来说。变量是列包含股票名称。天是列包含日期。价值是股票价格。

stock_new_data['mean']=stock_new_data.groupby(["Day","variable"])['value'].rolling(window=5,min_periods=1).mean().reset_index(level=0,drop=True).reset_index(drop=True)
stock_new_data

字符串

相关问题