【问题标题】:How to dynamically indicate the start as well as the end of a set of conditions within a DataFrame?如何动态指示 DataFrame 中一组条件的开始和结束?
【发布时间】:2019-02-12 13:11:51
【问题描述】:

我 我试图在数据框中创建一个指标列,查看进入和退出列的值并创建一个具有以下逻辑的窗口:

  1. 查找条目为 1(2019 年 1 月 3 日)的最早日期并将窗口标记为 1。
  2. 窗口保持为 1,直到退出为 1(2019 年 1 月 5 日)。
  3. 然后窗口变为 0,直到找到下一个条目的值 等于 1(2019 年 1 月 8 日)。
  4. 该过程一直重复到 DataFrame 中的最新日期。

因此,对于 Window 列,必须跟随一个出口和入口,或者对于每个入口,最终都会有一个出口(参见下面的示例)。 另请注意,日期索引是倒序的。

df = pd.DataFrame({'C1':[5,3,4,5,4,2,1,4,5,4,2,3],
                    'C2':[3,3,2,3,4,1,3,2,3,5,3,3]},
                   index = pd.date_range('1/1/2019',periods = 12))
df1 = df.iloc[::-1]

# Create function to add entry and exit criteria
def window_range(df):
    crit1 = ((df['C1'] >2) & (df['C1'].shift(-1) < df['C1']))
    crit2 = (df['C2'].shift(-1)==3)
    entry = crit1&crit2
    df['Entry'] = np.where(entry,1,0)
    exit = (df['C1'] < df['C1'].shift(-1))
    df['Exit'] = np.where(exit,1,0)
    return df
df2 = window_range(df1)
df2
# The Column I'd like to add
window = list([1,0,1,1,1,0,0,1,1,1,0,0])
df2['window'] = pd.Series(window, index=df2.index)
df3 = df2
# Desired Final Output
df3

【问题讨论】:

  • 为什么是list-comprehension 标签?
  • 我尽可能使用列表推导构建我的大部分代码。在这一点上,我会采取任何解决方案。谢谢

标签: python pandas loops list-comprehension


【解决方案1】:

这似乎符合您的标准,但所需的输出与您的不匹配。根据您设置的规则,应该只有两行 window = 1。

df = pd.DataFrame({'C1':[5,3,4,5,4,2,1,4,5,4,2,3],
                    'C2':[3,3,2,3,4,1,3,2,3,5,3,3]},
                   index = pd.date_range('1/1/2019',periods = 12))

df2 = window_range(df)  # using your func

res, window = [], False
for row in df2.iterrows():
    if row[1]['Entry']:
        window = True
    if row[1]['Exit']:
        window = False
    res.append(window)
df2['window'] = numpy.array(res).astype(int)
df2


           C1  C2 Entry Exit window
2019-01-01  5   3   1   0   1
2019-01-02  3   3   0   1   0
2019-01-03  4   2   0   1   0
2019-01-04  5   3   0   0   0
2019-01-05  4   4   0   0   0
2019-01-06  2   1   0   0   0
2019-01-07  1   3   0   1   0
2019-01-08  4   2   0   1   0
2019-01-09  5   3   0   0   0
2019-01-10  4   5   1   0   1
2019-01-11  2   3   0   1   0
2019-01-12  3   3   0   0   0

【讨论】:

  • 嗨,乔希,感谢您的回复。我正在寻找的是该窗口将保持在入口状态,直到它找到下一个出口 ==1,其中出口必须跟随入口。目标是收集两个日期之间的观察结果,其中条目始终是第一个日期。抱歉,不清楚。
  • 但是这里不是这样吗?第 1 行进入,第 2 行退出所以 0。然后 0 直到最后第三行是入口,然后退出所以最后 2 行为 0。我错过了什么?
  • 我不知道是不是因为我必须以相反的顺序处理数据,但我认为它是从最早的日期到最近的日期。因此,从底部条目开始的第三行是 1,因此窗口应该是 1,然后窗口在退出为 1 的日期之前保持为 1,直到我们到达最近的日期,即第 1 行。
  • 希望对您有所帮助。
  • 抱歉,我仍然几乎可以肯定您的问题有误
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2021-04-15
  • 2020-04-30
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多