【问题标题】:Python/Pandas- applying label at trend shift (identifying local maxima and minima in dataset)Python/Pandas- 在趋势变化时应用标签(识别数据集中的局部最大值和最小值)
【发布时间】:2018-09-14 23:44:28
【问题描述】:

所以我有一个 CSV,其中有股票价格,并且每一天(行)我都有一个相应的列,显示价格在前一天是上涨还是下跌。

任务:我想识别波峰和波谷(参见示例截图)。 逻辑:趋势变化前的最后一个“增加”单元格应标记为“峰值”。 同样对于减少...

我猜这将使用带有中断/继续的循环。 对于编写代码的确切建议,我将不胜感激。

谢谢!

【问题讨论】:

    标签: python pandas loops csv


    【解决方案1】:

    这是使用pandasnumpy 功能的矢量化解决方案。

    import pandas as pd, numpy as np
    
    df = pd.DataFrame({'seq': ['inc', 'dec', 'inc', 'inc', 'inc', 'dec', 'dec', 'dec', 'inc']})
    
    df['mark'] = df['seq'].map({'inc': 1, 'dec': -1}).diff().shift(-1).map(np.sign).fillna(0)
    df['mark'] = df['mark'].map({-1: 'peak', 1: 'trough', 0: ''})
    
    #    seq    mark
    # 0  inc    peak
    # 1  dec  trough
    # 2  inc        
    # 3  inc        
    # 4  inc    peak
    # 5  dec        
    # 6  dec        
    # 7  dec  trough
    # 8  inc        
    

    【讨论】:

      【解决方案2】:

      可能不是最pythonic/efficient 的方式,但这会起作用:

      price = ['increase', 'increase', 'increase', 'decrease', 'decrease', 'increase']
      
      break_point = []
      for index, value in enumerate(price):
          try:
              if value == price[index + 1]:
                  break_point.append(' ')
              else:
                  if value == 'increase':
                      break_point.append('peak')
                  else:
                      break_point.append('trough')
          except IndexError:
              break
      
      print(break_point)
      

      【讨论】:

        猜你喜欢
        • 2021-03-07
        • 1970-01-01
        • 2020-10-25
        • 2023-01-05
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        • 2020-04-20
        相关资源
        最近更新 更多