기타 ...

[Project_TimeSemp] 온도 데이터 전처리 및 시각화.

잉_민 2024. 3. 12. 17:01
728x90
반응형

사람 체온 (core temp)

NASA Data

https://www.nature.com/articles/s41526-020-00129-1

import matplotlib.pyplot as plt
import os
import numpy as np
import pandas as pd
from glob import glob

# 데이터 파일 경로 설정
data_dir = './Data'

# CleanData 폴더 생성 (이미 존재하지 않는 경우)
clean_data_dir = os.path.join(data_dir, 'CleanData')
if not os.path.exists(clean_data_dir):
    os.makedirs(clean_data_dir)

# 모든 CSV 파일 목록 불러오기
csv_files = glob(os.path.join(data_dir, '*.csv'))

# 첫 번째 타임스탬프 설정
first_timestamp = 68819

# 그래프를 위한 준비
plt.figure(figsize=(15, 5))

# 모든 파일 처리
for fname in csv_files:
    # 파일명에서 기준이 되는 이름 추출
    base_name = os.path.basename(fname).replace('.csv', '')

    # 데이터 읽기
    df = pd.read_csv(fname)
    
    # 첫 번째 타임스탬프 이후의 데이터만 선택
    df = df[df.iloc[:, 0] >= first_timestamp]
    
    # 온도가 35도 이하인 데이터 제외
    df = df[df.iloc[:, 1] > 35.6]
    
    # 시간 조정
    df.iloc[:, 0] = (df.iloc[:, 0] - first_timestamp) / 60  # 분 단위로 변환
    
    # 6분 간격으로 평균화
    df['Interval'] = df.iloc[:, 0] // 6 * 6
    grouped = df.groupby('Interval')
    df_mean = grouped.mean()

    # 시각화
    plt.plot(df_mean.iloc[:, 0], df_mean.iloc[:, 1], marker='o', linestyle='-', label=base_name)
    
    # 정리된 데이터 저장
    clean_fname = os.path.join(clean_data_dir, f'clean_{base_name}.csv')
    df_mean.to_csv(clean_fname, index=False)

