Python / Pandas-在趋势移位时应用标签(识别数据集中的局部最大值和最小值)

时间:2018-04-05 08:23:06

标签: python pandas loops csv

所以我有一个CSV,我有股票价格和每天(行)我有一个相应的列,显示价格是否在前一天增加或减少。

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

enter image description here 我猜这将使用一个带有break / continue的循环。 我将非常感谢编写代码的确切建议。

谢谢!

2 个答案:

答案 0 :(得分: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        

答案 1 :(得分:0)

可能不是最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)