如何将长文本从 .txt 文件插入到 DataFrame
How to insert long text from .txt file to a DataFrame
我正在构建一个 CNN 模型,我必须分析每个时期的训练历史。时代的历史看起来是这样的。此历史记录保存在 .txt
文件中。
Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
.
.
Epoch 300/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04
要分析纪元历史,我需要将这些数据填充到 table。在 Python 中,我认为使用 DataFrame 是个好主意。此外,在 DataFrame 的末尾,我还想计算每列的平均值。为了说明,我希望 DataFrame 如下图所示:(我使用 Excel 女士制作的)
我想问的是:
- 如何在
.txt
文件上做子字符串以获取 DataFrame column
的所有数据?据我所知,DataFrame 需要 columns
才能获取数据,我目前不知道如何从我的 .txt
文件中获取它。
- 如果问题 1 可以解决,如何将值存储在 Python 变量中,然后将其填充到 DataFrame 中?
我假设您可以读取 .txt
文件并将其保存到像 text
这样的变量中。然后您可以执行以下操作:
import pandas as pd
text = '''Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
Epoch 3/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04
'''
data = []
for i, line in enumerate(text.split('\n')[1::2], start=1):
obj = {}
obj['epoch'] = i
for x in line.split(' - ')[2:]:
k, v = x.split(':')
obj[k] = v.lstrip()
data.append(obj)
df = pd.DataFrame(data).astype(float)
正在打印 df
,我们得到:
| | epoch | loss | accuracy | f1_m | precision_m | recall_m | lr | val_loss | val_accuracy | val_f1_m | val_precision_m | val_recall_m | val_lr |
|---:|--------:|-------:|-----------:|-------:|--------------:|-----------:|-------:|-----------:|---------------:|-----------:|------------------:|---------------:|---------:|
| 0 | 1 | 8.3641 | 0.1382 | 0.0676 | 0.2398 | 0.0408 | 0.0001 | 8.6183 | 0.0952 | 0.063 | 0.1872 | 0.0379 | 0.0001 |
| 1 | 2 | 6.1399 | 0.5581 | 0.5011 | 0.7591 | 0.3781 | 0.0001 | 6.6084 | 0.423 | 0.1302 | 0.6426 | 0.0725 | 0.0001 |
| 2 | 3 | 0.7877 | 0.9913 | 0.9911 | 0.9928 | 0.9894 | 0.0001 | 1.7068 | 0.8314 | 0.8347 | 0.8433 | 0.8263 | 0.0001 |
我喜欢将数据存储到 list of dicts
中,因为 DataFrame
会处理列的名称和值。看看 data
是怎样的:
[{'epoch': 1,
'loss': '8.3641',
'accuracy': '0.1382',
'f1_m': '0.0676',
'precision_m': '0.2398',
'recall_m': '0.0408',
'lr': '1.0000e-04',
'val_loss': '8.6183',
'val_accuracy': '0.0952',
'val_f1_m': '0.0630',
'val_precision_m': '0.1872',
'val_recall_m': '0.0379',
'val_lr': '1.0000e-04'},
{'epoch': 2,
'loss': '6.1399',
'accuracy': '0.5581',
'f1_m': '0.5011',
'precision_m': '0.7591',
'recall_m': '0.3781',
'lr': '1.0000e-04',
'val_loss': '6.6084',
'val_accuracy': '0.4230',
'val_f1_m': '0.1302',
'val_precision_m': '0.6426',
'val_recall_m': '0.0725',
'val_lr': '1.0000e-04'},
{'epoch': 3,
'loss': '0.7877',
'accuracy': '0.9913',
'f1_m': '0.9911',
'precision_m': '0.9928',
'recall_m': '0.9894',
'lr': '1.0000e-04',
'val_loss': '1.7068',
'val_accuracy': '0.8314',
'val_f1_m': '0.8347',
'val_precision_m': '0.8433',
'val_recall_m': '0.8263',
'val_lr': '1.0000e-04'}]
我正在构建一个 CNN 模型,我必须分析每个时期的训练历史。时代的历史看起来是这样的。此历史记录保存在 .txt
文件中。
Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
.
.
Epoch 300/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04
要分析纪元历史,我需要将这些数据填充到 table。在 Python 中,我认为使用 DataFrame 是个好主意。此外,在 DataFrame 的末尾,我还想计算每列的平均值。为了说明,我希望 DataFrame 如下图所示:(我使用 Excel 女士制作的)
我想问的是:
- 如何在
.txt
文件上做子字符串以获取 DataFramecolumn
的所有数据?据我所知,DataFrame 需要columns
才能获取数据,我目前不知道如何从我的.txt
文件中获取它。 - 如果问题 1 可以解决,如何将值存储在 Python 变量中,然后将其填充到 DataFrame 中?
我假设您可以读取 .txt
文件并将其保存到像 text
这样的变量中。然后您可以执行以下操作:
import pandas as pd
text = '''Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
Epoch 3/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04
'''
data = []
for i, line in enumerate(text.split('\n')[1::2], start=1):
obj = {}
obj['epoch'] = i
for x in line.split(' - ')[2:]:
k, v = x.split(':')
obj[k] = v.lstrip()
data.append(obj)
df = pd.DataFrame(data).astype(float)
正在打印 df
,我们得到:
| | epoch | loss | accuracy | f1_m | precision_m | recall_m | lr | val_loss | val_accuracy | val_f1_m | val_precision_m | val_recall_m | val_lr |
|---:|--------:|-------:|-----------:|-------:|--------------:|-----------:|-------:|-----------:|---------------:|-----------:|------------------:|---------------:|---------:|
| 0 | 1 | 8.3641 | 0.1382 | 0.0676 | 0.2398 | 0.0408 | 0.0001 | 8.6183 | 0.0952 | 0.063 | 0.1872 | 0.0379 | 0.0001 |
| 1 | 2 | 6.1399 | 0.5581 | 0.5011 | 0.7591 | 0.3781 | 0.0001 | 6.6084 | 0.423 | 0.1302 | 0.6426 | 0.0725 | 0.0001 |
| 2 | 3 | 0.7877 | 0.9913 | 0.9911 | 0.9928 | 0.9894 | 0.0001 | 1.7068 | 0.8314 | 0.8347 | 0.8433 | 0.8263 | 0.0001 |
我喜欢将数据存储到 list of dicts
中,因为 DataFrame
会处理列的名称和值。看看 data
是怎样的:
[{'epoch': 1,
'loss': '8.3641',
'accuracy': '0.1382',
'f1_m': '0.0676',
'precision_m': '0.2398',
'recall_m': '0.0408',
'lr': '1.0000e-04',
'val_loss': '8.6183',
'val_accuracy': '0.0952',
'val_f1_m': '0.0630',
'val_precision_m': '0.1872',
'val_recall_m': '0.0379',
'val_lr': '1.0000e-04'},
{'epoch': 2,
'loss': '6.1399',
'accuracy': '0.5581',
'f1_m': '0.5011',
'precision_m': '0.7591',
'recall_m': '0.3781',
'lr': '1.0000e-04',
'val_loss': '6.6084',
'val_accuracy': '0.4230',
'val_f1_m': '0.1302',
'val_precision_m': '0.6426',
'val_recall_m': '0.0725',
'val_lr': '1.0000e-04'},
{'epoch': 3,
'loss': '0.7877',
'accuracy': '0.9913',
'f1_m': '0.9911',
'precision_m': '0.9928',
'recall_m': '0.9894',
'lr': '1.0000e-04',
'val_loss': '1.7068',
'val_accuracy': '0.8314',
'val_f1_m': '0.8347',
'val_precision_m': '0.8433',
'val_recall_m': '0.8263',
'val_lr': '1.0000e-04'}]