检查数据框列是否严格增加

问题描述 投票:0回答:3

我正在从加密货币交易所获取时间序列数据并将它们存储在数据框中。 我想在回测和实时交易中使用这个数据框。 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().
pandas dataframe numpy
3个回答
2
投票
df['increasing'] = np.where(df['close'] > df['close'].shift(), 1, 0)

此代码将创建一个名为“increasing”的新列。当今天的“收盘”价格大于昨天的“收盘”价格时,它将指示 1,如果不是,则指示 0。

来自

numpy.where
文档

当 True 时,产生 x,否则产生 y。


1
投票

您可以计算

diff
并在布尔值上使用
rolling
/
sum

df['increasing'] = df['close'].diff().gt(0).rolling(3).sum().eq(3)

注意。我不确定你的示例输出


1
投票

您可以使用窗口函数并检查窗口的单调性 -

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
© www.soinside.com 2019 - 2024. All rights reserved.