2013-10-09 4 views
0

Я пытаюсь запустить скрипт для каждого отдельного столбца файла csv. Я выяснил, как сообщить python, в каком столбце я хотел бы запустить скрипт, но я хочу, чтобы он анализировал столбец один, выводил результаты, переходим к столбцу два и продолжаем и продолжаем через файл. То, что я хочу, это команда «if etc goto и т. Д.». Я нашел, как это сделать с помощью простых oneliners, но у меня есть большой скрипт. Любая помощь была бы замечательной, поскольку я уверен, что я просто что-то пропустил. Как если бы я мог вернуться к тому, где я определяю свои данные (h = data), но скажу, чтобы выбрать следующий столбец. Вот мой сценарий.Возврат к следующему столбцу в csv

import numpy as np 
import matplotlib.pyplot as plt 
from pylab import * 
import pylab 
from scipy import linalg 
import sys 
import scipy.interpolate as interpolate 
import scipy.optimize as optimize 

a=raw_input("Data file name? ") #Name of the data file including the directory, must be .csv 

datafile = open(a, 'r') 
data = [] 
for row in datafile: 
    data.append(row.strip().split(',')) #opening and organizing the csv file 
print('Data points= ', len(data)) 
print data 
c=raw_input("Is there a header row? y/n?") #Remove header line if present 
if c is ('y'): 
    del data[0] 
    data2=data 
    print('Raw data= ', data2) 
else: 
    print('Raw data= ', data) 
''' 
#if I wanted to select a column 
b=input("What column to analyze?") #Asks what column depth data is in 
if b is 1: 
    h=[[rowa[i] for rowa in data] for i in range(1)] #first row 
''' 
h=data # all columns 
g=reduce(lambda x,y: x+y,h) #prepares data for calculations 
a=map(float, g) 
a.sort() 
print ('Organized data= ',a) 

def GRLC(values): 
    ''' 
    Calculate Gini index, Gini coefficient, Robin Hood index, and points of 
    Lorenz curve based on the instructions given in 
    www.peterrosenmai.com/lorenz-curve-graphing-tool-and-gini-coefficient-calculator 
    Lorenz curve values as given as lists of x & y points [[x1, x2], [y1, y2]] 
    @param values: List of values 
    @return: [Gini index, Gini coefficient, Robin Hood index, [Lorenz curve]] 
    ''' 

    n = len(values) 
    assert(n > 0), 'Empty list of values' 
    sortedValues = sorted(values) #Sort smallest to largest 

    #Find cumulative totals 
    cumm = [0] 
    for i in range(n): 
     cumm.append(sum(sortedValues[0:(i + 1)])) 

    #Calculate Lorenz points 
    LorenzPoints = [[], []] 
    sumYs = 0   #Some of all y values 
    robinHoodIdx = -1 #Robin Hood index max(x_i, y_i) 
    for i in range(1, n + 2): 
     x = 100.0 * (i - 1)/n 
     y = 100.0 * (cumm[i - 1]/float(cumm[n])) 
     LorenzPoints[0].append(x) 
     LorenzPoints[1].append(y) 
     sumYs += y 
     maxX_Y = x - y 
     if maxX_Y > robinHoodIdx: robinHoodIdx = maxX_Y 

    giniIdx = 100 + (100 - 2 * sumYs)/n #Gini index 

    return [giniIdx, giniIdx/100, robinHoodIdx, LorenzPoints] 

result = GRLC(a) 
print 'Gini Index', result[0] 
print 'Gini Coefficient', result[1] 
print 'Robin Hood Index', result[2] 
+0

Если вы публикуете 4-5 строк данных образца, было бы легче протестировать решение. –

+0

Извините, это всего лишь калькулятор Gini, например, скажем, недельные зарплаты1 = 1234,2342,2234,2121,5677,4553, зарплаты2 = 2342,23455,234,7564,43223,12213. С каждой зарплатой в столбце в файле csv. – user2843767

ответ

0

