chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵

需求如下:我已经有一个热力图了,
把热力图转为马尔科夫矩阵。
我的热力图如下:
chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第1张图片

过程:

chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第2张图片
chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第3张图片

chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第4张图片
可以看到已经有结果啦
最后让GPT封装成 一个函数,只把不为0的频率返回
chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第5张图片
他帮我做到这一步就够了 ,剩下的靠我自己来吧。

最终代码:

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
from collections import Counter

import pandas as pd

import 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+val2

    list.append(a)
#

def calculate_frequencies(nums):
    # map elements to intervals
    intervals = [int(x/10) for x in nums]

    # count number of elements in each interval
    interval_counts = Counter(intervals)

    # count number of elements in each interval
    element_counts = Counter(nums)

    frequencies = {}
    # calculate frequency
    for 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_count
                if freq != 0:
                    frequencies[element] = freq
    return frequencies


frequencies = calculate_frequencies(list)
print(frequencies)


# 遍历并拿到每对索引和数据,赋值给series
s1 = pd.Series()
s2 = pd.Series()
s3 = pd.Series()
#遍历frequencies
for key,value in frequencies.items():
    tens = key // 10
    ones = key % 10
    twovalue=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)


运行结果:

chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第6张图片
结果还行,
画马尔科夫矩阵,
把这个csv导入画就行。

最终结果

chatGPT帮忙统计热力图的频率绘制马尔科夫状态转移矩阵_第7张图片

附录 读取csv画热力图的代码

# -*- coding:utf-8 -*-
import seaborn as sns
import matplotlib.pyplot as plt
import wanwan
# 如果用的是 pandas读取的话,写路径即可
# 如果你用load加载 ,你需要复制整个文件,他会自动寻找 你指定的
#读取csv  用pandas 读取csv
import pandas as pd


data = pd.read_csv('频率.csv')

#dataframe 获取第一列series
#dataframe 获取第一列series      data.iloc[:,0]
def ShowGRAHeatMap(DataFrame):
    colormap = plt.cm.hsv
    ylabels = 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)

你可能感兴趣的:(python,矩阵,python,线性代数)