Визуализация частоты появления отсутствующих данных с помощью seaborn

Я хотел бы создать матрицу 24x20 (8 секций по 60 ячеек в каждой или 6x10) для визуализации частоты появления отсутствующих данных через циклы (= каждое 480 значений ) в наборе данных через фреймворк panda и нанесите его на график для каждого столбца _1 _, _ 2 _, _ 3_.

До сих пор я мог сопоставить созданные файлы csv и правильно сопоставить значения в матрице и отобразить их через sns.heatmap(df.isnull()) после изменения отсутствующих данных (nan и inf) на 0 или что-то вроде 0.01234, которое меньше всего влияет на данные и, с другой стороны, может быть построено на графике. Ниже приведены мои сценарии на данный момент:

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:\Feryan.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
#dff = df[df.isnull().any(axis=1)]   # extract sub data frame

#df = df.fillna(0)
#df = df.replace(0,np.nan)



#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)

    #plotting all columns ['A','B','C'] in-one-window side by side


    fig, ax = plt.subplots(nrows=1, ncols=3 , figsize=(20,10))
    plt.subplot(131)

    ax = sns.heatmap(df1.isnull(), cbar=False)
    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(df2.isnull(), cbar=False)
    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(df3.isnull(), cbar=False)
    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()      

Проблема в том, что я не знаю, как правильно определить частоту появления отсутствующих данных, чтобы понять, в каких разделах и ячейках это происходит часто.

Примечание1, больше отсутствующего значения, цвет должен быть ярче, а 100% отсутствующих данных в циклах должны быть представлены белым цветом, а сплошным черным цветом означает отсутствие пропущенные значения. гистограмма может начинаться от черного 0% до 100% белого цвета.

Примечание 2. Я также предоставляю образец текстового файла набора данных для 3 циклов, включающий несколько недостающих данных, но его можно вручную изменить и увеличить: набор данных

Ожидаемый результат должен быть таким, как показано ниже:

img


