逐行解释每行代码,最后按照这样说明——从什么文件里进行提取,进行了什么操作,得到了什么文件
时间: 2024-10-22 08:17:42 浏览: 48
### 代码逐行解释及总结
#### 导入库
```python
import pandas as pd
import json
import os
import torch
from sklearn.decomposition import PCA
```
- **`pandas`**: 用于数据处理和分析。
- **`json`**: 用于处理JSON格式的数据。
- **`os`**: 用于操作系统相关的功能,如文件路径操作。
- **`torch`**: 用于深度学习任务。
- **`PCA`**: 用于主成分分析,降维技术。
#### 文档目的
```python
"""
本代码的目的是从调度算法得到的log中提取过程数据。
实际操作为分别把WaferInfo, JobList, 已执行的Move提取出来并保存为csv文件。
labels:指new_job_in实际时间。
"""
```
- **目的**: 从日志文件中提取特定数据(WaferInfo, JobList, Move),并保存为CSV文件。同时,提取标签数据,表示新作业的实际开始时间。
#### 辅助函数
```python
def min_max_normalize(data, column):
"""
对数据集中指定列进行归一化处理
:param data: pandas DataFrame 对象
:param column: 需要归一化的列名
:return: 归一化后的数据集
"""
min_val = data[column].min()
max_val = data[column].max()
data[column] = (data[column] - min_val) / (max_val - min_val)
return data
```
- **功能**: 对指定列进行归一化处理,将数值范围缩放到0到1之间。
#### 提取WaferInfo数据
```python
def get_wafer_info(data, base_path):
"""
提取WaferInfo数据
"""
df = pd.DataFrame()
for item in data:
if 'WaferInfo' in item['Info'] and item['Info']['WaferInfo'] != []:
RT = item['RealTime']
steps = item['Info']['WaferInfo']
time = item['Info']['Time']
for s in steps:
del s['WaferFlows']
s['RealTime'] = RT
s['Time'] = time
df1 = pd.DataFrame(s, index=[0])
df = pd.concat([df, df1], axis=0, join='outer')
save_path = os.path.join(base_path, 'data_w.csv')
df.to_csv(save_path, index=False, encoding='utf-8', float_format='%.4f')
return df
```
- **功能**: 从日志数据中提取WaferInfo部分,保存为`data_w.csv`文件。
#### 提取已执行的Move数据
```python
def get_move_state(data, base_path):
"""
提取已经执行的Move数据
"""
df = pd.DataFrame()
for item in data:
if 'MoveState' in item['Info'] and item['Info']['MoveState'] != []:
RT = item['RealTime']
T = item['Info']['Time']
s = item['Info']['MoveState']
for d in s:
d['RealTime'] = RT
d['Time'] = T
df1 = pd.DataFrame(s, index=[0])
df = pd.concat([df, df1], axis=0, join='outer')
save_path = os.path.join(base_path, 'data_z.csv')
df.to_csv(save_path, index=False, encoding='utf-8', float_format='%.4f')
return df
```
- **功能**: 从日志数据中提取MoveState部分,保存为`data_z.csv`文件。
#### 提取JobList数据
```python
def get_joblist(data, base_path):
"""
提取JobList数据
"""
df = pd.DataFrame()
for item in data:
if 'JobList' in item['Info'] and item['Info']['JobList'] != []:
RT = item['RealTime']
steps = item['Info']['JobList']
for s in steps:
del s['MatID']
s['RealTime'] = RT
df1 = pd.DataFrame(s, index=[0])
df = pd.concat([df, df1], axis=0, join='outer')
save_path = os.path.join(base_path, 'data_j.csv')
df.to_csv(save_path, index=False, encoding='utf-8', float_format='%.4f')
return df
```
- **功能**: 从日志数据中提取JobList部分,保存为`data_j.csv`文件。
#### 连接JobList和Move数据
```python
def get_state_job(df1, df2, base_path):
"""
:param df1: job_df, JobList数据
:param df2: z_df, 已经执行的Move数据
:param base_path:
:return: 左连接数据
"""
dfr = df2.merge(df1, on='MoveID', how='left')
cond1 = dfr['RealTime_x'] > dfr['RealTime_y']
cond2 = dfr['EndTime_x'] == -1
dfr = dfr[cond1 & cond2]
idx = dfr.groupby('MoveID')['RealTime_y'].idxmax()
dfr = dfr.loc[idx]
save_path = os.path.join(base_path, 'data_z_j.csv')
dfr.to_csv(save_path, index=False, encoding='utf-8', float_format='%.4f')
return dfr
```
- **功能**: 将JobList数据和Move数据进行左连接,并筛选出符合条件的数据,保存为`data_z_j.csv`文件。
#### 提取标签数据
```python
def get_labels(dfr, base_path):
"""
提取label数据
"""
cond1 = dfr['ModuleName'] == 'FoupRobot'
cond2 = dfr['Src'].str.startswith('Buffer')
cond3 = dfr['Dest'] == 'Opener2'
cond4 = dfr['JobId'] != -1.0
l_df = dfr[cond1 & cond2 & cond3 & cond4]
min_indices = l_df.groupby('JobId')['StartTime_x'].idxmin()
l_df = l_df.loc[min_indices]
save_path = os.path.join(base_path, 'data_labels.csv')
l_df.to_csv(save_path, index=False, encoding='utf-8', float_format='%.4f')
return l_df
```
- **功能**: 从连接后的数据中提取标签数据,保存为`data_labels.csv`文件。
#### 主程序
```python
if __name__ == "__main__":
root_path = 'D:/project/fjsp-drl-main/data/2024_07_29'
file_paths = []
for root, dirs, files in os.walk(root_path):
for file in files:
file_path = os.path.join(root, file)
file_paths.append(file_path)
for i in range(len(file_paths)):
file_path = file_paths[i]
with open(file_path, 'r') as file:
data = json.load(file)
base_path = os.path.join('D:/project/fjsp-drl-main/data/data_07_30', str(i))
if not os.path.exists(base_path):
os.mkdir(base_path)
state_df = get_wafer_info(data, base_path)
job_df = get_joblist(data, base_path)
z_df = get_move_state(data, base_path)
z_j_df = get_state_job(job_df, z_df, base_path)
label_df = get_labels(z_j_df, base_path)
```
- **功能**:
1. 遍历指定目录下的所有文件。
2. 读取每个文件的内容。
3. 创建输出目录。
4. 调用上述函数提取并保存WaferInfo、JobList、Move、连接数据和标签数据。
### 总结
- **输入文件**: `root_path`目录下的JSON日志文件。
- **操作**:
- 从日志文件中提取WaferInfo、JobList和Move数据。
- 将这些数据保存为CSV文件。
- 将JobList和Move数据进行左连接。
- 提取标签数据。
- **输出文件**:
- `data_w.csv`: WaferInfo数据。
- `data_j.csv`: JobList数据。
- `data_z.csv`: Move数据。
- `data_z_j.csv`: 连接后的JobList和Move数据。
- `data_labels.csv`: 标签数据。
阅读全文