как извлечь данные из файла python - PullRequest
3 голосов
/ 28 мая 2020

Как я могу построить эти данные на многострочном графике?

Я пробовал использовать этот код, но в список добавляется только первое значение каждой строки

Для моей оси Y Я хочу получить значения устройства, умножая значения 0,5,0,1,0 (например, для строки 1 (tv value = 120) я должен получить 24 графика, которые находятся на оси

y: 60 и ось x 0

ось y 0 и ось x 1

ось y 120 и ось x 2

и так далее ... имея в общей сложности 24 графика ( Мои метки y будут состоять из значений от 0 до 2200)

Для моей оси x я буду отображать значения x_labels

формат файла

Residents: 4
TV1:120:0.5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0,0.5,1,1,1,0.5
Computer:320:1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Fridge1:250:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Dishwasher:500:0.5,1,1,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
Blender:700:0,0,0,0,0,0,0,0,0,0,0,0,0,0.05,0,0,0,0,0,0,0,0,0,0
Fridge2:50:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Coffee machine:2400:0,0,0,0,0,0,0,0,0,0.05,0.05,0,0,0,0,0,0,0,0,0,0,0,0,0
Kettle:2200:0.05,0,0,0,0,1,0,0,0.05,0,0.05,0.05,0,0,0,0,0.05,0,0,0,0,0.05,0.05,0
Freezer:140:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Slow cooker:300:0,0,0,0,0,0,0,0,0,0,0,0,0.5,1,1,1,1,1,0.5,0,0,0,0,0

Мой код

import matplotlib.pyplot as plt
import numpy as np

x = []
y = []

x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']

fileobj = open('file.csv','r')
for line in fileobj:
    line_s = line.strip()
    Usage = [(x) for x in line_s.split(',')]
    y.append(Usage[2])




fileobj.close()

plt.plot(y ,"o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()

Ответы [ 3 ]

1 голос
/ 28 мая 2020
import matplotlib.pyplot as plt
import numpy as np

x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']

with open(r'C:\Users\gtrm\Desktop\MyScripts\file.csv', 'r') as file_obj:
    for line in file_obj:
        line = line.strip('\n')
        # print(f"{line = }")
        usage = [x for x in line.split(',')]
        # print(f"{usage = }")
        number = float(usage[0].split(':')[1])
        first = [float(usage[0].split(':')[-1])]
        remaining = [float(x) for x in usage[1:]]
        # print(f"{first = }")
        # print(f"{type(first) = }")
        # print(f"{remaining = }")
        first.extend(remaining) # * number
        res = list(map(lambda x: x * number, first))
        print(f"{res = }")

plt.plot(res, "o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()

enter image description here

1 голос
/ 28 мая 2020

Когда вы читаете файл, вы получаете все данные за x (время) для каждого устройства. Если вам нужны графики для всех устройств, вы можете строить их по мере чтения данных. Похоже, вы хотите, чтобы устройства были обозначены как ярлыки.

fileobj = open('file.csv','r')
line=fileobj.readline()
for i,line in enumerate(fileobj):
  device,wattage,h=line.split(':')
  wh=[float(x)*float(wattage) for x in h.replace('\n','').split(',')]
  #print(device,watts,wh)
  plt.plot(watts,label=str(i+1))
  # or plt.plot(watts,label=device) # if you want device as label

plt.legend()
1 голос
/ 28 мая 2020

Добро пожаловать в SO!

Давайте попробуем!

fileobj = open('file.csv','r')
first_line = True

for line in fileobj:
    if first_line:
       first_line = False
       continue
    line_s = line.strip() # line -> Slow cooker:300:0,0,0,..
    name, id, values = line.split(':') # ['Slow cooker', '300', '0,0,0']
    usage = [int(x) for x in values.split(',')] # convert values into integers
    print(usage)
    y.append(usage)

Насколько я понимаю, вы пытаетесь построить эти текстовые данные. Y - это значения использования в формате списка списков.

Пожалуйста, прокомментируйте иначе. Если вы не уверены в том, что происходит, используйте команду print, как я добавил в приведенный выше код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...