我在 pandas 中有下表。该表包含时间和产品的价格。
出于分析目的,我想要有 2 列,其中包含下一次产品在任一方向的价格变化超过 100 美元时的情况。
例如,如果我位于 09:19 单元格,则下一个价格高于 100 美元的价格将是 14:02,低于 100 美元的价格将是 11:39,因此 14:02 和 11:39 应出现在相应列的 09:19 行中。
与单元格 09:56 的情况相同,下一个价格上涨超过 100 美元的时间将是 14:02,价格下跌不到 100 美元的时间是 12:18,因此这 2 个值将出现在 09:56 的行中。
Table
Time Price Up_Time Down_Time
09:19:00 3252.25
09:24:00 3259.9
09:56:00 3199.4
10:17:00 3222.5
10:43:00 3191.25
11:39:00 3143
12:18:00 2991.7
13:20:00 3196.35
13:26:00 3176.1
13:34:00 3198.85
13:37:00 3260.75
14:00:00 3160.85
14:02:00 3450
14:19:00 3060.5
14:30:00 2968.7
14:31:00 2895.8
14:52:00 2880.7
14:53:00 2901.55
14:55:00 2885.55
14:57:00 2839.05
14:58:00 2871.5
15:00:00 2718.95
我正在使用以下代码,该代码可以工作,但 1 个数据集需要 15-20 分钟。
for i, row in df.iterrows():
time_up = np.nan
time_down = np.nan
for j in range(i+1, len(df)):
diff = df.iloc[j]['Price'] - row['Price']
if diff > 100:
time_up = df.iloc[j]['Time']
elif diff < -100:
time_down = df.iloc[j]['Time']
if not pd.isna(time_up) or not pd.isna(time_down):
break
df.at[i, 'Up_Time'] = time_up
df.at[i, 'Down_Time'] = time_down
有没有更有效的方法来做到这一点?
Price
您确实需要将每一行的值与其后面的所有行进行比较,因此需要进行一定量的迭代。您可以apply
使用 numpy 的函数来查找满足 >100 或 <-100 的更改要求的第一个值:输出: