Как найти средние значения определенных элементов в большом текстовом файле - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь добиться того, что указано в инструкциях ниже в ожидаемом разделе вывода.Текстовый файл содержит 5 чисел с плавающей запятой в каждой строке, последняя из которых бесполезна, поскольку он просто классифицирует, означают ли предыдущие числа реальный или поддельный счет (0 - фальшивка, 1 - реал).Я хочу создать цикл, который может взять первое число каждой строки (более 600 строк) и найти среднее, то же самое со вторым числом каждой строки, третьей и четвертой.Выходными данными должен быть список, который показывает каждое среднее значение [avg1 avg2 avg3 avg4].Код ниже может успешно сделать это, но только по одному за раз.Например.в этой строке sum + = float (line.split () [0]), изменение от 0 до 1 даст среднее значение второго числа в каждой строке и так далее.Как создать эффективный цикл, который может дать мне все средние значения сразу?

Я уже пытался скопировать цикл и вставить его 4 раза для каждого «столбца» чисел, но он неэффективен и не даетработа.

import web_scraper
import urllib.request
import math

def data_text_files():

page = 'http://archive.ics.uci.edu/ml/machine-learning- 
databases/00267/data_banknote_authentication.txt'
stream = urllib.request.urlopen(page)

samples = web_scraper.get_all_data(stream, ',')

training = open("training2.txt", "w")
testing = open ("testing2.txt", "w")

for i in range(len(samples)):
    if i % 2 == 0:
        #write data to training file
        count = 1
        for bill in samples[i]:
            bill_str = str(bill)
            if(count == 5):
                training.write(bill_str + "\n")
                count = 1
            else:
                training.write(bill_str + " ")
                count += 1

    else:
        #write data to testing file
        count = 1
        for bill in samples[i]:
            bill_str = str(bill)
            if(count == 5):
                testing.write(bill_str + "\n")
                count = 1
            else:
                testing.write(bill_str + " ")
                count += 1



data_text_files()



with open('training2.txt') as fh:
    sum = 0  # initialize here, outside the loop
    count = 0  # and a line counter
    for line in fh:
        count += 1  # increment the counter
        sum += float(line.split()[0])  # add here, not in a nested loop


    average = [sum / count]

    print (average)








 building_classifier()

Каждый образец данных имеет 4 атрибута (исключая последний, который указывает классификацию образца).Итак, данные выглядят примерно так:

  [ [2, 4, 6, 8, 0],
    [4, 6, 8, 10,  0],
    [1, 3, 5, 7, 1]
    [3, 5, 7, 9,  1]]

Для построения классификатора вы будете использовать данные в "training.txt":

Рассчитать среднее значение каждого из атрибутов по всемобразцы с одинаковой классификацией (0 или 1).Для данных, показанных выше, средние значения для каждого атрибута по поддельным образцам (0) составляют [3, 5, 7, 9], а для тех, которые являются действительными (1), средние значения составляют [2, 4, 6, 8].Найдите средние точки между средними значениями для 2 групп, сложив среднее значение поддельных и среднее значение реальных образцов, и разделите результат на два.Это будет сделано для каждого из атрибутов.Таким образом, для показанных данных средние точки будут [2,5, 4,5, 6,5, 8,5].Середины - это то, что мы будем использовать в качестве нашего классификатора.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вам не нужны установленные библиотеки, такие как pandas, хотя они имеют простые в использовании функции для вычисления средних значений для таблиц.

Ваш код вычисляет одну сумму и подсчитывает строки, а затем вычисляет однусредний из этого.Вы хотите рассчитать все четыре средних в одном цикле.Вы могли бы сделать это еще проще, прочитав весь файл за один раз, но я буду придерживаться вашего подхода, так как это будет иметь значение для очень больших файлов:

with open('training2.txt') as fh:
    n = 4  # number of fields we're interested in
    sums = [0] * n  # initialize here, outside the loop
    count = 0  # and a line counter
    for line in fh:
        count += 1  # increment the counter
        fields = line.split()  # split the line outside the loop, only once
        for i in range(n):
            sums[i] += float(fields[i])  # add here, not in a nested loop

    averages = [s / count for s in sums]  # not using the name sum, as it is a built-in

    print(averages)

Это предполагает, что ваш код работает иваш текстовый файл на самом деле имеет значения, разделенные пробелами, в противном случае вам нужно что-то вроде .split(',')

0 голосов
/ 01 февраля 2019

Я не совсем понял ваш вопрос, но могу ответить на эту его часть.

"Рассчитать среднее значение каждого из атрибутов по всем выборкам с одинаковой классификацией"

Я бы создал фрейм данных из файла, используя панд, а затем добавил заголовки столбцов:

import pandas as pd

df = pd.read_csv('input_file.txt', sep=" ", header=None)
data.columns = ['a', 'b', 'c', 'd', 'e']

Затем я бы использовал групповые и групповые методы панд для каждого столбца:

aggregate = df.groupby(['e'])
a_column_mean = aggregate.agg({'a': 'mean'})
b_column_mean = aggregate.agg({'b': 'mean'})
c_column_mean = aggregate.agg({'c': 'mean'})
d_column_mean = aggregate.agg({'d': 'mean'})
...