擅长:python、mysql、java
<p>根本原因是<code>Series[<slice>]</code>语法为每个片返回相应的索引,<code>-</code>运算符处理每个索引相等(而不是实际位置)</p>
<p>例如:</p>
<pre><code>s = pd.Series(range(5))
s[2:] - s[:-2]
=>
0 NaN
1 NaN
2 0.0
3 NaN
4 NaN
dtype: float64
</code></pre>
<p>显然,这不是我们所期望的。看看为什么我们可以使用concat分别创建<code>s[2:], s[:-2]</code>的逐行数据帧</p>
<pre><code>pd.concat([s[2:], s[:-2]], axis=1)
=>
0 1
0 NaN 0.0
1 NaN 1.0
2 2.0 2.0
3 3.0 NaN
4 4.0 NaN
</code></pre>
<p>给定此输入,hurst函数中的<code>tau = </code>方程的结果是(大部分)nan值的列表</p>
<p>本机使用Series的解决方案是使用<code>Series.shift()</code>而不是数组切片:</p>
<pre><code>def hurst(ts):
...
# Calculate the array of the variances of the lagged differences
tau = [sqrt((ts - ts.shift(-lag)).std()) for lag in lags]
...
</code></pre>
<p>或者,将<code>Series.values</code>传递给原始函数,该函数传递numpy数组</p>