|
|
1
Frayal
6 年前
首先,如果您已经知道所需的坡度,可以在Python中完成这项工作,但是如果您有大量的数据,则需要小心。
其次,如果标准为5%,则坡度10.5将不会被修正。
您要求的解决方案
some imports
将熊猫作为PD导入
将numpy导入为np
从scipy.stats导入规范
从scipy导入统计
将matplotlib.pyplot导入为plt
将熊猫作为PD导入
df=read_csv('your_file.csv')
国家=“美国”
愿望坡度=10
x=df[df[‘country’]==状态][x]
y=df[df[‘country’]==状态][y]
“用于测试
x=[4+(i/10),对于范围(100)内的i]
y=[c*11+norm.rvs()*4代表c in x]
’’
z=[abs(v-desire_slope*c)表示v,c,in-zip(y,x)]
斜率,截距,r_值,p_值,std_err=stats.lingress(x,y)
打印(斜率)
如果(abs(坡度-期望坡度)/坡度<0.05):
打印(“坡度很好”)
其他:
sorted_index_pos=[索引索引,已排序的num(枚举(Z),键=lambda x:x[-1])][-2:]
打印(已排序的索引位置)
del x[排序后的索引\u pos[-1]]
del y[排序后的索引位置[-1]]
del x[排序后的索引位置[0]
del y[排序的索引位置[0]
新的斜率,截距,r_值,p_值,std_err=stats.lingress(x,y)
打印(新坡度)
< /代码>
输出:
11.08066739990693
〔78, 85〕
11.026005655263733
< /代码>
为什么你需要小心
首先,我们不考虑拦截,这可能是个问题。另外,如果我运行以下命令:
x=[4+(i/100)for i in range(1000)]
y=[c*10+norm.rvs()*4代表c in x]
斜率,截距,r_值,p_值,std_err=stats.lingress(x,y)
print(“这里的坡度是:”+str(slope))。
z=[c*x中c的斜率]
print(“平均值:”+str(sum(x)/len(x)))
plt.绘图(x,y,'b',x,z,'r-')
< /代码>
我得到以下输出:
这里的坡度是:10.04367376783041
平均值:8.995
< /代码>
wich表明,这些点在斜坡两侧的分布并不均匀。如果将该点行驶得太远,可能会使数据集更不平衡,从而无法改善坡度。所以在这样做的时候要充满希望
当标准为5%时,坡度10.5将不会被修正。
你要的解决方案
#some imports
import pandas as pd
import numpy as np
from scipy.stats import norm
from scipy import stats
import matplotlib.pyplot as plt
import pandas as pd
df = read_csv('your_file.csv')
state = 'USA'
desire_slope = 10
x = df[df['Country']==state][x]
y = df[df['Country']==state][y]
'''to use for test
x = [ 4+(i/10) for i in range(100)]
y = [c*11+norm.rvs()*4 for c in x ]
'''
z = [abs(v-desire_slope*c) for v,c in zip(y,x)]
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print(slope)
if(abs(slope-desire_slope)/slope<0.05):
print("slope is fine")
else:
sorted_index_pos = [index for index, num in sorted(enumerate(z), key=lambda x: x[-1])][-2:]
print(sorted_index_pos)
del x[sorted_index_pos[-1]]
del y[sorted_index_pos[-1]]
del x[sorted_index_pos[0]]
del y[sorted_index_pos[0]]
new_slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print(new_slope)
产量:
11.08066739990693
[78, 85]
11.026005655263733
为什么你需要小心
首先,我们不考虑拦截,这可能是个问题。另外,如果我运行以下命令:
x = [ 4+(i/100) for i in range(1000)]
y = [c*10+norm.rvs()*4 for c in x ]
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print("the slope here is: "+str(slope))
z = [c*slope for c in x]
print("average of values: "+str(sum(x)/len(x)))
plt.plot(x,y,'b',x,z,'r-')
我得到以下输出:
the slope here is: 10.04367376783041
average of values: 8.995
wich表明,这些点在斜坡两侧的分布并不均匀。如果将该点行驶得太远,可能会使数据集更不平衡,从而无法改善坡度。所以在这样做的时候要充满希望
|