在 Pandas 中查找“运行”的第一个和最后一个值

问题描述 投票:0回答:1

我正在尝试找出获取大熊猫“跑步”信息的最佳方法

下面的示例代码返回以下结果:

import pandas as pd
import numpy as np


df2 = pd.DataFrame({'Price':[0.0, 3.6, 9.3, 4.5, 2.9, 3.2, 1.0, 6.7, 8.7, 9.8, 3.4, .7, 2.2, 6.5, 3.4, 1.7, 9.4, 10.0], 'PriceDate':['2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05', '2023-10-06', '2023-10-07', '2023-10-08',  '2023-10-09',  '2023-10-10',  '2023-10-11',  '2023-10-12',  '2023-10-13',  '2023-10-14',  '2023-10-15',  '2023-10-16',  '2023-10-17']})


df2['Trend']=np.where(df2['Price']>df2['Price'].shift(),"UPTREND","DOWNTREND")

现在暂时忽略第一个值不应具有趋势值。趋势值仅显示当前价格是否大于先前价格(上升趋势)或小于较低价格(下降趋势)。

我想知道的是

  1. 任何上升趋势/下降趋势的第一个日期是哪一天
  2. 上升/下降趋势的最后日期是哪一天
  3. 上升/下降的第一个价格是多少
  4. 上涨/下跌的最后价格是多少

所以 - 第一个上升趋势从 10/2 开始,到 10/3 结束,第一个价格是 3.6,最后一个价格是 9.3 另一次上升趋势于 10/8 开始,于 10/10 结束,首价为 6.7,最终价格为 9.8

我还想获得先前趋势的最后价格,例如 - 10/8 记录看起来像这样

任何帮助将不胜感激

python pandas series
1个回答
0
投票

一种简单的方法可以是保存一个变量来记录当前状态和与运行开始相关的值,并迭代数据帧直到该值发生变化。记录并重新启动。

伪代码:

df = pd.read_excel("path/to/spreadhseet.xlsx")

run = { "First Date":None, ... "End Price":None, "Status":None }
runs = []

# Set the first row to the 'run'
firstRow = df.iloc[0]
run["First Date"] = firstRow["PriceDate"]
run["Start Price"] = firstRow["Price"]
run["Status"] = firstRow["Trend"]

# Iterate down the dataframe, starting @1 since we already have row 0
for rowIndex in range(1, len(df)):
    row = df.iloc[rowIndex]
    previousRow = df.iloc[rowIndex - 1]
    # Trend changed
    if row["Trend"] != run["Status"]: # Would need to consider the run at EOF
        run["Last Date"] = previousRow["PriceDate"]
        run["Last Price"] = previousRow["Price"]
        # Run data now complete, save and make new 'run'
        runs.append(run)
        run = { "First Date":None, ... "End Price":None, "Status":None }
        run["First Date"] = row["PriceDate"]
        run["Start Price"] = row["Price"]
        run["Status"] = row["Trend"]

有了这个,您将拥有一个列表

runs
,其中包含一个字典,其中包含每次运行的信息,可以将其转换为数据帧,与您的预期输出相匹配。

但是,这仍然是伪代码,绝对需要进行审查以说明数据的结构方式、最后一行的运行、只有 1 个条目长的运行等等 --- 但是像这样的事情应该会让你非常接近。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.