问题描述
我正在寻找一种方便的方法来显示 Seaborn regplot 中回归线的计算。我在 Jupyter Notebook 中使用 Python。
在查看其他一些 stackoverflow 帖子后,我的理解是您无法直接显示图中使用的 fit_reg
计算。
相反,我找到了使用 from scipy import stats
模块的建议。
但是,这似乎对我不起作用:
from scipy import stats
#Read frame and create array of scores
read_frame = pd.DataFrame([each])
dates = list(read_frame.keys())
stock = dates.pop(0)
stock = each[stock]
stock_score = []
for key in dates:
score = read_frame[key].to_list()
stock_score.extend(score)
# y = dates,x = stock_score
slope = stats.linregress(dates,stock_score)
print(slope)
#[EDIT] Added data used for calculation.
# dates: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
# stock_score: [0.06933703703703704,0.07373142857142856,0.12000285714285716,0.1634861111111112,0.1726382978723404,0.548125,0.04427257383966246,0.08823866666666677,0.039461915367483294,-0.03524617834394902,0.033837903225806445,0.023088636363636363,-0.25486666666666663,0.07539999999999997,0.08250487804878054]
# Output
LinregressResult(slope=nan,intercept=nan,rvalue=nan,pvalue=nan,stderr=nan)
我想要做的是以一种方便的方式获得回归线的计算。
# Scatterplot with regressionline for each stock
import seaborn as sns
from scipy import stats
colors = ['black','red','yellow','blue','green','orange','purple','pink','brown','coral','teal','navy','grey','violet','maroon']
ctr = 0
for each in new_stock_scores:
read_frame = pd.DataFrame([each])
dates = list(read_frame.keys())
stock = dates.pop(0)
stock = each[stock]
stock_score = []
for key in dates:
score = read_frame[key].to_list()
stock_score.extend(score)
#Regression line
slope = stats.linregress(dates,stock_score)
print(slope)
#Regression plot
sns.set(style="whitegrid")
sns.set_context("paper")
ax = sns.regplot(x = dates,y = stock_score,color = colors[ctr],ci = None)
ax.set_title(stock,weight ='bold').set_fontsize('16')
ax.set(xticks = dates)
ax.set(xlabel = 'Date',ylabel = 'score')
plt.xlim(0,16)
plt.show()
ctr += 1
解决方法
我似乎无法重现您的问题
import scipy.stats as sps
dates = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
stock_score = [0.06933703703703704,0.07373142857142856,0.12000285714285716,0.1634861111111112,0.1726382978723404,0.548125,0.04427257383966246,0.08823866666666677,0.039461915367483294,-0.03524617834394902,0.033837903225806445,0.023088636363636363,-0.25486666666666663,0.07539999999999997,0.08250487804878054]
linreg = sps.linregress(dates,stock_score)
print(linreg)
print('slope',linreg.slope)
给予
LinregressResult(slope=-0.014006090719584158,intercept=0.19498288977241957,rvalue=-0.38523447967018376,pvalue=0.1561897736602469,stderr=0.009305431260444107,intercept_stderr=0.08460610819916589)
slope -0.014006090719584158
您可以尝试检查您的 scipy
版本
import scipy
print(scipy.__version__)
1.6.1