时间序列数据中的波峰到波谷

use*_*769 3 python numpy time-series pandas peakutils

寻找股票指数时间序列下跌 10% 或以上的每个实例。我正在努力对其进行编程,以便它理解顺序问题(不希望升值 10%)。

理想情况下,代码将:选择值,检查该值是否低于 10%,如果不是,则检查下一个,继续检查下一个,直到找到一个值,然后记录下来。然后,移至该“谷”或“谷”作为开始,继续检查其后的值是否比该值小 10% 或更多。

我有一个 Excel 文件,第一列中包含日期,第二列中包含索引值

这就是它输出的内容,我认为根据图表来看这是不正确的

# Import Libraries
import pandas as pd
import numpy as np
import peakutils
from peakutils.plot import plot as pplot
from matplotlib import pyplot
import matplotlib.pyplot as plt
from scipy import signal
import csv
import scipy
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.tools import FigureFactory as FF

# from pandas import DataFrame

# Import Excel as array
index = pd.read_csv(r"\Users\Reed_2\Desktop\Indexonly.csv")
print("as Pandas")
print (index.values)
# convert to 2 NumPy arrays
dates = index['Date'].as_matrix()
values = index['Index'].as_matrix()
print("values as NumPy")
print(values)
print("Date values")
print(dates)

# Find peaks
peaks = peakutils.indexes(values, thres=0.1, min_dist=1)

print ("peaks")
print(peaks)

a = np.asarray(peaks)
np.savetxt(r"C:\Users\Reed_2\Desktop\export.csv", a, delimiter=",")
Run Code Online (Sandbox Code Playgroud)

可以访问 Python、R Studio 和 MatLab。更喜欢 Python,因为我最了解它。
非常感谢对此的任何帮助。

piR*_*red 5

考虑一系列回报 s

np.random.seed([3,1415])
s = pd.Series(
    np.random.lognormal(.005, .5, size=100),
    pd.date_range('2015-01-01', periods=100, freq='B')
).cumprod()

s.plot()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用生成器对索引进行切片

def gen_slice(s, thresh):
    sidx = s.index
    idx = s.index[0]
    v = s.get_value(idx)
    yield idx
    for idx in sidx[1:]:
        v0 = s.get_value(idx)
        if (v0 / v) < 1-thresh:
            v = v0
            yield idx


s.loc[list(gen_slice(s, .1))]

2015-01-01    0.346504
2015-01-02    0.184687
2015-01-05    0.069298
2015-01-06    0.022508
2015-01-07    0.018996
2015-01-26    0.014204
2015-02-03    0.012777
2015-05-01    0.008999
2015-05-04    0.006039
2015-05-06    0.004855
dtype: float64
Run Code Online (Sandbox Code Playgroud)

我们可以看到每个百分比变化都小于 10%

s.loc[list(gen_slice(s, .1))].pct_change()

2015-01-01         NaN
2015-01-02   -0.467000
2015-01-05   -0.624783
2015-01-06   -0.675194
2015-01-07   -0.156034
2015-01-26   -0.252278
2015-02-03   -0.100442
2015-05-01   -0.295665
2015-05-04   -0.328967
2015-05-06   -0.195990
dtype: float64
Run Code Online (Sandbox Code Playgroud)

我们可以绘制这些事件发生的位置。

idx = list(gen_slice(s, .1))

ax = s.plot()
ax.vlines(idx, s.min(), s.max())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


另见下文:

可能有必要以下一个元素或下一行依赖于先前选择的元素或行的方式遍历系列的元素或数据帧的行。这称为路径依赖。

考虑以下s频率不规则的时间序列。

#starting python community conventions
import numpy    as np
import pandas   as pd

# n is number of observations
n = 5000

day = pd.to_datetime(['2013-02-06'])
# irregular seconds spanning 28800 seconds (8 hours)
seconds = np.random.rand(n) * 28800 * pd.Timedelta(1, 's')
# start at 8 am
start = pd.offsets.Hour(8)
# irregular timeseries
tidx = day + start + seconds
tidx = tidx.sort_values()

s = pd.Series(np.random.randn(n), tidx, name='A').cumsum()
s.plot();
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

让我们假设一个路径依赖条件。从系列的第一个成员开始,我想获取每个后续​​元素,使得该元素与当前元素之间的绝对差异大于或等于x

我们将使用 python 生成器解决这个问题。

发电机功能

def mover(s, move_size=10):
    """Given a reference, find next value with
    an absolute difference >= move_size"""
    ref = None
    for i, v in s.iteritems():
        if ref is None or (abs(ref - v) >= move_size):
            yield i, v
            ref = v
Run Code Online (Sandbox Code Playgroud)

然后我们可以moves像这样定义一个新系列

moves = pd.Series({i:v for i, v in mover(s, move_size=10)},
                  name='_{}_'.format(s.name))
Run Code Online (Sandbox Code Playgroud)

绘制它们两个

moves.plot(legend=True)
s.plot(legend=True)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


数据帧的模拟将是:

def mover_df(df, col, move_size=2):
    ref = None
    for i, row in df.iterrows():
        if ref is None or (abs(ref - row.loc[col]) >= move_size):
            yield row
            ref = row.loc[col]

df = s.to_frame()
moves_df = pd.concat(mover_df(df, 'A', 10), axis=1).T

moves_df.A.plot(label='_A_', legend=True)
df.A.plot(legend=True)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明