【问题标题】:Pandas minimum time where high is bigger than current highPandas 高点大于当前高点的最小时间
【发布时间】:2020-09-11 01:26:06
【问题描述】:

我想知道在 pandas 数据帧中“高”大于当前高的第一个最小时间。

例如,我有一个包含以下列的数据框:

df["date"]
df["open"]
df["high"]
df["low"]
df["close"]

我想知道 HIGH 大于 Current high 的最小日期,这是我目前所拥有的:

import pandas as pd
import numpy as np
df = pd.read_csv("spy10mindata.csv")
df.columns = [x.lower() for x in df.columns]
df["date"] = pd.to_datetime(df['datetime'], dayfirst=True)
df = df.sort_values(["date"], ascending=[True])
df['just_date'] = df['date'].dt.date
df['just_date2'] = df['date'].dt.date
df['just_time'] = df['date'].dt.time
df["numdate"] = df['date'].dt.strftime("%Y%m%d").astype(int)
df["numtime"] = df['date'].dt.strftime("%H%M%S").astype(int)

df["try"] = np.where(df["high"] > df["high")) 

""

但无法解决此分析的问题。如果您能帮上忙,我将不胜感激

【问题讨论】:

  • 我能理解您想对“高”和当前高点做什么,您能否更详细地说明您想要的最短日期?
  • 是的,谢谢您的宝贵时间。所以我想知道当Minimum Time (just time column) 哪里高> 比当前高。因此,假设上午 9:30:00 的最高价是每股 10 美元。我想知道它在当天第一次打破了当天的最高点。所以如果它是在上午 10:00:00,我希望该行说 10:00:00。如果这有意义的话。
  • 在这种情况下,df['try'] 的其他值应该是什么?是否可以将它们一开始都设置为 0,并且每当当前高值 > 高时,该行获取新的时间戳,而对于当前高值从不 > 高的其他行,它们保持为 0?
  • 对于这个特定的策略即时测试,我真的需要得到比当前行高更大的高点。我在想也许循环遍历当前行之后的所有行并获得大于当前高的第一行?这行得通吗?
  • 如果您知道当前的高行数,则使用切片 [current_row+1:] 获取 current high 之后的所有行,然后将这些行与单个值 current high 进行比较,而不是比较 results = df[ df["high"][current_row+1:] > currnet_high ] 然后你得到第一个值results[0]

标签: python pandas date time


【解决方案1】:

也许可以通过滚动窗口来完成,但我不知道。

我迭代行以获取当前的 high 并创建 sub_df 与此值之后的所有行。

顺便说一句:我使用random 创建一些示例数据。因为我使用seed(),所以你应该在每次执行中得到相同的值——所以值不是那么随机的。

import pandas as pd
import random

random.seed(0)

df = pd.DataFrame({
    'date': pd.date_range(start='2020.05.01 12:00', periods=10, freq='d'),
    'high': [random.randint(0, 10) for _ in range(10)],
})

print(df)

df['higher_value'] = None
df['higher_data'] = None
df['higher_index'] = None

for index, row in df.iterrows():
    print('current: row:', index, 'high:', row['high'])

    sub_df = df[index+1:] 
    higher_items = sub_df[ sub_df['high'] > row['high'] ]

    if len(higher_items):
        first = higher_items.iloc[0]
        print(' higher: row:', first.name, 'high:', first['high'])
        df['higher_value'][index] = first['high']
        df['higher_index'][index] = first.name
        df['higher_data'][index] = first['date']

    else:
        print(' higher: None')

    print('---')

print(df)    

之前:

                 date  high
0 2020-05-01 12:00:00     6
1 2020-05-02 12:00:00     6
2 2020-05-03 12:00:00     0
3 2020-05-04 12:00:00     4
4 2020-05-05 12:00:00     8
5 2020-05-06 12:00:00     7
6 2020-05-07 12:00:00     6
7 2020-05-08 12:00:00     4
8 2020-05-09 12:00:00     7
9 2020-05-10 12:00:00     5

之后:

                 date  high higher_value          higher_data higher_index
0 2020-05-01 12:00:00     6            8  2020-05-05 12:00:00            4
1 2020-05-02 12:00:00     6            8  2020-05-05 12:00:00            4
2 2020-05-03 12:00:00     0            4  2020-05-04 12:00:00            3
3 2020-05-04 12:00:00     4            8  2020-05-05 12:00:00            4
4 2020-05-05 12:00:00     8         None                 None         None
5 2020-05-06 12:00:00     7         None                 None         None
6 2020-05-07 12:00:00     6            7  2020-05-09 12:00:00            8
7 2020-05-08 12:00:00     4            7  2020-05-09 12:00:00            8
8 2020-05-09 12:00:00     7         None                 None         None
9 2020-05-10 12:00:00     5         None                 None         None

【讨论】:

  • 这解决了它,非常感谢您抽出宝贵的时间......我现在唯一遇到的问题是它需要很长时间才能通过 1Mill 行。这是唯一的事情,除了这是完美的解决方案。
  • 迭代不适合大数据,因为它不使用内部 C/C++ 代码。我在想rolling() 窗口,但我不知道它是否可以使用每行大小都在变化的windos。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多