Найти - Пользователи
Полная версия: "А не индийский ли код я написал?" или "Как быстрее/короче и т.д."
Начало » Python для новичков » "А не индийский ли код я написал?" или "Как быстрее/короче и т.д."
1 2 3 4 5
bot1net
Задача (неинтересная, но насущная). Из файла прочитать значения переменных Х и У, на основе имеющихся данных оценить параметры линейной регрессии (разумеется, парной. Посчитать ковариацию, коэффициент корреляции. Вывести это добро в shall. Написано на версии 2.7.4 . В программировании опыта не имею, питоном увлекся неделю назад. Наслышан об “индийском” коде. Хотелось бы избежать сего порока
Заранее благодарю за внимание и любые советы!
Ps. What is the most common language?
Bad English
import csv
x_average, y_average, xy_average = 0, 0, 0
infile = open('data.txt','r')
table = [['X','Y']]
for row in csv.reader(infile):
    table.append(row)
infile.close()
for i in range(1, len(table)):
    for j in range(len(table[1])):
        table[i][j] = float(table[i][j])
import numpy as np
## colunm 0 = Xi; c1 = Yi; EXTRA: c2 = Xi*Yi, c3 = (Xi - X), c4 = Yi -Y
matrix = np.zeros((len(table)-1, len(table[1])+3))
for i in range(len(table)-1):
    for j in range(len(table[1])):
        matrix[i,j] = table[i+1][j]
    matrix[i,2] = matrix[i,0]*matrix[i,1] ## Xi*Yi
    x_average += matrix[i,0]              ## X cumulative sum
    y_average += matrix[i,1]              ## Y cumulative sum
    xy_average += matrix[i,2]             ## X*Y cumulative sum
## or average = matrix.sum(axis = 0)
## calculate average values of X, Y and X*Y
x_average = x_average/float(len(table)-1)
y_average = y_average/float(len(table)-1)
xy_average = xy_average/float(len(table)-1)
## cov(X,Y) = sum(Xi*Yi)/n-XY
cov = xy_average - x_average*y_average
## var = (sum(Xi - X)**2)/n
var_x, var_y = 0, 0
for i in range(len(table)-1):
    matrix[i,3] = (matrix[i,0]-x_average)**2 ## (Xi - X)^2
    matrix[i,4] = (matrix[i,1]-y_average)**2 ## (Yi - Y)^2
    var_x += matrix[i,3]
    var_y += matrix[i,4]
## calculate variance of X(var_x), Y(var_y), correlation coefficient "r"
## r = cov(X,Y)/((var(X)*var(Y))**0.5)
var_x = var_x/float(len(table)-1)
var_y = var_y/float(len(table)-1)
r = cov/((var_x*var_y)**0.5)
## b = cov(X,Y)/var(X)
b = cov/var_x
## a = Y - bX
a = y_average - b*x_average
print 'linear model equation\nY=',a,'+',b,'*X\ncovariance = ',cov,'\ncorrelation coeffitient = ',r,''
bot1net
Благодарю!
bot1net
Переписал с рекомендованными функциями
Еще один вопрос: round округляет в соответствии с математическими правилами, или “по-особенному”?
import numpy as np
from scipy import stats as st
infile = open('data.txt','r')
x, y = np.loadtxt(infile, delimiter = ',', unpack=True)
result = st.linregress(x,y)
print 'Slope = ',round(result[0],4),'\nIntercept =',round(result[1],4),'\nr-value = ',round(result[2],4),'\np-value = ',round(result[3],4),'\nStandard error of the estimate = ',round(result[3],4)[\code]
alexbadaloff
>>> round(3.4)
3.0
>>> round(3.5)
4.0
doza_and
file : file or str
Open file object or filename.
Открывать файл не обязательно, numpy сам откроет.
x, y = np.loadtxt('data.txt', delimiter = ',', unpack=True)

round(result[0],4)
вместо этого обычно используют форматированный вывод.
http://docs.python.org/2/tutorial/inputoutput.html#fancier-output-formatting
>>> a=[1,2,3,4.44444444444]
>>> "a={0:2d} b={1} c={2} d={3:10.3g}".format(*a)
'a= 1 b=2 c=3 d=      4.44'
bot1net
doza_and Спасибо!
bot1net
Автор индийского кода столкнулся с удивительной для себя особенностью питона, а именно: если написать
>>>0 or 1 == 0
False
>>> (0 or 1) == 0
False
Либо пейсатель “кода” настолько упорот, что не в состоянии осознать всего масштаба происходящего, либо… Короче говоря дизъюнкция творит что-то любопытное. Ну или скорее у меня очень прямые руки.
Нуль ИЛИ единица равна нулю -> Ложь
ЗЫ. Питон 2.7 писал сначала в IDE, потом удивился, попробовал в Shall, потом в командной строке…
doza_and
а в чего удивительного?
>>> 0 or 1
1
всегда так и было.
bot1net
doza_and так утверждение верно, но он пишет ложь… Статью на википедии пересмотрел, возвращаемый результат неверный.
Когнитивный диссонанс у меня, однако.
>>> 1 and 0 == 0
True
>>> 1 or 0 == 0
1
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB