【发布时间】:2018-09-14 23:44:28
【问题描述】:
所以我有一个 CSV,其中有股票价格,并且每一天(行)我都有一个相应的列,显示价格在前一天是上涨还是下跌。
任务:我想识别波峰和波谷(参见示例截图)。 逻辑:趋势变化前的最后一个“增加”单元格应标记为“峰值”。 同样对于减少...
我猜这将使用带有中断/继续的循环。 对于编写代码的确切建议,我将不胜感激。
谢谢!
【问题讨论】:
所以我有一个 CSV,其中有股票价格,并且每一天(行)我都有一个相应的列,显示价格在前一天是上涨还是下跌。
任务:我想识别波峰和波谷(参见示例截图)。 逻辑:趋势变化前的最后一个“增加”单元格应标记为“峰值”。 同样对于减少...
我猜这将使用带有中断/继续的循环。 对于编写代码的确切建议,我将不胜感激。
谢谢!
【问题讨论】:
这是使用pandas 和numpy 功能的矢量化解决方案。
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
【讨论】:
可能不是最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)
【讨论】: