使用Seaborn可视化丢失数据的发生频率

时间:2019-01-28 01:23:02

标签: python seaborn missing-data find-occurrences cumulative-frequency

我想创建一个24x20的矩阵(8个部分,每个单元有60个单元格或6x10),以可视化方式丢失数据的发生频率(每个周期 480个值< / strong>),并通过panda数据框在数据集中进行绘制,并为'A''B''C'的每一列进行绘制。

到目前为止,我可以映射创建的csv文件,并以正确的方式将值映射到矩阵中,并在更改丢失的数据( nan inf )绘制成sns.heatmap(df.isnull())或类似0这样对数据影响最小的东西,反之亦然。 下面是到目前为止的脚本:

0.01234

问题,我不知道如何正确绘制丢失数据的发生频率,以了解其频繁出现在哪些部分和单元格中。

Note1 的缺失值更多,颜色应更亮,并且在整个循环中100%缺失的数据应以白色颜色和黑色颜色表示表示非缺失值。可能会出现从0%黑色到100%白色的条形图。

注意2 我还提供了3个周期的数据集示例文本文件,其中包含很少的缺失数据,但可以手动对其进行修改和增加:dataset

预期结果应如下所示:

img

1 个答案:

答案 0 :(得分:1)

您可以将nan / inf数据存储在一个单独的数组中,可以将每个nan / inf的周期累加起来。

您的数组似乎总是具有相同的大小,因此我以固定的大小定义了它们。您可以更改它以匹配您的数据:

df1MissingDataFrequency = np.zeros((24,20))

然后,您可以将它们加到获得nan值的位置(在代码中已将inf替换为nan

df1MissingDataFrequency = df1MissingDataFrequency + np.isnan(df1).astype(int)

在您的所有周期中。

您的缩进似乎有些问题。我不知道您发布的代码是否只是这种情况,或者您的实际代码是否相同,但是目前您在每个周期 绘制新图并重新定义{每个df1, df2, df3的{​​1}}。

缺少频率数据后,您的代码应如下所示:

i

这将为您提供所需的输出:

nan frequency

编辑

本着DRY的精神,我编辑了您的代码,以使您没有df1,df2,df3,new_values1,...,并且您一直在复制和粘贴相同的内容。您已经遍历了import numpy as np import pandas as pd import os import seaborn as sns import matplotlib.pyplot as plt def mkdf(ListOf480Numbers): normalMatrix = np.array_split(ListOf480Numbers,8) fixMatrix = [] for i in range(8): lines = np.array_split(normalMatrix[i],6) newMatrix = [0,0,0,0,0,0] for j in (1,3,5): newMatrix[j] = lines[j] for j in (0,2,4): newMatrix[j] = lines[j][::-1] fixMatrix.append(newMatrix) return fixMatrix def print_df(fixMatrix): values = [] for i in range(6): values.append([*fixMatrix[6][i], *fixMatrix[7][i]]) for i in range(6): values.append([*fixMatrix[4][i], *fixMatrix[5][i]]) for i in range(6): values.append([*fixMatrix[2][i], *fixMatrix[3][i]]) for i in range(6): values.append([*fixMatrix[0][i], *fixMatrix[1][i]]) df = pd.DataFrame(values) return (df) dft = pd.read_csv('D:/Feryan2.txt', header=None) id_set = dft[dft.index % 4 == 0].astype('int').values A = dft[dft.index % 4 == 1].values B = dft[dft.index % 4 == 2].values C = dft[dft.index % 4 == 3].values data = {'A': A[:,0], 'B': B[:,0], 'C': C[:,0]} df = pd.DataFrame(data, columns=['A','B','C'], index = id_set[:,0]) nan = np.array(df.isnull()) inf = np.array(df.isnull()) df = df.replace([np.inf, -np.inf], np.nan) df[np.isinf(df)] = np.nan # convert inf to nan df1MissingDataFrequency = np.zeros((24,20)) df2MissingDataFrequency = np.zeros((24,20)) df3MissingDataFrequency = np.zeros((24,20)) #next iteration create all plots, change the number of cycles cycles = int(len(df)/480) print(cycles) for cycle in range(3): count = '{:04}'.format(cycle) j = cycle * 480 new_value1 = df['A'].iloc[j:j+480] new_value2 = df['B'].iloc[j:j+480] new_value3 = df['C'].iloc[j:j+480] df1 = print_df(mkdf(new_value1)) df2 = print_df(mkdf(new_value2)) df3 = print_df(mkdf(new_value3)) for i in df: try: os.mkdir(i) except: pass df1.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) df2.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) df3.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) df1MissingDataFrequency = df1MissingDataFrequency + np.isnan(df1).astype(int) df2MissingDataFrequency = df2MissingDataFrequency + np.isnan(df2).astype(int) df3MissingDataFrequency = df3MissingDataFrequency + np.isnan(df3).astype(int) #plotting all columns ['A','B','C'] in-one-window side by side fig, ax = plt.subplots(nrows=1, ncols=3 , figsize=(10,7)) plt.subplot(131) ax = sns.heatmap(df1MissingDataFrequency, cbar=False, cmap="gray") ax.axhline(y=6, color='w',linewidth=1.5) ax.axhline(y=12, color='w',linewidth=1.5) ax.axhline(y=18, color='w',linewidth=1.5) ax.axvline(x=10, color='w',linewidth=1.5) plt.title('Missing-data frequency in A', fontsize=20 , fontweight='bold', color='black', loc='center', style='italic') plt.axis('off') plt.subplot(132) ax = sns.heatmap(df2MissingDataFrequency, cbar=False, cmap="gray") ax.axhline(y=6, color='w',linewidth=1.5) ax.axhline(y=12, color='w',linewidth=1.5) ax.axhline(y=18, color='w',linewidth=1.5) ax.axvline(x=10, color='w',linewidth=1.5) plt.title('Missing-data frequency in B', fontsize=20 , fontweight='bold', color='black', loc='center', style='italic') plt.axis('off') plt.subplot(133) ax = sns.heatmap(df3MissingDataFrequency, cbar=False, cmap="gray") ax.axhline(y=6, color='w',linewidth=1.5) ax.axhline(y=12, color='w',linewidth=1.5) ax.axhline(y=18, color='w',linewidth=1.5) ax.axvline(x=10, color='w',linewidth=1.5) plt.title('Missing-data frequency in C', fontsize=20 , fontweight='bold', color='black', loc='center', style='italic') plt.axis('off') plt.suptitle(f'Missing-data visualization', color='yellow', backgroundcolor='black', fontsize=15, fontweight='bold') plt.subplots_adjust(top=0.92, bottom=0.02, left=0.05, right=0.96, hspace=0.2, wspace=0.2) fig.text(0.035, 0.93, 'dataset1' , fontsize=19, fontweight='bold', rotation=42., ha='center', va='center',bbox=dict(boxstyle="round",ec=(1., 0.5, 0.5),fc=(1., 0.8, 0.8))) #fig.tight_layout() plt.savefig(f'{i}/result{count}.png') #plt.show() ,因此应该使用它来实际处理数据框中的三个不同列:

i