pandas实现传递熵
时间: 2023-07-13 22:25:15 浏览: 231
传递熵是一种用于分析时间序列数据的方法,可以用来探索两个时间序列之间的信息流动方向。在 Pandas 中,可以使用 `shift()` 函数对时间序列进行滞后处理,然后使用 `corr()` 函数计算两个序列之间的相关性。以下是一个简单的示例代码,演示了如何在 Pandas 中计算传递熵:
```python
import pandas as pd
import numpy as np
# 生成示例数据
data = pd.DataFrame({
'X': np.random.rand(100),
'Y': np.random.rand(100)
})
# 计算 X 到 Y 的传递熵
tau = 1 # 延迟时间
k = 1 # 最大阶数
te_xy = np.zeros(k)
for i in range(k):
X = data['X'].shift(i)
Y = data['Y']
te_xy[i] = (-1) * np.mean(np.log2(np.abs(Y[X.notnull()].values - Y[X.notnull() - tau].values)))
print("传递熵(X->Y):", te_xy)
```
在这个示例中,我们使用了一个简单的延迟时间和最大阶数,但是你可以根据你的数据调整这些参数。请注意,传递熵计算中使用了对数函数,因此需要确保数据中不包含零值。
相关问题
优化这段代码import pandas as pd import numpy as np import matplotlib.pyplot as plt #计算信息熵的函数 def calc_ent(x): """ calculate shanno ent of x """ #x.shape[0]计算数组x的元素长度,x长度为x.shape[0]=6 #set() 函数创建一个无序不重复元素集 x_value_list = set([x[i] for i in range(x.shape[0])]) #得到数组x的元素(不包含重复元素),即x_value_list={'c', 'b', 'a'} ent = 0.0 for x_value in x_value_list: p = float(x[x == x_value].shape[0]) / x.shape[0]#计算每个元素出现的概率 logp = np.log2(p) ent -= p * logp print(ent) # 读取Excel文件 df= pd.read_excel("C:\\Users\\a'b'c\\Desktop\\毕设\\图纸数据5.0.xlsx") # 获取Excel文件的列数 num_cols = df.shape[1] weights=[] # 将每一列转换为array形式 for i in range(num_cols): # 获取列名 col_name = df.columns[i] # 将列转换为array形式 col_array = np.array(df[col_name]) #输出每一列的信息熵的值 ent = calc_ent(col_array) #print(col_name, ent) x = i y =ent plt.figure() plt.plot(x, y, linestyle='--', color='blue') plt.xlabel('序号') plt.ylabel('信息熵') plt.show()想要把x轴为序号i,Y轴依次是每个i对应的ent值
你可以将每个i对应的ent值存储到一个数组中,然后将数组作为参数传递给plt.plot()函数,这样就可以在同一个图表中显示所有的信息熵值了。修改后的代码如下:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#计算信息熵的函数
def calc_ent(x):
"""
calculate shanno ent of x
"""
#x.shape[0]计算数组x的元素长度,x长度为x.shape[0]=6
#set() 函数创建一个无序不重复元素集
x_value_list = set([x[i] for i in range(x.shape[0])])
#得到数组x的元素(不包含重复元素),即x_value_list={'c', 'b', 'a'}
ent = 0.0
for x_value in x_value_list:
p = float(x[x == x_value].shape[0]) / x.shape[0]#计算每个元素出现的概率
logp = np.log2(p)
ent -= p * logp
return ent
# 读取Excel文件
df= pd.read_excel("C:\\Users\\a'b'c\\Desktop\\毕设\\图纸数据5.0.xlsx")
# 获取Excel文件的列数
num_cols = df.shape[1]
ent_list = [] # 存储每一列的信息熵值
for i in range(num_cols):
# 获取列名
col_name = df.columns[i]
# 将列转换为array形式
col_array = np.array(df[col_name])
#输出每一列的信息熵的值
ent = calc_ent(col_array)
ent_list.append(ent)
# 绘制信息熵的折线图
plt.plot(ent_list, linestyle='--', color='blue')
plt.xlabel('序号')
plt.ylabel('信息熵')
plt.show()
```
这段代码将每一列的信息熵值存储在ent_list数组中,然后将ent_list作为参数传递给plt.plot()函数,绘制出信息熵的折线图。
阅读全文