Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 22, 2013 20:31:40

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Задача (неинтересная, но насущная). Из файла прочитать значения переменных Х и У, на основе имеющихся данных оценить параметры линейной регрессии (разумеется, парной. Посчитать ковариацию, коэффициент корреляции. Вывести это добро в 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 (Апрель 22, 2013 20:38:04)

Офлайн

#2 Апрель 22, 2013 21:02:03

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Офлайн

#3 Апрель 23, 2013 07:51:08

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Благодарю!

Офлайн

#4 Апрель 23, 2013 10:10:02

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Переписал с рекомендованными функциями
Еще один вопрос: 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]

Офлайн

#5 Апрель 23, 2013 10:53:28

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

>>> round(3.4)
3.0
>>> round(3.5)
4.0



————————–
Истина где-то рядом

Офлайн

#6 Апрель 23, 2013 19:23:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

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'



Отредактировано doza_and (Апрель 23, 2013 19:26:37)

Офлайн

#7 Апрель 26, 2013 21:07:16

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

doza_and Спасибо!

Офлайн

#8 Апрель 26, 2013 21:13:40

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Автор индийского кода столкнулся с удивительной для себя особенностью питона, а именно: если написать
>>>0 or 1 == 0
False
>>> (0 or 1) == 0
False
Либо пейсатель “кода” настолько упорот, что не в состоянии осознать всего масштаба происходящего, либо… Короче говоря дизъюнкция творит что-то любопытное. Ну или скорее у меня очень прямые руки.
Нуль ИЛИ единица равна нулю -> Ложь
ЗЫ. Питон 2.7 писал сначала в IDE, потом удивился, попробовал в Shall, потом в командной строке…

Отредактировано bot1net (Апрель 26, 2013 21:22:13)

Офлайн

#9 Апрель 26, 2013 22:24:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

а в чего удивительного?

>>> 0 or 1
1
всегда так и было.



Офлайн

#10 Апрель 27, 2013 11:14:35

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

doza_and так утверждение верно, но он пишет ложь… Статью на википедии пересмотрел, возвращаемый результат неверный.
Когнитивный диссонанс у меня, однако.

>>> 1 and 0 == 0
True
>>> 1 or 0 == 0
1

Отредактировано bot1net (Апрель 27, 2013 11:37:49)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version