需求如下:我已经有一个热力图了,
把热力图转为马尔科夫矩阵。
我的热力图如下:
过程:
可以看到已经有结果啦
最后让GPT封装成 一个函数,只把不为0的频率返回
他帮我做到这一步就够了 ,剩下的靠我自己来吧。
最终代码:
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
from collections import Counterimport pandas as pdimport read_excel
from collections import Counter#获取先提供列表便于切片用
df=read_excel.df3
code=read_excel.get_code(df)colum_one=code[0::2]
colum_two=code[1::2]
list=[]
#把所有的二元序列 放到List里面
for val1, val2 in zip(colum_one, colum_two):# 在这里处理 val1 和 val2 的值a=val1*10+val2list.append(a)
#def calculate_frequencies(nums):# map elements to intervalsintervals = [int(x/10) for x in nums]# count number of elements in each intervalinterval_counts = Counter(intervals)# count number of elements in each intervalelement_counts = Counter(nums)frequencies = {}# calculate frequencyfor interval, interval_count in interval_counts.items():for element in range(interval*10,interval*10+10):if element in element_counts:freq = element_counts[element]/interval_countif freq != 0:frequencies[element] = freqreturn frequenciesfrequencies = calculate_frequencies(list)
print(frequencies)# 遍历并拿到每对索引和数据,赋值给series
s1 = pd.Series()
s2 = pd.Series()
s3 = pd.Series()
#遍历frequencies
for key,value in frequencies.items():tens = key // 10ones = key % 10twovalue=round(value, 2)s1 = s1.append(pd.Series(tens))s2 = s2.append(pd.Series(ones))s3 = s3.append(pd.Series(twovalue))final_df = pd.DataFrame({'编码': s1, '编码类别': s2, '频率': s3})final_df.to_csv('频率.csv',index = False)
运行结果:
结果还行,
画马尔科夫矩阵,
把这个csv导入画就行。
最终结果
附录 读取csv画热力图的代码
# -*- coding:utf-8 -*-
import seaborn as sns
import matplotlib.pyplot as plt
import wanwan
# 如果用的是 pandas读取的话,写路径即可
# 如果你用load加载 ,你需要复制整个文件,他会自动寻找 你指定的
#读取csv 用pandas 读取csv
import pandas as pddata = pd.read_csv('频率.csv')#dataframe 获取第一列series
#dataframe 获取第一列series data.iloc[:,0]
def ShowGRAHeatMap(DataFrame):colormap = plt.cm.hsvylabels = DataFrame.columns.values.tolist()f, ax = plt.subplots(figsize=(15, 15))ax.set_title('刘老师-教学行为热力图',fontsize=20)# 设置展示一半,如果不需要注释掉mask即可df = pd.DataFrame({'start': data.iloc[:,0], 'end': data.iloc[:,1], 'value': data.iloc[:,2]})with sns.axes_style("white"):sns.heatmap(df.pivot_table(index='start', columns='end', values='value', ),#Pivot_table index 字体大小 columns 字体大小 values 字体大小 annot=True 显示数值 fmt='d' 数值格式cmap="YlGnBu",annot=True,annot_kws={"size": 30},#这个参数可以不显示 科学计数法# 如果热力图 显示数据过长,调整此处即可。#fmt='.20g',)plt.xticks(fontsize=30)plt.yticks(fontsize=30)plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False#调整所有的字体大小plt.rcParams.update({'font.size': 30})plt.show()#保存矢量图 保存到当前文件夹#plt.savefig('热力图.svg', format='')plt.savefig('热力图.png',dpi=600)ShowGRAHeatMap(data)