person Mario    schedule 28.01.2019    source источник
comment
вы не предоставили функцию нормализации в своем примере кода, а функция из другого кода принимает другое количество аргументов.   -  person Freya W    schedule 01.02.2019
comment
Кроме того, предоставленный вами образец данных не включает точки данных, которые отсутствовали бы в 1, 2 ИЛИ 3 циклах, они отсутствовали только в 1 цикле, поэтому тепловая карта не будет отображать никаких вариаций частоты. не могли бы вы предоставить данные, которые показали бы что-то похожее на ваш ожидаемый результат?   -  person Freya W    schedule 01.02.2019
comment
@FreyaW, вы правы, я предоставил правильный набор данных, включая недостающие данные, и обновил ожидаемый результат. в наборе данных я заменил nan и inf некоторыми значениями: Для раздела 0 я заменил все значения на nan и infs для всех 3 циклов, это означает, что раздел должен быть показан полностью белым (100%). В разделе 7 я заменил недостающие данные для первых 2 циклов, что означает, что эта область должна быть сместена на более темную (67% белого). Для раздела 3 я сделал то же самое только для 1-го цикла, это означает более темное (33% белого). Остальные разделы не содержат пропущенных значений, поэтому они сплошного черного цвета.   -  person Mario    schedule 01.02.2019
comment
Забыл удалить скрипты процесса нормализации, извините.   -  person Mario    schedule 01.02.2019
comment
не могли бы вы перепроверить свои данные? Похоже, это вызывает новые ошибки в вашем скрипте. Я получаю много, если записи в id_set = 25, и я не думаю, что это правильно, может быть где-то отсутствует строка, смещающая ваш идентификатор и A, B, B. Вы пробовали свой скрипт с данными, которые вы предоставили? На данный момент выдает ошибки. Также вы должны убрать свой код new_value1 = .... в противном случае вы назначаете их три раза, потому что они находятся в вашем for i in df: цикле, когда они не должны быть, поскольку ничто в определении не зависит от ì`   -  person Freya W    schedule 03.02.2019
comment
@FreyaW Я проверил, что ты прав, я решил и обновил набор данных. и скрипты оба. Я протестировал обновленные сценарии с помощью обновленного набора данных, и все было нормально, что он правильно печатает A, B, C вместе без каких-либо проблем.   -  person Mario    schedule 03.02.2019
comment
@FreyaW Могу я попросить вас сначала взглянуть на этот вопрос, что очень важно для меня, так как я думаю, вам будет так легко, потому что вы примерно знаете мои скрипты.   -  person Mario    schedule 03.02.2019
comment
Я печатаю первые матрицы 'A', 'B', 'C', затем я строю их на основе этих файлов csv, и эта задача состоит в том, чтобы создать фрейм данных pandas или изменить их форму, чтобы взять каждый элемент Matrix A, Matrix B, Matrix C и сложите его для каждого цикла, т.е. [A (1,1), B (1,1), C (1,1), A (1,2), B (1,2), (C1,2), ...., A (24,20), B (24,20), C (24,20)] для 1-го цикла, затем снова такой же для 2-го цикла до последнего, в конце концов, у меня есть большой фрейм данных, который имеет 3 * 480 столбцов через циклы.   -  person Mario    schedule 03.02.2019
comment
вы связали именно тот вопрос, который мы обсуждаем в данный момент. Вы имели в виду другой вопрос, который сейчас важнее?   -  person Freya W    schedule 04.02.2019
comment
извините, я имею в виду этот вопрос, но кто-то ответил быстро, но если у вас есть другое решение, не стесняйтесь уходить оттуда   -  person Mario    schedule 04.02.2019
comment
@FreyaW Привет, мне было интересно, есть ли у вас идеи относительно этого вопрос. Давно от тебя ничего не слышно!   -  person Mario    schedule 26.03.2019
comment
Привет! Похоже, Микушефски ответил на этот вопрос, его ответ - то, что вы ищете?   -  person Freya W    schedule 27.03.2019
comment
@FreyaW не совсем, но я его ценю. Я поделился образцом набора данных для отображения моих температурных данных в стандартном тепловом профиле с помощью fit_curve, чтобы я мог извлечь шаблон о распределении температуры в каждой точке измерения. Моя цель состояла в том, чтобы увидеть, как часто точки измерения возникают в режиме High или Low или между ними, что редко при сопоставлении. В конце концов, я хотел бы иметь какую-то формулу или / и график, который лучше всего описывает данные, которые я измерял. Я думал об основе шаблона, который я мог бы исправить недостающие данные в столбце температуры, так как они либо высокие, либо низкие.   -  person Mario    schedule 28.03.2019
comment
@FreyaW Привет, мне было интересно, есть ли у вас хорошее представление об этом вопрос. Хороших выходных   -  person Mario    schedule 12.04.2019
comment
@FreyaW, не могли бы вы взглянуть на мой новый вопрос, если у вас было свободное время, и оставьте мне свою идею, как я могу ее реализовать?   -  person Mario    schedule 14.04.2019
comment
извините, я сейчас очень занят работой и жизнью. Удачи в вопросе!   -  person Freya W    schedule 15.04.2019
comment
@FreyaW как жаль! Честно говоря, этот вопрос очень важен для меня, и он помогает мне оценить свой результат как последний шаг, тем не менее, это не займет так много времени, но спасибо за ваш ответ. Ты самый лучший, дорогой, твои ответы всегда помогали мне, чувак. Хорошего дня.   -  person Mario    schedule 15.04.2019
comment
@FreyaW Привет: D, мне было интересно, пользуетесь ли вы DNN, и вы могли бы мне помочь, посмотрев на этот вопрос и проверьте, как я изменил форму моего набора данных. Я чувствую, что что-то не так или это не было научно реализовано. Я хочу получить обратную связь с вашей стороны, по крайней мере, проверьте мой подход и набор данных, пожалуйста.   -  person Mario    schedule 05.05.2019


Ответы (1)


Вы можете хранить свои данные nan / inf в отдельном массиве, который можно складывать по циклам для каждого nan / inf.

Кажется, что ваши массивы всегда имеют одинаковый размер, поэтому я определил их с фиксированным размером. Вы можете изменить это в соответствии со своими данными:

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

Затем вы можете сложить их и получить значение nan (вы уже заменили inf на nan в своем коде):

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

по всем вашим циклам.

Кажется, у вас проблемы с отступом. Я не знаю, верно ли это только для кода, который вы разместили здесь, или это то же самое в вашем фактическом коде, но в тот момент, когда вы создаете новый график в каждом цикле и вы заново определяете df1, df2, df3 для каждого i.

С вашими недостающими частотными данными ваш код должен выглядеть так:

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()      

Что дает вам желаемый результат:

наночастота

ИЗМЕНИТЬ

В духе DRY я отредактировал ваш код так, чтобы у вас не было df1, df2, df3, new_values1, ... и вы копируете и вставляете одни и те же вещи повсюду. Вы уже перебираете i, поэтому вам следует использовать это для фактического обращения к трем различным столбцам в вашем фрейме данных:

dft = pd.read_csv('C:/Users/frefra/Downloads/Feryan2.txt', header=None).replace([np.inf, -np.inf], np.nan)
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])


new_values = []
dfs = []
nan_frequencies = np.zeros((3,24,20))

#next iteration create all plots, change the number of cycles
cycles = int(len(df)/480)
print(cycles)
for cycle in range(cycles):
    count =  '{:04}'.format(cycle)
    j = cycle * 480
    for idx,i in enumerate(df):
        try:
            os.mkdir(i)
        except:
            pass
        new_value = df[i].iloc[j:j+480]        
        new_values.append(new_value)
        dfi = print_df(mkdf(new_value))
        dfs.append(dfi)
        dfi.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) 
        nan_frequencies[idx] = nan_frequencies[idx] + np.isnan(dfi).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))

for idx,i in enumerate(df):

    plt.subplot(1,3,idx+1)

    ax = sns.heatmap(nan_frequencies[idx], 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 ' + i, fontsize=20 , fontweight='bold', color='black', loc='center', style='italic')
    plt.axis('off')

person Freya W    schedule 04.02.2019
comment
Чувак, ты потрясающий, и мне понравился твой СУХИЙ подход! просто мелочь относительно cbar Я уже пробовал cbar=True, cmap="gray", cbar_kws={"ticks":[0,20,40,60,80,100]} для последнего рисунка 'C', но я не мог исправить оценки в правой части cbar. даже я пробовал решения в этом сообщении с минимальными изменениями в наших скриптах, но мне это не удалось . в 1-м подходе я также заметил, что он не сохраняет матрицы 'A', 'B' как файлы csv в папке, но сохраняет 'C' вы знаете почему? - person Mario; 04.02.2019
comment
Я также тестировал версию DRY, но ее вывод не печатает A, B, C рядом, но подход классный. его вывод напоминает о том, когда я не мог отобразить все A, B, C в одном окне из-за моей ошибки в цикле for, и вы исправили это в предыдущем вопросе. почему здесь дело? - person Mario; 04.02.2019
comment
Могу я попросить вас также взглянуть на этот важный вопрос? Для меня это очень важно. Я не знаю, как мне его изменить - person Mario; 05.02.2019
comment
@Mario, очищенная версия, использующая сухой принцип, должна дать точно такой же результат. На второй вопрос, похоже, уже есть ответ. Кроме того, как я уже сказал, вам следует сократить свои вопросы до 20 строк кода или меньше, чтобы свести их к основной проблеме. Если вы не знаете, как изменить форму, предоставьте минимальный пример (лучше не использовать какие-либо внешние наборы данных), показывающий, что вы пытаетесь сделать. - person Freya W; 05.02.2019
comment
Вы единственный здесь, кто знаком со структурой моих скриптов, поэтому я рассчитываю на вас. Вы помните, что мы извлекли 3 параметра из набора данных текстового файла и сопоставили их с отдельными матрицами после и до нормализации и сохранили их как файлы csv. теперь моя проблема в том, что мне нужно, чтобы они объединяли элементы этих трех матриц для каждого цикла таким образом, чтобы для каждого цикла я мог иметь, например: 1-ю строку как 1-й цикл [A(1,1), B(1,1),C(1,1),...,A(24,20), B(24,20),C(24,20)] и другие строки под ними в качестве других циклов, это своего рода изменение формы и я думаю, что мы сможем этого добиться, выполнив цикл for. - person Mario; 05.02.2019
comment
Я попробовал ответить парня, который оставил сообщение, но у него 3 проблемы: 1-я проблема возникает после того, как я использую after def normalize() в цикле for, несмотря на ошибку, у него есть предупреждение FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead. для D = dff.as_matrix (). Ravel ( ), что не важно, но прямо сейчас, так как это FutureWarning, тем не менее, я проверил, что форма вывода была правильной для 3 циклов, используя print(data1.shape), и это было (3, 1440), что верно 3 строки как 3 цикла и количество столбцов должно быть 3 умножить на 480 = 1440. - person Mario; 05.02.2019
comment
Еще одна проблема, требующая обратимого подхода и решения. Я имею в виду, что позже я смогу регенерировать свои матрицы A, B, C для каждого цикла из этого вывода с формой (3, 1440) - person Mario; 05.02.2019
comment
@Mario, такое ощущение, что вы задаете не столько конкретные, логичные вопросы, сколько хотите, чтобы кто-то выполнял работу / отладку / думал за вас. Это не то, для чего нужен stackoverflow. Если вы потратили достаточно времени на отладку другого вопроса, чтобы свести его к минималистичному образцу кода, показывающему, что не так, тогда я посмотрю на него. В качестве альтернативы вы можете использовать внештатного программиста и платить ему за выполнение ваших задач. - person Freya W; 06.02.2019
comment
У меня нет слов. Я задал этот вопрос с обратимым -подход, и я уверен, что многие люди в будущем воспользуются этим, и я подготовил минимальный пример в начале и попытался свести к основной проблеме. надеюсь, ты поможешь мне в свободное время. - person Mario; 06.02.2019
comment
Я также принял ваш ответ на этот пост, так как основная работа была сделана, за исключением cbar части, но это не имеет значения, и я очень благодарен вам за то, что вы уделили время моим вопросам. Я надеюсь, что скоро вы наберете огромную репутацию, однако такие люди, как я, мы многому научимся из ваших ответов, и мы надеемся, что кто-то вроде вас найдет какое-то логическое решение наших проблем и сделает наш день. - person Mario; 06.02.2019
comment
@Mario, я пишу это, потому что кажется, что у вас нет времени на то, чтобы улучшить свой код. В вашем связанном вопросе вы по-прежнему делаете ошибку объявления df1, df2 и т.д. в каждом цикле над i, что приводит к ошибкам нормализации и тройному коду, хотя я упоминал об этом ранее. Кроме того, ваши вопросы настолько обширны, что обычно требуется около получаса, чтобы понять то, что вы пытаетесь сделать. Я знаю, что вы пытаетесь, и ваши вопросы всегда очень обстоятельны, но они не совсем MVCE, которые помогут вам лучше всего. на SO. - person Freya W; 06.02.2019
comment
ты так прав, что это рушит нормализацию. Мне стыдно . Я их починил. Чувак, я чувствую, что не заслуживаю твоей помощи. Мне интересно, почему я не заметил эту проблему, но главная проблема заключалась в изменении формы. Мне так стыдно, но, пожалуйста, не забывайте меня, если у вас есть свободное время, чтобы посмотреть. - person Mario; 06.02.2019