从 .txt(文本)文件解析表格
Parsing tables from .txt (text) files
我有一些来自 python 分析器的分析结果,如下所示:
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
46
现在,我需要获取这些结果用于绘图和其他目的。但是文本不是很方便的东西。 table 显示逐行分析结果。如何获得 pandas 数据框或表格版本 可用于从此 table 获取任何行或列?
P.S。我访问了 regex
和 parsimonious
,但似乎无法在我的案例中使用它们。
这只是一些解析练习。使用标准的 split() 和一些小的调整,您可以在几行代码中获得一个非常干净的数据框。
txt = '''
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
'''
import pandas as pd
lines = []
for line in txt.split('\n'):
#print(line)
if line.startswith('Filename'): continue
if line.startswith('Line'): continue
if line.startswith('='): continue
if line == '': continue
data = [i.strip() for i in line.split()]
#Fix def lines
if data[1] == 'def':
data = [data[0],'','','','',' '.join(data[1:4])]
data = [data[0], ' '.join(data[1:3]), ' '.join(data[3:5]), data[-1]]
lines.append(data)
df = pd.DataFrame(lines, columns=['Line #', 'Mem usage', 'Increment','Line Contents'])
print(df)
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
当 '@profile'
在 'Line Contents'
中时,您可以拆分数据框。
例如:
split_idx = df[df['Line Contents'].str.startswith('@profile')].index
dataframes = []
for i, idx in enumerate(split_idx):
try:
dataframes.append(df.iloc[idx, split_idx[i+1]])
except IndexError:
dataframes.append(df.iloc[idx:])
print(dataframes[0])
print('======')
print(dataframes[1])
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
======
Line # Mem usage Increment Line Contents
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
不完全清楚你是想解析整个文本,还是每个 table 都有一个文本文件并想解析 table.
如果你想从每个 table 创建一个 pandas 数据帧,使用 skiprows
参数到 read_fwf
应该可以工作(这会跳过非标准行文件但解析其余部分)。这里我将第一个 table 的内容存储到文件 sample-1.txt
中并使用 read_fwf
.
读取它
import pandas
df = pandas.read_fwf('sample-1.txt', skiprows=[1])
这给出了以下数据框。
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
Line # 10 non-null int64
Mem usage 9 non-null object
Increment 9 non-null object
Line Contents 10 non-null object
dtypes: int64(1), object(3)
memory usage: 392.0+ bytes
如果要将其拆分为单独的 table,则必须在每次提及 Filename: main.py
时拆分文件。
还有一个解决方案。
可以使用 TTP 从文本中生成时间序列数据。
示例代码:
from ttp import ttp
import pprint
data_1 = """
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
"""
data_2 = """
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
46
"""
template = """
<vars>
timestamp = "get_timestamp_iso"
</vars>
<group macro="process">
Line_N Mem_usage Increment Line_Contents {{ _headers_ }}
{{ @timestamp | set(timestamp) }}
</group>
<macro>
def process(data):
# remove ===== matches
if "====" in data["Line_N"]:
return False
# convert Increment to integer
incr = data.pop("Increment").split(" ")[0]
data["Increment_MiB"] = float(incr) if incr else 0.0
# convert Mem usage to integer
memuse = data.pop("Mem_usage").split(" ")[0]
data["Mem_usage_MiB"] = float(memuse) if memuse else 0.0
return data
</macro>
"""
parser = ttp(template=template)
parser.add_input(data_1)
parser.add_input(data_2)
parser.parse()
res = parser.result(structure="flat_list")
pprint.pprint(res)
# will print:
# [{'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 121.8,
# 'Line_Contents': '@profile(stream=f)',
# 'Line_N': '30',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'def parse_data(data):',
# 'Line_N': '31',
# 'Mem_usage_MiB': 0.0},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'Y=data["price"].values',
# 'Line_N': '32',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'Y=np.log(Y)',
# 'Line_N': '33',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'features=data.columns',
# 'Line_N': '34',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'X1=list(set(features)-set(["price"]))',
# 'Line_N': '35',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 4.5,
# 'Line_Contents': 'X=data[X1].values',
# 'Line_N': '36',
# 'Mem_usage_MiB': 126.3},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'ss=StandardScaler()',
# 'Line_N': '37',
# 'Mem_usage_MiB': 126.3},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'X=ss.fit_transform(X)',
# 'Line_N': '38',
# 'Mem_usage_MiB': 124.6},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'return X,Y',
# 'Line_N': '39',
# 'Mem_usage_MiB': 124.6},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 127.1,
# 'Line_Contents': '@profile(stream=f)',
# 'Line_N': '41',
# 'Mem_usage_MiB': 127.1},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'def linearRegressionfit(Xt,Yt,Xts,Yts):',
# 'Line_N': '42',
# 'Mem_usage_MiB': 0.0},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'lr=LinearRegression()',
# 'Line_N': '43',
# 'Mem_usage_MiB': 127.1},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 4.1,
# 'Line_Contents': 'model=lr.fit(Xt,Yt)',
# 'Line_N': '44',
# 'Mem_usage_MiB': 131.2},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.8,
# 'Line_Contents': 'predict=lr.predict(Xts)',
# 'Line_N': '45',
# 'Mem_usage_MiB': 132.0}]
如果将以上数据推送到 Elasticsearch 进行索引,可以使用 Grafana 相当容易地对其进行可视化,您可以构建查询以在引用 Line_N 或 Line_Contents 变量的每行基础上显示计数器。
但要使上述模板正常工作,需要从 github 存储库安装 TTP - PyPI 上可用的 0.3.0 版本没有所需的功能。新版本即将发布。
我有一些来自 python 分析器的分析结果,如下所示:
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
46
现在,我需要获取这些结果用于绘图和其他目的。但是文本不是很方便的东西。 table 显示逐行分析结果。如何获得 pandas 数据框或表格版本 可用于从此 table 获取任何行或列?
P.S。我访问了 regex
和 parsimonious
,但似乎无法在我的案例中使用它们。
这只是一些解析练习。使用标准的 split() 和一些小的调整,您可以在几行代码中获得一个非常干净的数据框。
txt = '''
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
'''
import pandas as pd
lines = []
for line in txt.split('\n'):
#print(line)
if line.startswith('Filename'): continue
if line.startswith('Line'): continue
if line.startswith('='): continue
if line == '': continue
data = [i.strip() for i in line.split()]
#Fix def lines
if data[1] == 'def':
data = [data[0],'','','','',' '.join(data[1:4])]
data = [data[0], ' '.join(data[1:3]), ' '.join(data[3:5]), data[-1]]
lines.append(data)
df = pd.DataFrame(lines, columns=['Line #', 'Mem usage', 'Increment','Line Contents'])
print(df)
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
当 '@profile'
在 'Line Contents'
中时,您可以拆分数据框。
例如:
split_idx = df[df['Line Contents'].str.startswith('@profile')].index
dataframes = []
for i, idx in enumerate(split_idx):
try:
dataframes.append(df.iloc[idx, split_idx[i+1]])
except IndexError:
dataframes.append(df.iloc[idx:])
print(dataframes[0])
print('======')
print(dataframes[1])
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
======
Line # Mem usage Increment Line Contents
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
不完全清楚你是想解析整个文本,还是每个 table 都有一个文本文件并想解析 table.
如果你想从每个 table 创建一个 pandas 数据帧,使用 skiprows
参数到 read_fwf
应该可以工作(这会跳过非标准行文件但解析其余部分)。这里我将第一个 table 的内容存储到文件 sample-1.txt
中并使用 read_fwf
.
import pandas
df = pandas.read_fwf('sample-1.txt', skiprows=[1])
这给出了以下数据框。
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
Line # 10 non-null int64
Mem usage 9 non-null object
Increment 9 non-null object
Line Contents 10 non-null object
dtypes: int64(1), object(3)
memory usage: 392.0+ bytes
如果要将其拆分为单独的 table,则必须在每次提及 Filename: main.py
时拆分文件。
还有一个解决方案。
可以使用 TTP 从文本中生成时间序列数据。
示例代码:
from ttp import ttp
import pprint
data_1 = """
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
"""
data_2 = """
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
46
"""
template = """
<vars>
timestamp = "get_timestamp_iso"
</vars>
<group macro="process">
Line_N Mem_usage Increment Line_Contents {{ _headers_ }}
{{ @timestamp | set(timestamp) }}
</group>
<macro>
def process(data):
# remove ===== matches
if "====" in data["Line_N"]:
return False
# convert Increment to integer
incr = data.pop("Increment").split(" ")[0]
data["Increment_MiB"] = float(incr) if incr else 0.0
# convert Mem usage to integer
memuse = data.pop("Mem_usage").split(" ")[0]
data["Mem_usage_MiB"] = float(memuse) if memuse else 0.0
return data
</macro>
"""
parser = ttp(template=template)
parser.add_input(data_1)
parser.add_input(data_2)
parser.parse()
res = parser.result(structure="flat_list")
pprint.pprint(res)
# will print:
# [{'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 121.8,
# 'Line_Contents': '@profile(stream=f)',
# 'Line_N': '30',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'def parse_data(data):',
# 'Line_N': '31',
# 'Mem_usage_MiB': 0.0},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'Y=data["price"].values',
# 'Line_N': '32',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'Y=np.log(Y)',
# 'Line_N': '33',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'features=data.columns',
# 'Line_N': '34',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'X1=list(set(features)-set(["price"]))',
# 'Line_N': '35',
# 'Mem_usage_MiB': 121.8},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 4.5,
# 'Line_Contents': 'X=data[X1].values',
# 'Line_N': '36',
# 'Mem_usage_MiB': 126.3},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'ss=StandardScaler()',
# 'Line_N': '37',
# 'Mem_usage_MiB': 126.3},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'X=ss.fit_transform(X)',
# 'Line_N': '38',
# 'Mem_usage_MiB': 124.6},
# {'@timestamp': '2020-08-01T21:57:51.734448+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'return X,Y',
# 'Line_N': '39',
# 'Mem_usage_MiB': 124.6},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 127.1,
# 'Line_Contents': '@profile(stream=f)',
# 'Line_N': '41',
# 'Mem_usage_MiB': 127.1},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'def linearRegressionfit(Xt,Yt,Xts,Yts):',
# 'Line_N': '42',
# 'Mem_usage_MiB': 0.0},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.0,
# 'Line_Contents': 'lr=LinearRegression()',
# 'Line_N': '43',
# 'Mem_usage_MiB': 127.1},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 4.1,
# 'Line_Contents': 'model=lr.fit(Xt,Yt)',
# 'Line_N': '44',
# 'Mem_usage_MiB': 131.2},
# {'@timestamp': '2020-08-01T21:57:51.738444+00:00',
# 'Increment_MiB': 0.8,
# 'Line_Contents': 'predict=lr.predict(Xts)',
# 'Line_N': '45',
# 'Mem_usage_MiB': 132.0}]
如果将以上数据推送到 Elasticsearch 进行索引,可以使用 Grafana 相当容易地对其进行可视化,您可以构建查询以在引用 Line_N 或 Line_Contents 变量的每行基础上显示计数器。
但要使上述模板正常工作,需要从 github 存储库安装 TTP - PyPI 上可用的 0.3.0 版本没有所需的功能。新版本即将发布。