Перевести из str в float и построить гистограмму

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Всем добрый день!
У меня есть данные и я беру из них две колонки - название величины и величину. Затем величину сортирую по возрастанию и строю гистограмму первых (и также самых больших) 20 членов величины.
В чем проблема: в данных в колонке величины есть пустая строка: ''. И из-за нее не удается перевести данные из str (они в списке data лежат как str) в float. Я с этой пустой строкой уже что только не делала, но мои условия, которые я ставлю, чтоб ее выловить, с моими данными не работают. То есть на тестовом наборе все ок, а тут - не ок. Да, если понадобится, пустой член находится на месте data[2288] - до сортировки, конечно.
Второй мой вопрос: как бы мне построить гистограмму, чтобы сбоку были значения величины (колонка 13), а снизу соответствующие названия величины (колонка 1). То есть, когда я сортирую величину, список с названиями величины же остается неизменным и все путается... тут совсем не знаю, как быть.
Вот мой код:
Python:
from matplotlib import pyplot as plt


def visualise(name):
    data = []
    grb = []
    with open(name, 'r') as f:  # считываем столбцы
        for line in f:
            data_list = line.split("|")
            data.append(data_list[13])
            grb.append(data_list[1])

    mod_data = []
    for i in range(1, len(data)):  # убираем первую строчку и лишние пробелы
        if len(data[i]) == 0:  # НЕ РАБОТАЕТ!
            mod_data.append(0.0)
        else:
            mod_data.append(data[i].strip())

    mod_grb = []
    for i in range(1, len(grb)):  # убираем первую строчку
        mod_grb.append(grb[i])

    mod_data.sort()
    mod_data.reverse()

    final_data = []
    for i in range(21):  # берем 20 первых значений
        final_data.append(mod_data[i])

    print(final_data)

    fig, ax = plt.subplots(figsize=[10, 7])  # строим гистограмму
    ax.hist(final_data)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
Данные слишком большие для вложения (21 МБ), скачать можно по ссылке: https://cloud.mail.ru/public/rFcV/DqvUh6zfb
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
В чем проблема: в данных в колонке величины есть пустая строка: ''. И из-за нее не удается перевести данные из str (они в списке data лежат как str) в float. Я с этой пустой строкой уже что только не делала, но мои условия, которые я ставлю, чтоб ее выловить, с моими данными не работают. То есть на тестовом наборе все ок, а тут - не ок. Да, если понадобится, пустой член находится на месте data[2288] - до сортировки, конечно.
можно пробовать привести значение к флоату, и если неудача, то писать 0.0
Python:
from matplotlib import pyplot as plt


def visualise(name):
    data = []
    grb = []
    with open(name, 'r') as f:  # считываем столбцы
        for line in f:
            data_list = line.split("|")
            data.append(data_list[13])
            grb.append(data_list[1])

    mod_data = []
    for i in range(1, len(data)):  # убираем первую строчку и лишние пробелы
        try:
            mod_data.append(float(data[i]))
        except ValueError:
            mod_data.append(0.0)

    mod_grb = []
    for i in range(1, len(grb)):  # убираем первую строчку
        mod_grb.append(grb[i])

    mod_data.sort()
    mod_data.reverse()

    final_data = []
    for i in range(21):  # берем 20 первых значений
        final_data.append(mod_data[i])

    print(final_data)

    fig, ax = plt.subplots(figsize=[10, 7])  # строим гистограмму
    ax.hist(final_data)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()

Второй мой вопрос: как бы мне построить гистограмму, чтобы сбоку были значения величины (колонка 13), а снизу соответствующие названия величины (колонка 1). То есть, когда я сортирую величину, список с названиями величины же остается неизменным и все путается... тут совсем не знаю, как быть.
можно сделать словарь, где ключ - это величина, значение - название величины
и после сортировки массива с величиной, обращаться по ключу (по величине) к этому словарю
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Я сделала и отсортировала словарь. Помогите, пожалуйста, с нужной мне визуализацией..?
Python:
from matplotlib import pyplot as plt


