Условный оператор внутри для статистики цикла.linregress

#python

Вопрос:

Я относительно новичок в python, поэтому все еще изучаю эффективное циклическое кодирование.

Я работал над созданием цикла for, предназначенного для перебора числовых переменных в наборе данных. Цикл (как написано) отображает график и предоставляет двумерную статистику по всем числовым переменным в моем наборе данных. Но в наборе данных более 100 переменных, поэтому перебор всех комбинаций является чрезвычайно трудоемким и ненужным.

Сейчас я пытаюсь выяснить, какой код я могу вставить в этот цикл (и где), который позволит мне установить пороговое значение r (будучи r в stats.linregress). Цель состоит в том, чтобы упростить код, повторяющий каждую комбинацию числовых переменных в наборе данных, и вместо этого ограничить итерации комбинациями переменных с заданным значением r (установив его на значение, имеющее значение), тем самым пропуская ненужные итерации комбинаций. Я думал, что простое «если/иначе» сработает, но оно продолжает ломаться на мне или строить пустой график.

код, который я использую:

 list_of_checked_variables= []
for column_a in numeric_variable_list:
    for column_b in numeric_variable_list:
        list_of_checked_variables.append(column_a)
        if column_b not in list_of_checked_variables:
            correlation_plot = sns.regplot(x=df[column_a], y=df[column_b])
            sns.despine(top=True, right=True)
            # regression line
            m, b, r, p, err = stats.linregress(df[column_a], df[column_b])
            # Add formula, r^2, and p-value to the graph
            textstr= 'y  = '   str(round(m, 2))   'x   '   str(round(b, 2))   'n'
            textstr  = 'r2 = '   str(round(r**2, 4))   'n'
            textstr  = 'p  = '   str(round(p, 4))
            plt.text(0.15, 0.70, textstr, fontsize=12, transform=plt.gcf().transFigure)
            plt.show(correlation_plot)
            plt.close()
        else:
            continue
 

Ответ №1:

Многократное циклическое выполнение обходится дорого (т. Е. медленно и требует много памяти) в Python, потому что, в отличие от C , все является объектом. На каждой итерации цикла Python создает новый объект. Понимание списков/словарей и генераторные выражения помогают в этом, потому что они оптимизированы на уровне C, поэтому используйте их везде, где можете. (f-строки также являются оптимизированной функцией в Python 3.x, поэтому вам также следует попытаться использовать их там, где вы можете; я думаю, что они более удобочитаемы.)

Для задач типа комбинаций и перестановок я бы использовал встроенный itertools модуль.

 import itertools
from matplotlib import pyplot as plt
import pandas as pd
from scipy import stats

import seaborn as sns

if __name__ == "__main__":

    # ...get your numeric_variable_list
    
    # Set r-threshold
    rthresh = 0.95  # Example

    # Get tuple of combos
    combos = itertools.combinations(numeric_variable_list, 2)

    # Dictionary comprehension
    regstats = {c:stats.linregress(c[0], c[1]) for c in combos}
    regstats = {k:v for (k,v) in regstats.items() if v[2] >= rthresh}

    for c, stat in regstats.items():
        m, b, r, p, err = stat
        
        // Create plots
        correlation_plot = sns.regplot(c[0], c[1])
        sns.despine(top=True, right=True)
        
        # Make your text
        textstr = f"y = {m:.2f}x   {b:.2f}n"
        textstr  = f"r2 = {r**2:.4f}n"
        textstr  = f"p = {p:.4f}"
        
        plt.text(
            0.15, 
            0.70, 
            textstr, 
            fontsize=12, 
            transform=plt.gcf().transFigure
        )
        
        plt.show(correlation_plot)
 

Это мои первые предложения. Возможно, вы можете сделать еще больше для улучшения ситуации, но это должно сработать хорошо. Еще одна вещь, которую вы, возможно, захотите изучить, — это автоматическое plt.save создание графиков, особенно если их сотни, вместо того, чтобы просматривать каждый и вручную сохранять их по отдельности.

Если появятся конкретные ошибки, дайте мне знать. Ан if/else должен работать в теории. Возможно , в вас что-то скрывается numeric_variable_list , но я не могу это отладить, не зная точного сообщения об ошибке, которое вы получаете.