我在['sign']列中的以下时间序列中确定正负周期。如何获得1和-1的每个持续时间,然后计算1和-1的周期数?
因此,如果我在['sign']列中有五个连续的'1',然后有三个连续的'-1',然后是两个'1',答案是持续时间:5天,3天和2天。然后计数。'1':2和'-1':1。
import pandas_datareader.data as web
import datetime as dt
import numpy as np
import pandas as pd
end = dt.datetime(2016, 12, 31)
start = dt.date(end.year-15, end.month, end.day)
aapl = web.DataReader('AAPL', 'yahoo', start, end)['Adj Close']
aapl = pd.DataFrame(aapl)
aapl['ema'] = aapl.ewm(200).mean()
aapl['diff'] = (aapl['Adj Close'] / aapl['ema']) - 1
aapl['sign'] = np.sign(aapl['diff'])
更新:我意识到,对于持续时间,需要分开计算符号='1'和sign ='-1'的时间段。这是为了对“ 1”和“ -1”期间进行描述性统计。
熊猫版:0.19.2
您可以使用diff()
和后续cumsum()
获取系列中的差异,并进行相应的分组依据。
aapl.groupby((aapl.sign.diff() != 0).cumsum()).size()
至于获取每个符号组的计数,可能有一种更聪明的方法来执行此操作,但是您可以在删除重复项后重新使用相同的diff
结果来索引原始sign
系列。
aapl.sign.iloc[(aapl.sign.diff() != 0).cumsum().drop_duplicates().index]
.value_counts().to_dict()
将其很好地放在函数中可能看起来像
def durs(df):
diffs = (df.sign.diff() != 0).cumsum()
cnts = df.sign.iloc[diffs.drop_duplicates().index].value_counts().to_dict()
days = df.groupby(diffs).size()
return days, cnts
演示版
>>> df
sign
0 1
1 1
2 1
3 1
4 1
5 -1
6 -1
7 -1
8 1
9 1
>>> days, cnts = durs(df)
>>> days
sign
1 5
2 3
3 2
dtype: int64
>>> cnts
{-1: 1, 1: 2}
更新资料
对于仅计数1个句点并随后获得输出的注释中的添加请求[5, 2]
,可以使用类似的方法,获取1的索引,然后按连续数进行分组。
>>> data = np.where(df.sign == 1)[0]
>>> np.diff(np.r_[0, np.where(np.diff(data) != 1)[0]+1, data.size])
array([5, 2])
请注意,我不是NumPy专家,因此在这里不能保证性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句