计数和比例的转换矩阵 python
transition matrix for counts and proportions python
我有一个矩阵,其中包含 class 不同年份的成绩(行代表年份,列代表成绩)。
我想要的是建立一个年与年之间变化的转换矩阵。
例如,我想要 y 轴上的 t-1 年和 x 轴上的 t 年,然后我想要一个转换矩阵,其中包含 t-1 年之间 A 级人数的差异和 t,t-1 年和 t 年之间的 B 级,依此类推。
然后是具有比例的第二个转换矩阵,例如:
- 在 t-1 年和 t 年之间,有 z% more/less 人的成绩为 A/B/C/D/F.
显然最重要的部分是对角线,它代表不同年份同一年级的变化。
我希望在 Python 内完成。
非常感谢,我希望一切都清楚。
结果示例:
enter image description here
您可以将 pandas 库与 df.diff
一起使用。 numpy 可以使用 np.subtract.outer
生成所有可能差异的矩阵。下面是一个例子。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
years = ['2015', '2016', '2017']
grades = ['A', 'B', 'C', 'D']
df = pd.DataFrame(np.random.randint(0, 10, (3, 4)), columns=grades, index=years)
print(df)
A B C D
2015 5 0 2 0
2016 7 2 0 2
2017 3 7 6 7
df_diff = df.diff(axis=0)
print(df_diff)
df_diff
中的每一行是当前行与原始 df 的前一行之间的差异
A B C D
2015 NaN NaN NaN NaN
2016 2.0 2.0 -2.0 2.0
2017 -4.0 5.0 6.0 5.0
a = np.array([])
differences = []
for i, y in enumerate(years):
for j, g in enumerate(grades):
differences.append(y+g)
a = np.append(a, df.iloc[i,j])
df3 = pd.DataFrame(np.subtract.outer(a, a), columns=differences, index=differences)
print(df3)
2015A 2015B 2015C 2015D 2016A 2016B 2016C 2016D 2017A 2017B 2017C 2017D
2015A 0.0 5.0 3.0 5.0 -2.0 3.0 5.0 3.0 2.0 -2.0 -1.0 -2.0
2015B -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2015C -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2015D -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2016A 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
2016B -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2016C -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2016D -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2017A -2.0 3.0 1.0 3.0 -4.0 1.0 3.0 1.0 0.0 -4.0 -3.0 -4.0
2017B 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
2017C 1.0 6.0 4.0 6.0 -1.0 4.0 6.0 4.0 3.0 -1.0 0.0 -1.0
2017D 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
使用 matplotlib
中的 matshow
绘制此矩阵
plt.matshow(df3)
plt.colorbar()
plt.show()
我有一个矩阵,其中包含 class 不同年份的成绩(行代表年份,列代表成绩)。 我想要的是建立一个年与年之间变化的转换矩阵。
例如,我想要 y 轴上的 t-1 年和 x 轴上的 t 年,然后我想要一个转换矩阵,其中包含 t-1 年之间 A 级人数的差异和 t,t-1 年和 t 年之间的 B 级,依此类推。 然后是具有比例的第二个转换矩阵,例如: - 在 t-1 年和 t 年之间,有 z% more/less 人的成绩为 A/B/C/D/F.
显然最重要的部分是对角线,它代表不同年份同一年级的变化。
我希望在 Python 内完成。
非常感谢,我希望一切都清楚。
结果示例: enter image description here
您可以将 pandas 库与 df.diff
一起使用。 numpy 可以使用 np.subtract.outer
生成所有可能差异的矩阵。下面是一个例子。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
years = ['2015', '2016', '2017']
grades = ['A', 'B', 'C', 'D']
df = pd.DataFrame(np.random.randint(0, 10, (3, 4)), columns=grades, index=years)
print(df)
A B C D
2015 5 0 2 0
2016 7 2 0 2
2017 3 7 6 7
df_diff = df.diff(axis=0)
print(df_diff)
df_diff
中的每一行是当前行与原始 df 的前一行之间的差异
A B C D
2015 NaN NaN NaN NaN
2016 2.0 2.0 -2.0 2.0
2017 -4.0 5.0 6.0 5.0
a = np.array([])
differences = []
for i, y in enumerate(years):
for j, g in enumerate(grades):
differences.append(y+g)
a = np.append(a, df.iloc[i,j])
df3 = pd.DataFrame(np.subtract.outer(a, a), columns=differences, index=differences)
print(df3)
2015A 2015B 2015C 2015D 2016A 2016B 2016C 2016D 2017A 2017B 2017C 2017D
2015A 0.0 5.0 3.0 5.0 -2.0 3.0 5.0 3.0 2.0 -2.0 -1.0 -2.0
2015B -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2015C -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2015D -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2016A 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
2016B -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2016C -5.0 0.0 -2.0 0.0 -7.0 -2.0 0.0 -2.0 -3.0 -7.0 -6.0 -7.0
2016D -3.0 2.0 0.0 2.0 -5.0 0.0 2.0 0.0 -1.0 -5.0 -4.0 -5.0
2017A -2.0 3.0 1.0 3.0 -4.0 1.0 3.0 1.0 0.0 -4.0 -3.0 -4.0
2017B 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
2017C 1.0 6.0 4.0 6.0 -1.0 4.0 6.0 4.0 3.0 -1.0 0.0 -1.0
2017D 2.0 7.0 5.0 7.0 0.0 5.0 7.0 5.0 4.0 0.0 1.0 0.0
使用 matplotlib
matshow
绘制此矩阵
plt.matshow(df3)
plt.colorbar()
plt.show()