首页 > 解决方案 > pandas.Series:如何获得下一个值的速率

问题描述

关于熊猫,我想知道如何获得下一个值的比率。以下系列是一个示例。

import pandas as pd
s = pd.Series([1,2,1,1,1,3])
>>> s
0    1
1    2
2    1
3    1
4    1
5    3

# What I wanna get are below rates.
# 1 to 2 : 1/5(0.2)
# 2 to 1 : 1/5(0.2)
# 1 to 1 : 2/5(0.4)
# 1 to 3 : 1/5(0.2)

抱歉描述不好,但有谁知道如何做到这一点?

标签: pythonpandas

解决方案


一种可能的解决方案是strides、聚合计数GroupBy.size和除以长度DataFrame

import pandas as pd
import numpy as np

s = pd.Series([1,2,1,1,1,3])

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)


df1 = pd.DataFrame(rolling_window(s.values, 2), columns=['from','to'])

df1 = df1.groupby(['from','to'], sort=False).size().div(len(df1)).reset_index(name='rate')
print (df1)
   from  to  rate
0     1   2   0.2
1     2   1   0.2
2     1   1   0.4
3     1   3   0.2

推荐阅读