分箱时间序列的转移概率

Transition probabilities of a binned time series

我的数据:

data
Out[84]: 
array([ 1.79,  1.93,  1.81,  1.79,  3.87,  5.75,  7.25,  5.03, 11.11,
       11.53, 13.79,  4.41,  4.68,  7.9 ,  3.49,  1.8 ,  1.85,  2.02,
        1.81,  2.33,  2.13,  1.92,  1.74,  1.84])

我定义了三个ranges/bins,其中每个元素可以是:

b = 3
binsize = (Max-Min)/b
d = {}

for i in range(0,b):
    upperlimit = Min + (i+1)*binsize
    d["Bin "+str(i)+" upper limit"] = upperlimit

d
Out[83]: 
{'Bin 0 upper limit': 5.756666666666667,
 'Bin 1 upper limit': 9.773333333333333,
 'Bin 2 upper limit': 13.790000000000001}

所以 Bin 0 从 Min 变为 5.756 Bin 1 从 5.756 到 9.7733 Bin 2 从 9.7733 到 13.79

我想计算给定一个元素 X,X+1 在某个 bin 中的概率。从一个 bin 到另一个 bin 的转换概率可以这么说。 我该怎么做?我正在努力解决这个问题。

所以基本上,在任何时间点 t(数组的第一个元素在 t=0,最后一个在 t=23) 我想知道从一个 bin 到另一个 bin 的转移概率是多少

Pandas 有一些方法在这里很有用,包括装箱,因此您无需手动操作。希望你不介意使用 pandas——无论如何,如果你想“手动”,它应该会给你一个如何做的想法

让我们从将数据放入容器开始。这里 pd.cut 会将您的数据分成 3 个箱子,return 每个点一个箱子。我们还将原始数据作为列 'x'

放入数据框中
import pandas as pd

b = 3
bins = pd.cut(data, b, labels = False)
df = pd.DataFrame({'x':data})

现在让我们把 bins 放入 df 作为 'from' 列,指示每个 x 点在哪个 bin 中,让我们 shift 显示它下一步将在哪里

df['from'] = bins
df['to'] = df['from'].shift(-1)
df = df.dropna().astype(int)
df

现在你的 df 看起来像这样:

      x    from    to
--  ---  ------  ----
 0    1       0     0
 1    1       0     0
 2    1       0     0
 3    1       0     0
 4    3       0     0
 5    5       0     1
 6    7       1     0
 7    5       0     2
 8   11       2     2
 9   11       2     2
10   13       2     0
11    4       0     0
12    4       0     1
13    7       1     0
14    3       0     0
15    1       0     0
16    1       0     0
17    2       0     0
18    1       0     0
19    2       0     0
20    2       0     0
21    1       0     0
22    1       0     0

现在我们可以 groupby 'from' 和 'to' 上的 df 并计算您的过程从给定的 from bin 转换到给出 to bin:

df.groupby(['from','to']).count().reset_index().rename(columns = {'x':'count'})

看起来像这样:


   from to  count
0   0   0   15
1   0   1   2
2   0   2   1
3   1   0   2
4   2   0   1
5   2   2   2

例如,您的进程从 bin0 转换到 bin1 2 次,等等

你也可以用矩阵形式得到这个:

df.groupby(['from','to']).count().unstack(level = 1).fillna(0).astype(int)

它看起来像这样:


x
to  0   1   2
from            
0   15  2   1
1   2   0   0
2   1   0   2