df[ high ].rolling(window=2*N-1, center=True)包括开头数据,不包括结尾数据
时间: 2024-04-29 22:19:52 浏览: 259
这个问题涉及到 Pandas 中 DataFrame 的滚动窗口函数 rolling() 的用法。rolling() 函数可以对 DataFrame 进行滚动窗口计算,其中 window 参数指定窗口大小,center 参数指定窗口是否居中,而 high 则是 DataFrame 的一个列名。
根据你的描述,rolling() 函数的 window 参数是 2*N-1,因此窗口大小为 2*N-1。而 center 参数为 True,则表示窗口居中,即以当前行为中心,左右各取 window//2 个样本。因此,rolling() 函数包括开头数据,但不包括结尾数据。
举个例子,假设 DataFrame 的行数为 10,window=5,center=True。对于第一行,其滚动窗口包括前 2 个样本和当前样本,共 3 个样本;对于最后一行,其滚动窗口包括后 2 个样本和当前样本,共 3 个样本。因此,rolling() 函数不包括结尾数据。
相关问题
import pandas as pd window_size = 4 # 定义窗口大小 df = pd.read_csv('stock_data.csv') if len(df) >= window_size and window_size > 0: df['four_days_increase'] = df['close'].rolling(window=window_size).apply(lambda x: all(x[i] < x[i+1] for i in range(window_size-1))) * 1 if len(df) >= window_size-1 and window_size > 0: df['three_days_decrease'] = df['close'].rolling(window=window_size-1).apply(lambda x: all(x[i] > x[i+1] for i in range(window_size-2))) * 1修改此代码,避免出现0 is not in range
如果你仍然遇到 `0 is not in range` 的错误,可以尝试以下两种方法:
1. 检查数据中是否有缺失值。如果数据中有缺失值,可能会导致rolling函数中的窗口大小小于指定的窗口大小,从而导致错误。你可以使用 `df.isnull().sum()` 来检查数据中是否有缺失值。
2. 将lambda函数中的 `range(window_size-1)` 和 `range(window_size-2)` 改为 `range(window_size)` 和 `range(window_size-1)`,这样可以确保范围中包含数字0。
修改后的代码如下:
```
import pandas as pd
window_size = 4 # 定义窗口大小
df = pd.read_csv('stock_data.csv')
if len(df) >= window_size and window_size > 0:
df['four_days_increase'] = df['close'].rolling(window=window_size).apply(lambda x: all(x[i] < x[i+1] for i in range(window_size))) * 1
if len(df) >= window_size-1 and window_size > 0:
df['three_days_decrease'] = df['close'].rolling(window=window_size-1).apply(lambda x: all(x[i] > x[i+1] for i in range(window_size-1))) * 1
```
注意,这里仅仅是对错误的解决方案,如果是数据问题,需要对数据进行处理。
def myself_kdj(df,N=9,M1=3,M2=3): low_list = df['low'].rolling(N).min() low_list.fillna(value=df['low'].expanding().min(), inplace=True) high_list = df['high'].rolling(N).max() high_list.fillna(value = df['high'].expanding().max(), inplace=True) rsv = (df['close'] - low_list) / (high_list - low_list) * 100 df['k'] = pd.DataFrame(rsv).ewm(M1-1).mean() df['d'] = df['k'].ewm(M2-1).mean() df['j'] = 3 * df['k'] - 2 * df['d'] return df
这是一个自定义的KDJ指标计算函数`myself_kdj`,它使用了rolling、expanding和ewm函数来计算KDJ指标。函数接受一个包含股票数据的DataFrame作为输入,并返回包含KDJ指标的DataFrame。
函数的参数说明如下:
- `df`:包含股票数据的DataFrame,需要包含'high'、'low'和'close'列。
- `N`:KDJ指标的周期参数,默认为9。
- `M1`:K值的平滑参数,默认为3。
- `M2`:D值的平滑参数,默认为3。
以下是使用这个自定义函数计算KDJ指标的示例代码:
```python
import pandas as pd
# 假设你有一个包含股票数据的DataFrame,其中包含'high'、'low'和'close'列
data = pd.read_csv('stock_data.csv')
# 使用自定义函数计算KDJ指标
data = myself_kdj(data, N=9, M1=3, M2=3)
print(data)
```
请根据实际情况修改代码,适应你的数据格式和需求。需要注意的是,这只是一个简单的KDJ指标计算示例,你可能还需要考虑其他因素,如参数调优和数据预处理等。
阅读全文