# 그래프 설정
plt.title('Rectal Temperature Over Time (6-minute intervals)')
plt.xlabel('Time (minutes)')
plt.ylabel('Rectal Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()

 

 


수정 : 24시간 데이터가 아니였음 (시간이 더 길었다.)

패턴이 반복되면서 오류가 더 많았을 것이라 가정.

24시간 패턴이므로 24시간 단위로 잘랐다.

데이터 시간이 초로 되어있고 시작 시간이 명확하지 않아. 

같은 시간 초를 기준으로 24시간을 추정했다. 

(실제 시간과 위상이 다를 것으로 예상.)

일단 처음 초를 0으로 잡았다. 

import matplotlib.pyplot as plt
import os
import pandas as pd
from glob import glob

# 데이터 파일 경로 설정
data_dir = './Data'

# CleanData 폴더 생성 (이미 존재하지 않는 경우)
clean_data_dir = os.path.join(data_dir, 'CleanData')
if not os.path.exists(clean_data_dir):
    os.makedirs(clean_data_dir)

# 모든 CSV 파일 목록 불러오기
csv_files = glob(os.path.join(data_dir, '*.csv'))

# 첫 번째 타임스탬프 설정
first_timestamp = 68819

# 24시간 초 단위로 변환
end_timestamp = first_timestamp + 24 * 60 * 60  # 24 hours * 60 minutes/hour * 60 seconds/minute

# 그래프를 위한 준비
plt.figure(figsize=(15, 5))

# 모든 파일 처리
for fname in csv_files:
    # 파일명에서 기준이 되는 이름 추출
    base_name = os.path.basename(fname).replace('.csv', '')

    # 데이터 읽기
    df = pd.read_csv(fname)
    
    # 첫 번째 타임스탬프 이후, 24시간까지의 데이터만 선택
    df = df[(df.iloc[:, 0] >= first_timestamp) & (df.iloc[:, 0] <= end_timestamp)]
    
    # 온도가 35도 이하인 데이터 제외
    df = df[df.iloc[:, 1] > 35.6]
    
    # 시간 조정
    df.iloc[:, 0] = df.iloc[:, 0] - first_timestamp  # 초 단위로 변환
    
    # 6분 간격으로 평균화
    df['Interval'] = df.iloc[:, 0] // 6 * 6
    grouped = df.groupby('Interval')
    df_mean = grouped.mean()

    # 시각화
    plt.plot(df_mean.iloc[:, 0], df_mean.iloc[:, 1], marker='o', linestyle='-', label=base_name)
    
    # 정리된 데이터 저장
    clean_fname = os.path.join(clean_data_dir, f'clean_{base_name}.csv')
    df_mean.to_csv(clean_fname, index=False)

# 그래프 설정
plt.title('Rectal Temperature Over Time (6-minute intervals)')
plt.xlabel('Time (seconds)')
plt.ylabel('Rectal Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()

20분간격으로 해봄

import matplotlib.pyplot as plt
import os
import pandas as pd
from glob import glob

# 데이터 파일 경로 설정
data_dir = './Data'

# CleanData 폴더 생성 (이미 존재하지 않는 경우)
clean_data_dir = os.path.join(data_dir, 'CleanData')
if not os.path.exists(clean_data_dir):
    os.makedirs(clean_data_dir)

# 모든 CSV 파일 목록 불러오기
csv_files = glob(os.path.join(data_dir, '*.csv'))

# 가장 큰 첫 번째 타임스탬프 찾기
first_timestamps = []

for fname in csv_files:
    # 데이터 읽기
    df = pd.read_csv(fname, nrows=1)  # 첫 번째 행만 읽기
    
    # 첫 번째 타임스탬프 저장
    first_timestamps.append(df.iloc[0, 0])

# 가장 큰 첫 번째 타임스탬프 설정
first_timestamp = max(first_timestamps)

# 24시간 끝 시간 지정
end_timestamp = first_timestamp + 24 * 60 * 60  # 24 hours * 60 minutes/hour * 60 seconds/minute

# 그래프를 위한 준비
plt.figure(figsize=(15, 5))

# 모든 파일 처리
for fname in csv_files:
    # 파일명에서 기준이 되는 이름 추출
    base_name = os.path.basename(fname).replace('.csv', '')

    # 데이터 읽기
    df = pd.read_csv(fname)
    
    # 첫 번째 타임스탬프 이후, 24시간까지의 데이터만 선택
    df = df[(df.iloc[:, 0] >= first_timestamp) & (df.iloc[:, 0] <= end_timestamp)]
    
    # 온도가 35도 이하인 데이터 제외
    df = df[df.iloc[:, 1] > 35.6]
    
    # 시간 조정 (초 단위로 변환 후 정수로 변환)
    df.iloc[:, 0] = ((df.iloc[:, 0] - first_timestamp) / 60).astype(int) # 초 단위를 분 단위로 변환
    
    # 6분 간격으로 평균화
    df['Interval'] = df.iloc[:, 0] // 20 * 6
    grouped = df.groupby('Interval')
    df_mean = grouped.mean()

  # 시각화
    plt.plot(df_mean.iloc[:, 0], df_mean.iloc[:, 1], marker='o', linestyle='-', label=base_name)
    
    # 정리된 데이터 저장
    clean_fname = os.path.join(clean_data_dir, f'clean_{base_name}.csv')
    df_mean.to_csv(clean_fname, index=False)

# 그래프 설정
plt.title('Rectal Temperature Over Time (6-minute intervals)')
plt.xlabel('Time (minutes)')
plt.ylabel('Rectal Temperature (°C)')
plt.legend()
plt.grid(True)
plt.show()
728x90
반응형