#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
, но я не могу это отладить, не зная точного сообщения об ошибке, которое вы получаете.