def visualise(name):
    data = []
    grb = []
    with open(name, 'r') as f:
        for line in f:
            data_list = line.split("|")
            data.append(data_list[13])
            grb.append(data_list[1])

    mod_data = []
    for i in range(1, len(data)):
        try:
            mod_data.append(float(data[i]))
        except ValueError:
            mod_data.append(0.0)

    mod_grb = []
    for i in range(1, len(grb)):
        mod_grb.append(grb[i])

    final_data = {}
    for ind1, val in enumerate(mod_data):
        for ind2, name in enumerate(mod_grb):
            final_data[mod_data[ind1]] = mod_grb[ind2]
            ind1 += 1
            ind2 += 1
        break

    sorted_data = dict(sorted(final_data.items()))

    fig, ax = plt.subplots(figsize=[10, 7])  # строим гистограмму
    ax.hist(sorted_data)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
Python:
from matplotlib import pyplot as plt


def visualise(name):
    grb, values = [], []

    with open(name, 'r') as f:  # считываем столбцы
        for line in f.readlines()[1:]:
            tmp_list = line.split("|")
            grb.append(tmp_list[1])
            try:
                values.append(float(tmp_list[13]))
            except ValueError:
                values.append(.0)

    sort_values = sorted(values, reverse=True)[:20]
    print(sort_values)

    ax = plt.figure(figsize=(12, 6)).add_subplot()
    ax.bar([grb[values.index(i)] for i in sort_values], sort_values)
    plt.xticks(rotation=90)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
 
Последнее редактирование:
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Python:
from matplotlib import pyplot as plt


def visualise(name):
    grb, values = [], []

    with open(name, 'r') as f:  # считываем столбцы
        for line in f.readlines()[1:]:
            tmp_list = line.split("|")
            grb.append(tmp_list[1])
            try:
                values.append(float(tmp_list[13]))
            except ValueError:
                values.append(.0)

    sort_values = sorted(values, reverse=True)[:20]
    print(sort_values)

    ax = plt.figure(figsize=(12, 6)).add_subplot()
    ax.bar([grb[values.index(i)] for i in sort_values], sort_values)
    plt.xticks(rotation=90)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
Спасибо огромное!! Это идеально и то, что нужно
 

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Python:
from matplotlib import pyplot as plt


def visualise(name):
    grb, values = [], []

    with open(name, 'r') as f:  # считываем столбцы
        for line in f.readlines()[1:]:
            tmp_list = line.split("|")
            grb.append(tmp_list[1])
            try:
                values.append(float(tmp_list[13]))
            except ValueError:
                values.append(.0)

    sort_values = sorted(values, reverse=True)[:20]
    print(sort_values)

    ax = plt.figure(figsize=(12, 6)).add_subplot()
    ax.bar([grb[values.index(i)] for i in sort_values], sort_values)
    plt.xticks(rotation=90)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
Ой простите, а можно ли еще как-нибудь включить условие на отбор по колонке 5: t90, Чтоб t90 < 2.000? В смысле, чтоб это условие было вначале, чтоб всю остальную выборку делать только из тех grb, у которых t90 < 2.000. Пожалуйста(
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
Python:
from matplotlib import pyplot as plt


def visualise(name):
    grb, values = [], []

    with open(name, 'r') as f:  # считываем столбцы
        for line in f.readlines()[1:]:
            tmp_list = line.split("|")
            try:
                if float(tmp_list[5]) < 2.0:
                    grb.append(tmp_list[1])
                    values.append(float(tmp_list[13]))
            except ValueError:
                grb.append(tmp_list[1])
                values.append(.0)

    sort_values = sorted(values, reverse=True)[:20]
    print(sort_values)

    ax = plt.figure(figsize=(12, 6)).add_subplot()
    ax.bar([grb[values.index(i)] for i in sort_values], sort_values)
    plt.xticks(rotation=90)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
74
5
8
Python:
from matplotlib import pyplot as plt


def visualise(name):
    grb, values = [], []

    with open(name, 'r') as f:  # считываем столбцы
        for line in f.readlines()[1:]:
            tmp_list = line.split("|")
            try:
                if float(tmp_list[5]) < 2.0:
                    grb.append(tmp_list[1])
                    values.append(float(tmp_list[13]))
            except ValueError:
                grb.append(tmp_list[1])
                values.append(.0)

    sort_values = sorted(values, reverse=True)[:20]
    print(sort_values)

    ax = plt.figure(figsize=(12, 6)).add_subplot()
    ax.bar([grb[values.index(i)] for i in sort_values], sort_values)
    plt.xticks(rotation=90)
    plt.show()


def show():
    visualise('catalog_210923.txt')  # Flux_64


if __name__ == '__main__':
    show()
Спасибо, спасибо, спасибо!! Все супер
 

Форум IT Специалистов