我有一张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,所以这两个值将出现在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     

我正在使用以下代码,它可以工作,但需要15—20分钟的1个数据集.

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和一个函数来找到第一个满足Price或—Price更改要求的值:><

def updown(row, df):
    rownum = row.name
    up = (row['Price'] < df.loc[rownum:, 'Price'] - 100).argmax()
    down = (row['Price'] > df.loc[rownum:, 'Price'] + 100).argmax()
    return (
        df.loc[up + rownum, 'Time'] if up > 0 else pd.NaT,
        df.loc[down + rownum, 'Time'] if down > 0 else pd.NaT
    )

df[['Up_Time', 'Down_Time']] = df.apply(updown, axis=1, result_type='expand', df=df)

输出:

        Time    Price   Up_Time Down_Time
0   09:19:00  3252.25  14:02:00  11:39:00
1   09:24:00  3259.90  14:02:00  11:39:00
2   09:56:00  3199.40  14:02:00  12:18:00
3   10:17:00  3222.50  14:02:00  12:18:00
4   10:43:00  3191.25  14:02:00  12:18:00
5   11:39:00  3143.00  13:37:00  12:18:00
6   12:18:00  2991.70  13:20:00  14:52:00
7   13:20:00  3196.35  14:02:00  14:19:00
8   13:26:00  3176.10  14:02:00  14:19:00
9   13:34:00  3198.85  14:02:00  14:19:00
10  13:37:00  3260.75  14:02:00  14:19:00
11  14:00:00  3160.85  14:02:00  14:19:00
12  14:02:00  3450.00       NaT  14:19:00
13  14:19:00  3060.50       NaT  14:31:00
14  14:30:00  2968.70       NaT  14:57:00
15  14:31:00  2895.80       NaT  15:00:00
16  14:52:00  2880.70       NaT  15:00:00
17  14:53:00  2901.55       NaT  15:00:00
18  14:55:00  2885.55       NaT  15:00:00
19  14:57:00  2839.05       NaT  15:00:00
20  14:58:00  2871.50       NaT  15:00:00
21  15:00:00  2718.95       NaT       NaT

Python相关问答推荐

提取两行之间的标题的常规表达

try 在树叶 map 上应用覆盖磁贴

Pytest两个具有无限循环和await命令的Deliverc函数

未删除映射表的行

有症状地 destruct 了Python中的regex?

pandas滚动和窗口中有效观察的最大数量

计算组中唯一值的数量

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

使用Python更新字典中的值

Scrapy和Great Expectations(great_expectations)—不合作

需要帮助重新调整python fill_between与数据点

CommandeError:模块numba没有属性generated_jit''''

如何在达到end_time时自动将状态字段从1更改为0

Maya Python脚本将纹理应用于所有对象,而不是选定对象

在Python中使用yaml渲染(多行字符串)

Pandas—堆栈多索引头,但不包括第一列

使用嵌套对象字段的Qdrant过滤

Python Mercury离线安装

如何使用pytest在traceback中找到特定的异常

来自Airflow Connection的额外参数