我正在尝试找出获取大熊猫“跑步”信息的最佳方法
下面的示例代码返回以下结果:
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")
现在暂时忽略第一个值不应具有趋势值。趋势值仅显示当前价格是否大于先前价格(上升趋势)或小于较低价格(下降趋势)。
我想知道的是
所以 - 第一个上升趋势从 10/2 开始,到 10/3 结束,第一个价格是 3.6,最后一个价格是 9.3 另一次上升趋势于 10/8 开始,于 10/10 结束,首价为 6.7,最终价格为 9.8
我还想获得先前趋势的最后价格,例如 - 10/8 记录看起来像这样
任何帮助将不胜感激
一种简单的方法可以是保存一个变量来记录当前状态和与运行开始相关的值,并迭代数据帧直到该值发生变化。记录并重新启动。
伪代码:
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 个条目长的运行等等 --- 但是像这样的事情应该会让你非常接近。祝你好运!