Используйте регулярное выражение и matplotlib для построения графиков для заданных данных - PullRequest
1 голос
/ 06 мая 2020

У меня есть набор данных, который выглядит так

codebit 00 all words BL 0
running test 

DATA1
0.000  1.23
0.050 11.34
0.100 21.26
.....

codebit 01 all words BL 1
running test 

DATA1
0.000   0.2
0.050 11.68
0.100 12.21
....

Мне нужно регулярное выражение, чтобы найти кодовый бит и BL , а затем запустить ищем слово «ДАННЫЕ1» (оно является общим для всех наборов данных) и берем данные под ним, чтобы построить графики с разными именами. Я реализовал часть DATA1. Это работает, когда есть небольшие наборы данных, но для больших наборов это займет много времени. Мне нужен был автоматизированный способ сделать это. Мой код выглядит так:

file = pd.read_table('sample.txt')
file[['time', 'instances']] = file['DATA1'].str.split(expand=True)

dist = file["instances"].tolist()
t = file["time"].tolist()
t= list(map(float,t))
dist = list(map(int, dist))

plt.plot(t,dist)
plt.yscale('log')
plt.title("PLOT")
plt.xlabel("TIME")
plt.ylabel("INSTANCES")
pylab.show()

С помощью этого кода я копирую часть данных после DATA1, вставляю ее в файл sample.txt и запускаю свой код. И это дает мне сюжет.

1 Ответ

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

Я не думаю, что вам здесь действительно нужно регулярное выражение. Из предоставленного вами образца похоже, что codebit и BL правильно разделены пробелом, поэтому я думаю, что здесь будет достаточно split(). Дайте мне знать, если вы считаете иначе.

TXT-файл sample_v1.txt

codebit 00 all words BL 0
running test

DATA1
0.000000e+00 1.000475e+00
2.040816e+00 1.022914e+00
4.081633e+00 1.719943e+00
...

codebit 01 all words BL 1
running test

DATA1
0.000000e+00 3.481705e+00
2.040816e+00 7.774324e+00
4.081633e+00 8.872994e+00
...

codebit 02 all words BL 2
running test

DATA1
0.000000e+00 1.261371e+00
2.040816e+00 3.516784e+00
4.081633e+00 5.722052e+00
...

codebit 03 all words BL 3
running test

DATA1
0.000000e+00 6.245599e+00
2.040816e+00 1.036477e+01
4.081633e+00 1.328821e+01
...
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_table('sample_v1.txt', header=None)

print(df)

# find the indices so they can be used as markers later
codebit_list = list(df.loc[df[0].str.startswith("codebit")].index)
data1_list = list(df.loc[df[0].str.startswith("DATA1")].index)

code_list = []
for cl in codebit_list:
    # split row to extract 'codebit' and 'BL' data
    cl_split = df.iloc[cl].str.split()
    code_list.append((cl_split[0][1],cl_split[0][-1]))

# remove first element and add frame lenght here to
# facilitate the for loop boundaries later
codebit_list.pop(0)
codebit_list.extend([len(df)])

data_xy = []
for k in zip(data1_list, codebit_list):
    # get plot data between the markers
    h = df[k[0] + 1:k[1]]
    data_xy.append(h[0].str.split(expand=True).astype("float"))

for idx, dxy in enumerate(data_xy):
    labels = "codebit={} | BL={}".format(code_list[idx][0], code_list[idx][1])
    plt.plot(dxy[0], dxy[1], label=labels)
    plt.legend()
    plt.yscale('log')
    plt.grid(alpha=0.3)

plt.title("PLOT")
plt.xlabel("TIME")
plt.ylabel("INSTANCES")
plt.show()

enter image description here

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