Я игнорирую всю эту функцию GRLC и просто решая вопрос о цикле. Попробуй. Он использует while True: для цикла навсегда (вы можете просто вырваться, закончив программу, Ctrl + C в Windows, зависит от ОС). Просто загружайте данные из csv один раз, а затем каждый раз, когда он петли, вы можете перестроить некоторые переменные. Если у вас есть вопросы, пожалуйста, спросите. Кроме того, я не тестировал его, так как у меня не было установлены все пакеты NumPy :)

import numpy as np 
import matplotlib.pyplot as plt 
from pylab import * 
import pylab 
from scipy import linalg 
import sys 
import scipy.interpolate as interpolate 
import scipy.optimize as optimize 

def GRLC(values): 
    ''' 
    Calculate Gini index, Gini coefficient, Robin Hood index, and points of 
    Lorenz curve based on the instructions given in 
    www.peterrosenmai.com/lorenz-curve-graphing-tool-and-gini-coefficient-calculator 
    Lorenz curve values as given as lists of x & y points [[x1, x2], [y1, y2]] 
    @param values: List of values 
    @return: [Gini index, Gini coefficient, Robin Hood index, [Lorenz curve]] 
    ''' 

    n = len(values) 
    assert(n > 0), 'Empty list of values' 
    sortedValues = sorted(values) #Sort smallest to largest 

    #Find cumulative totals 
    cumm = [0] 
    for i in range(n): 
     cumm.append(sum(sortedValues[0:(i + 1)])) 

    #Calculate Lorenz points 
    LorenzPoints = [[], []] 
    sumYs = 0   #Some of all y values 
    robinHoodIdx = -1 #Robin Hood index max(x_i, y_i) 
    for i in range(1, n + 2): 
     x = 100.0 * (i - 1)/n 
     y = 100.0 * (cumm[i - 1]/float(cumm[n])) 
     LorenzPoints[0].append(x) 
     LorenzPoints[1].append(y) 
     sumYs += y 
     maxX_Y = x - y 
     if maxX_Y > robinHoodIdx: robinHoodIdx = maxX_Y 

    giniIdx = 100 + (100 - 2 * sumYs)/n #Gini index 

    return [giniIdx, giniIdx/100, robinHoodIdx, LorenzPoints] 

#Name of the data file including the directory, must be .csv 
a=raw_input("Data file name? ") 

datafile = open(a.strip(), 'r') 
data = [] 

#opening and organizing the csv file 
for row in datafile: 
    data.append(row.strip().split(',')) 

#Remove header line if present 
c=raw_input("Is there a header row? y/n?") 
if c.strip().lower() == ('y'): 
    del data[0] 

while True : 
    #if I want the first column, that's index 0. 
    b=raw_input("What column to analyze?") 

    # Validate that the column input data is correct here. Otherwise it might be out of range, etc. 
    # Maybe try this. You might want more smarts in there, depending on your intent: 
    b = int(b.strip()) 

    # If you expect the user to inpt "2" to mean the second column, you're going to use index 1 (list indexes are 0 based) 
    h=[[rowa[b-1] for rowa in data] for i in range(1)] 

    # prepares data for calculations 
    g=reduce(lambda x,y: x+y,h) 
    a=map(float, g) 
    a.sort() 
    print ('Organized data= ',a) 

    result = GRLC(a) 
    print 'Gini Index', result[0] 
    print 'Gini Coefficient', result[1] 
    print 'Robin Hood Index', result[2] 
+0

Кроме того, вы должны поместить свои комментарии над строкой вместо встроенного (так что она складывается сверху, а не добавляет длину каждой строке). Существуют некоторые стандарты Python, которые повышают читаемость. Если вам интересно и у вас есть время, это приличный [читается] (http://www.python.org/dev/peps/pep-0008/) –

+0

Да. Вот и все. Я не знаком с командой «Пока правда». Но это работает. В конце концов, я пользователь, но это то, что я пытался сделать, например, через неделю. Благодарю. – user2843767

+0

Можете ли вы выбрать его в качестве ответа, если это решение? 'while' - один тип итератора в Python; он будет зацикливаться до тех пор, пока условие больше не будет выполнено, и поскольку 'while True' всегда выполняется, он циклически завершается навсегда. –

Смежные вопросы