检测Python数据集中的区域
我试图解决一个不太难解决的问题,但我很难找到解决的方法 基本上,我有一组OHLC数据:检测Python数据集中的区域,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我试图解决一个不太难解决的问题,但我很难找到解决的方法 基本上,我有一组OHLC数据: >>print(df) Open High Low Close Volume Date Date 2020-11-02 00:00:00 396.68 401.01 396.44 400.70 41468.48318 2020-11-02 00:00:00 2020-11-02 0
>>print(df)
Open High Low Close Volume Date
Date
2020-11-02 00:00:00 396.68 401.01 396.44 400.70 41468.48318 2020-11-02 00:00:00
2020-11-02 00:30:00 400.68 404.50 400.61 402.45 35209.25068 2020-11-02 00:30:00
2020-11-02 01:00:00 402.48 403.14 400.62 401.89 18107.53656 2020-11-02 01:00:00
2020-11-02 01:30:00 401.88 402.88 401.26 402.48 13852.17215 2020-11-02 01:30:00
2020-11-02 02:00:00 402.49 403.85 398.82 401.17 21853.35028 2020-11-02 02:00:00
... ... ... ... ... ... ...
2020-11-04 19:30:00 401.88 403.88 401.88 402.46 17944.49509 2020-11-04 19:30:00
2020-11-04 20:00:00 402.50 404.23 397.72 399.59 41674.44864 2020-11-04 20:00:00
2020-11-04 20:30:00 399.60 402.26 399.40 401.21 18606.38545 2020-11-04 20:30:00
2020-11-04 21:00:00 401.20 403.15 400.79 402.70 14408.66482 2020-11-04 21:00:00
2020-11-04 21:30:00 402.69 403.01 401.74 402.71 8873.15569 2020-11-04 21:30:00
给定一个固定的范围,该范围可以是10(从350到360,351到361,依此类推),当超过N根蜡烛在该范围内闭合时进行检测。所以基本上这个范围需要“滑动”整个图表,找到符合我上面描述的标准的区域(超过N个蜡烛在这个范围内闭合)
以下是一个可视示例:
在本例中,白色框中有6支蜡烛闭合,因此这就是我要寻找的,请注意蜡烛必须而不是穿过框,它只需要从那里“开始”
我尽力把它说得尽可能清楚和详细。我想发布更多的代码,但我真的很难找到一种方法来实现这一点,尽管我很确定它应该很容易与熊猫,Numpy或scipy。有人能帮我找到这方面的方向吗?欢迎提供任何建议您的描述有点模糊,但这可能会有所帮助: 比如说,您在一个名为
start
的numpy数组中有起始点,通过以下方式找到这些点在350到360之间的位置:
np.where((start > 350) & (start < 360))
np.其中((开始>350)和(开始<360))
要查看这些点的数量,请执行以下操作:
len(np.where((start >350) & (start < 360))[0])
len(np.where((start>350)和(start<360))[0])
您的描述有点模糊,但这可能会有所帮助:
比如说,您在一个名为start
的numpy数组中有起始点,通过以下方式找到这些点在350到360之间的位置:
np.where((start > 350) & (start < 360))
np.其中((开始>350)和(开始<360))
要查看这些点的数量,请执行以下操作:
len(np.where((start >350) & (start < 360))[0])
len(np.where((start>350)和(start<360))[0])
我建议您在代码中添加一个循环。这将是一种悲哀:
mini = df['close'].min()
maxi = df['close'].max()
candles = []
for i in range(mini, maxi-10):
n = len(df[df['Close'].between(i,i+10)])
if n>=6:
candles.append((mini, maxi, n))
请你在你的数据框上试用一下,看看是否有效 我建议您在代码中添加一个循环。这将是一种悲哀:
mini = df['close'].min()
maxi = df['close'].max()
candles = []
for i in range(mini, maxi-10):
n = len(df[df['Close'].between(i,i+10)])
if n>=6:
candles.append((mini, maxi, n))
请你在你的数据框上试用一下,看看是否有效 您可以通过以下方法在numpy中找到区域:1)制作一个整数T/F数组,标记区域中的点;2) 通过减去相邻点,找出台阶的位置(进入和离开区域);3) 使用
np.nonzero
查找步骤2中的边界
下面是一个示例(最后一个图中的绿色带表示仅由非零返回的两个索引标识的区域):
另外,请注意,我在列表中有一个循环,通常在使用pandas和numpy时,最好尽量避免此类循环,但在本例中,循环不是通过所有数据,而是通过端点列表,这是一个比原始数据短得多的列表
最后,请注意,这里的所有问题与您试图查找离散数据区域的问题一样,都有一个关于如何处理边界的问题,因此,如果这很重要,请务必根据需要解决这个问题。您可以通过以下方法在numpy中查找区域:1)制作一个标记区域中点的整数T/F数组;2) 通过减去相邻点,找出台阶的位置(进入和离开区域);3) 使用np.nonzero
查找步骤2中的边界
下面是一个示例(最后一个图中的绿色带表示仅由非零返回的两个索引标识的区域):
另外,请注意,我在列表中有一个循环,通常在使用pandas和numpy时,最好尽量避免此类循环,但在本例中,循环不是通过所有数据,而是通过端点列表,这是一个比原始数据短得多的列表
最后,请注意,这里的所有问题都是关于如何处理边界的问题,正如您试图找到一个离散数据区域一样,如果这很重要,请务必根据您的需要解决这个问题。类似于df[df['Close'].between(350360)]
这是否回答了您的问题?这可能会有所帮助,但在我的例子中,它有点复杂:我需要检测所有这些“区域”,它们符合我上面描述的标准。非常感谢。类似于df[df['Close']。介于(350360)]
之间,这是否回答了您的问题?这可能会有所帮助,但在我的例子中,它有点复杂:我需要检测所有这些“区域”,它们符合我上面描述的标准。非常感谢。谢谢你的回答!你能告诉我哪一部分含糊不清,以便我能改进这个问题吗?这是一个开始!问题是我需要在整个数据集中搜索这些区域,因此范围需要在整个数据集中“移动”,例如:350-360、351-361等等。我希望我没有太困惑谢谢你的回答!你能告诉我哪一部分含糊不清,以便我能改进这个问题吗?这是一个开始!问题是我需要在整个数据集中搜索这些区域,因此范围需要在整个数据集中“移动”,例如:350-360、351-361等等。我希望我没有太困惑。谢谢你!我尝试了这个方法,但我得到了以下错误:TypeError:'numpy.float64'对象不能解释为integerage(mini,maxi-10)->range(int(mini),int(maxi-10))TypeError:'numpy.float64'对象不能解释为integery你可以将chnagemini=df['close'].min()转换为mini=int(df['close'].min())
和maxi一样。非常感谢!我尝试了这个方法,但我得到了以下错误:TypeError:'numpy.float64'对象不能解释为integerage(mini,maxi-10)->range(int(mini),int(maxi-10))TypeError:'numpy.float64'对象不能解释为integery你可以将chnagemini=df['close'].min()转换为mini=int(df['close'].min())
与maxi类似。这非常有趣。多谢各位!我只是有点麻烦