我正在从加密货币交易所获取时间序列数据并将它们存储在数据框中。 我想在回测和实时交易中使用这个数据框。 dataframe 有一个“收盘”价格列,我想检查最后 4 个“收盘”价格是否严格上涨。
因此,如果给定的数据帧是:
index time open high low close volume
1 1618618500000 61648.9 61695.3 61188.4 61333.2 72.375605
2 1618619400000 61333.1 61396.4 61144.2 61200.0 52.882392
3 1618620300000 61200.0 61509.4 61199.9 61446.2 48.429485
4 1618621200000 61446.2 61764.7 61446.2 61647.4 83.822974
5 1635909300000 63006.2 63087.2 62935.0 63081.9 35.265568
6 1635910200000 63081.9 63214.5 62950.1 63084.0 41.213263
7 1635911100000 63084.0 63236.0 63027.6 63213.9 32.429295
8 1635912000000 63213.8 63213.8 63021.5 63024.1 47.032509
9 1635912900000 63024.1 63091.4 62852.1 62970.7 84.098123
10 1635904800000 63133.8 63133.8 62744.1 62874.7 85.604461
11 1635905700000 62874.7 62970.8 62853.0 62945.5 56.390176
12 1635906600000 62942.1 63089.9 62935.0 63089.9 44.340149
13 1635907500000 63089.9 63217.0 63013.6 63156.2 50.565914
14 1635908400000 63156.2 63156.2 62994.7 63006.2 60.634036
15 1635909300000 63006.2 63087.2 62935.0 63081.9 35.265568
16 1635910200000 63081.9 63214.5 62950.1 63084.0 41.213263
17 1635911100000 63084.0 63236.0 63027.6 63213.9 32.429295
18 1635912000000 63213.8 63213.8 63021.5 63024.1 47.032509
19 1635912900000 63024.1 63091.4 62852.1 62970.7 84.098123
那我想做
index time open high low close volume monotonic_inc
1 1618618500000 61648.9 61695.3 61188.4 61333.2 72.375605 NAN
2 1618619400000 61333.1 61396.4 61144.2 61200.0 52.882392 NAN
3 1618620300000 61200.0 61509.4 61199.9 61446.2 48.429485 NAN
4 1618621200000 61446.2 61764.7 61446.2 61647.4 83.822974 NAN
5 1635909300000 63006.2 63087.2 62935.0 63081.9 35.265568 False
6 1635910200000 63081.9 63214.5 62950.1 63084.0 41.213263 True
7 1635911100000 63084.0 63236.0 63027.6 63213.9 32.429295 True
8 1635912000000 63213.8 63213.8 63021.5 63024.1 47.032509 False
9 1635912900000 63024.1 63091.4 62852.1 62970.7 84.098123 False
10 1635904800000 63133.8 63133.8 62744.1 62874.7 85.604461 False
11 1635905700000 62874.7 62970.8 62853.0 62945.5 56.390176 False
12 1635906600000 62942.1 63089.9 62935.0 63089.9 44.340149 False
13 1635907500000 63089.9 63217.0 63013.6 63156.2 50.565914 True
14 1635908400000 63156.2 63156.2 62994.7 63006.2 60.634036 False
15 1635909300000 63006.2 63087.2 62935.0 63081.9 35.265568 False
16 1635910200000 63081.9 63214.5 62950.1 63084.0 41.213263 False
17 1635911100000 63084.0 63236.0 63027.6 63213.9 32.429295 True
18 1635912000000 63213.8 63213.8 63021.5 63024.1 47.032509 False
19 1635912900000 63024.1 63091.4 62852.1 62970.7 84.098123 False
我不想使用 .iloc 或任何索引引用,更喜欢使用矢量化操作 由于我想在实时交易环境中使用我的程序,因此速度和内存效率很重要。
感谢您的时间,感谢您的努力。
我测试了一个简单的版本来检查之前的收盘价:
dataframe['increasing'] = dataframe.apply(lambda x : 1 if dataframe['close'] > dataframe['close'].shift() else 0)
但这返回了一个错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
df['increasing'] = np.where(df['close'] > df['close'].shift(), 1, 0)
此代码将创建一个名为“increasing”的新列。当今天的“收盘”价格大于昨天的“收盘”价格时,它将指示 1,如果不是,则指示 0。
来自
numpy.where
文档:
当 True 时,产生 x,否则产生 y。
您可以计算
diff
并在布尔值上使用 rolling
/sum
:
df['increasing'] = df['close'].diff().gt(0).rolling(3).sum().eq(3)
注意。我不确定你的示例输出
您可以使用窗口函数并检查窗口的单调性 -
def check_list_monotonic_increase(lst):
lst = list(lst)
return all(lst[i] < lst[i + 1] for i in range(len(lst) - 1))
s = pd.Series(np.random.rand(10))
#0 0.963020
#1 0.121435
#2 0.694150
#3 0.269287
#4 0.390505
#5 0.641838
#6 0.771216
#7 0.909652
#8 0.791609
#9 0.382845
s.rolling(4).agg(check_list_monotonic_increase)
#0 NaN
#1 NaN
#2 NaN
#3 0.0
#4 0.0
#5 0.0
#6 1.0
#7 1.0
#8 0.0
#9 0.0