提前道歉。我是python的新手。 我创建了一个以日期时间戳为索引的pandas df。我想根据特定列和下一行中的同一列的条件遍历所有行。根据下面的示例,我想针对绝对值(例如3)检查“条纹”列,然后检查下一行以查看条纹列是否变为负数。
由于时间戳索引,我正在努力查看下一行。我尝试了.shift()
,并尝试了loc
和iloc
以及Timedelta
。他们认为后者的问题在于每行的时间戳之间没有一致的差异。
我的df看起来像
Security Difference Buy/Sell Streak Price
Date
2019-02-25 2330 500.0 1 1 238.0
2019-02-26 2330 400.0 1 2 239.0
2019-02-27 2330 200.0 1 3 239.5
2019-03-05 2330 -600.0 -1 -1 233.0
2019-03-06 2330 190.0 1 1 234.0
我尝试过但失败的代码是
streaklength = 3
for index, row in mergeddf.iterrows():
currentrow = mergeddf.index.get_loc(index)
If (mergeddf.iloc[currentrow,’Streak’] >= streaklength & (mergeddf.iloc[Currentrow + 1, ‘Streak’]) == -1:
Do something
编辑-在输出结果中,我想依次获取原始行的“价格”列和固定行数的列的价格,并返回该比率。
因此对于我的原始示例,其中固定行移动n = 2。我想返回变量ouput1(239.5)和ouput2(234)并返回output1 / output2的比率
答案 0 :(得分:0)
如果我对问题的理解正确,那么您想要的是(df.Streak >= 3) & (df.Streak.shift(-1) < 0)
。
稍微更改示例中的第一行以确保同时满足两个条件,这将提供以下内容:
In [15]: df
Out[15]:
Security Difference Buy/Sell Streak Price
Date
2019-02-25 2330 500.0 1 3 238.0
2019-02-26 2330 400.0 1 2 239.0
2019-02-27 2330 200.0 1 3 239.5
2019-03-05 2330 -600.0 -1 -1 233.0
2019-03-06 2330 190.0 1 1 234.0
In [16]: (df.Streak >= 3) & (df.Streak.shift(-1) < 0)
Out[16]:
Date
2019-02-25 False
2019-02-26 False
2019-02-27 True
2019-03-05 False
2019-03-06 False
Name: Streak, dtype: bool
要也回答已编辑的问题,则可以使用此掩码获取相关输出:
mask = (df.Streak >= 3) & (df.Streak.shift(-1) < 0)
df['Output1'] = df[mask].Price
df['Output2'] = df[mask].Price / df.shift(-2)[mask].Price
结果如下:
In [139]: df
Out[139]:
Security Difference Buy/Sell Streak Price Output1 Output2
Date
2019-02-25 2330 500.0 1 3 238.0 NaN NaN
2019-02-26 2330 400.0 1 2 239.0 NaN NaN
2019-02-27 2330 200.0 1 3 239.5 239.5 1.023504
2019-03-05 2330 -600.0 -1 -1 233.0 NaN NaN
2019-03-06 2330 190.0 1 1 234.0 NaN NaN
或