반응형

안녕하세요. 오늘은 Indoor Positioning에서 [cm]단위의 오차를 내는 UWB 관련 논문에 이야기하겠습니다. 

 

coding-yoon.tistory.com/136?category=910542

 

[무선 통신] Bluetooth Low Energy(BLE) 1. Physical Layer

microchipdeveloper.com/wireless:start Wireless Communications - Developer Help Microchip offers a broad portfolio of wireless solutions which are cost effective and very easy to implement. Depending..

coding-yoon.tistory.com

BLE는 기기간 수신신호세기(RSSI)를 이용해 Indoor Positioning을 하는 방면, UWB는 nanosecond(10e-9)의 길이를 갖는 매우 짧은 펄스를 이용하여 통신하는 방식입니다. 

 

시간 분해능이 매우 높아 최단 경로와 다중 경로간의 신호구별을 용이하여 수 cm이내의 정확도로 거리 측정이 가능하고 낮은 전력 밀도로 저전력 대용량 데이터 전송이 가능합니다. 

 

 

대표적으로 TWR(Two Way Ranging) 방식으로 Distance를 추정합니다. 

 

t_round A : 노드 A가 거리측적용 메세지를 송신한 순간부터 노드 B의 응답 메세지를 수신했을 때의 시간, 즉 거리 측정                 메세지의 왕복시간(Round Trip Time : RTT)

t_reply B : 노드 B의 응답시간 또는 처리 시간(Processing Time)

t_p : 거리 측정 메세지의 단방향 도달 시간

TOA = t_p, C : 전파속도, 광속도(3e8)

 

일반 TWR은 두 기기간의 하드웨어적 차이로 인해 시간 측정이 달라 TOA에 오차가 발생할 수 있어, SDS-TWR 등 많은 방식이 존재합니다.

< [UWB] IEEE 802.15.4a UWB 기반 실내 위치측정 시스템의 설계 및 구현 > 

 

 

기본적으로 UWR을 이용하여 거리를 구하는 방법을 알아보았으며, Non-Line of Sight 에 대해 알아보겠습니다. 

 

ieeexplore.ieee.org/document/9108193

 

UWB NLOS/LOS Classification Using Deep Learning Method

Ultra-Wide-Band (UWB) was recognized as its great potential in constructing accurate indoor position system (IPS). However, indoor environments were full of complex objects, the signals might be reflected by the obstacles. Compared with the Line-Of-Sight (

ieeexplore.ieee.org

 

논문의 아이디어는 UWB LOS/NLOS 분류를 딥러닝을 통해 성능을 향상시키는 것입니다. 

(Line of Sight, Non-Line of Sight)

 

실내 환경은 다양한 장애물(책상, 캐비넷, 책장 등)으로 가득차있으며, 이 장애물을 통해 UWB 신호는 반사될 수 있으며, 신호 수신은 직접 수신 된 신호에 비해 거리 정보에 더 긴 전송 시간을 가져오고 추가적인 Time-varying bias를 유발합니다. 

cf) UWB 신호의 오차는 대게 양의 값(+)을 가집니다. UWB 신호는 Nanosecond 단위로 시간측정 방식이기 때문에, 신호가 반사되면 지연 시간이 더해져 오차로 발생하기 때문입니다.

 

반사를 통해 오차를 일으킨 NLOS를 제거하면, 정확한 거리를 구할 수 있습니다. 

 

가장 직접적인 접근 방식은 UWB 신호 전파 경로 손실 모델 또는 CIR (Channel Impulse Response)을 기반으로 NLOS / LOS 신호 특성을 분석하는 것입니다.

 

위 논문은 Doctor Klemen Bregar providing the UWB NLOS/LOS open source data 를 이용

github.com/ewine-project/UWB-LOS-NLOS-Data-Set

 

ewine-project/UWB-LOS-NLOS-Data-Set

Repository with UWB data traces representing LOS and NLOS channel conditions in 7 different indoor locations. - ewine-project/UWB-LOS-NLOS-Data-Set

github.com

 

이 포스팅은 두 편을 걸쳐 진행됩니다. ( 1편 : 오픈소스 데이터셋 전처리, 2편 : 논문 기반 네트워크를 통해 학습 )

 

Doctor Klemen Bregar providing the UWB NLOS/LOS open source data를 딥러닝을 위해 전처리 과정이 필요합니다. 

 

오픈소스 데이터 구성

오픈소스는 csv, 데이터를 불러오는 모듈로 구성되어 있습니다. 

4년 전 데이터이므로 pandas 버전 오류 해결을 위해 uwb_dataset.py를 약간 변경했습니다.

 

uwb_dataset.py

"""
Created on Feb 6, 2017
@author: Klemen Bregar 
"""

import os
import pandas as pd
from numpy import vstack


def import_from_files():
    """
        Read .csv files and store data into an array
        format: |LOS|NLOS|data...|
    """
    rootdir = '../dataset/'
    output_arr = []
    first = 1
    for dirpath, dirnames, filenames in os.walk(rootdir):
        for file in filenames:
            filename = os.path.join(dirpath, file)
            print(filename)
            output_data = [] 
            # read data from file
            df = pd.read_csv(filename, sep=',', header=0)
            # ------------------------ update Mar 3, 2021 ----------------------------- #
            columns_name = df.columns.values
            # ------------------------ update Mar 3, 2021 ----------------------------- #
            

            # ------------------------ update Mar 3, 2021 ----------------------------- #
            # input_data = df.as_matrix()
            # df.as_matrix() was depriciated after the version 0.23.0 use df.values()
            input_data = df.values
            
            # ------------------------ update Mar 3, 2021 ----------------------------- #
            
            # append to array
            if first > 0:
                first = 0
                output_arr = input_data
            else:
                output_arr = vstack((output_arr, input_data))
    
    return columns_name, output_arr

if __name__ == '__main__':

    # import raw data from folder with dataset
    print("Importing dataset to numpy array")
    print("-------------------------------")
    data = import_from_files()
    print("-------------------------------")
    # print dimensions and data
    print("Number of samples in dataset: %d" % len(data))
    print("Length of one sample: %d" % len(data[0]))
    print("-------------------------------")
    print("Dataset:")
    print(data)

 

1. Load UWB data

import numpy as np
import pandas as pd
import uwb_dataset

# import raw data
data = uwb_dataset.import_from_files()

# divide CIR by RX preable count (get CIR of single preamble pulse)
# item[2] represents number of acquired preamble symbols
for item in data:
	item[15:] = item[15:]/float(item[2])

print("\nColumns :", columns.shape, sep=" ")
print("Data :", data.shape, sep=" ")
print(type(data))

 

2. Create UWB(CIR) Pandas Dataframe

cir_n = len(columns[15:])

print("Columns :", columns, sep=" ")
print("Channel Inpulse Response Count :", cir_n, sep=" ")

df_uwb = pd.DataFrame(data=data, columns=columns)
print("Channel 2 count :", df_uwb.query("CH == 2")['CH'].count())
print("Null/NaN Data Count : ", df_uwb.isna().sum().sum())
df_uwb.head(3)

# LOS/NLOS Count
los_count = df_uwb.query("NLOS == 0")["NLOS"].count()
nlos_count = df_uwb.query("NLOS == 1")["NLOS"].count()

print("Line of Sight Count :", los_count)
print("Non Line of Sight Count :", nlos_count)

# Columns CIR Extract
df_uwb_data = df_uwb[["CIR"+str(i) for i in range(cir_n)]]
print("UWB DataFrame X for Trainndarray shape : ",df_uwb_data.values.shape)
df_uwb_data.head(5)

 

Columns : Sampling 1016 CIR

LOS : 21000, NLOS : 21000  Pandas Dataframe 

 

다음 글은 생선된 위 데이터 프레임을 이용해 논문에 제시된 CNN+LSTM 모델을 Pytorch로 구현하겠습니다.

coding-yoon.tistory.com/139

 

[무선 통신] UWB LOS/NLOS Classification Using Deep Learning Method (2)

안녕하세요. WB LOS/NLOS Classification Using Deep Learning Method(1)에서 UWB CIR Dataset을 생성하였다면, 2편으로 논문에서 제시한 CNN_LSTM 네트워크를 약간 변형하여 구성하겠습니다. coding-yoon.tistory..

coding-yoon.tistory.com

 

728x90
반응형
반응형

pip install pandas

 

현재 폴더 경로 

각 폴더에는 아래와 같이 전처리 되지 않은 CSV가 존재한다.

JS01

 

JS02

 

JS03

[JS01-210210_222834_p9_고정, JS02-210210_222841_p9고정, JS03-210210_222859_p9_고정]과 같이 데이터 프레임을 병합하고, 분석에 알맞게 전처리를 하는 과정을 보여준다.  

 

아래는 실험 데이터로 중간에 빈 데이터가 보이고, 전처리 과정이 필요한 원본 데이터이다.  

 

raw data
preprocessing data


이제부터 Pandas를 통해 데이터 분석에 알맞게 전처리를 할 것이다.  (위 preprocessing data가 최종 목표 데이터)

 

 

 

* Section 1 *

 

0. 모든 CSV를 불러온다. 

1. Null/NaN(결손) 데이터를 제거한다. 

   ex) (df : dataframe) df.isna.sum() 를 통해서 결손데이터를 파악할 수 있다. ( df.info()도 확인가능하다. )

2. 필요없는 열(bootms)을 삭제한다. 

3. Column 이름을 변경한다. (" aCnt" ▶"aCnt", " RSSI" "RSSI") 

   ( " aCnt"와 "aCnt"의 차이는 띄어쓰기이다. df.columns 를 통해 정확한 column name을 작성한다. 띄어쓰기 구별 )

4. 1001 이상 aCnt 행을 삭제한다. 

5. aCnt를 Group 내어 평균한다. 

6. CSV 데이터로 저장한다. 

 

import pandas as pd
import os


# 모든 CSV 경로를 변수에 저장한다..
list_folder_name = ['JS01', 'JS02', 'JS03']
list_csv_folder = [os.path.join(os.getcwd(), file_name) for file_name in list_folder_name]
list_p = []
list_path = []

for i in list_csv_folder:
    _, _, file_names = next(os.walk(i))
    for n, j  in enumerate(file_names):
        list_path.append(os.path.join(i,j))
        print(list_path[n])
        
# result 
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv

 

# 파일 별로 1번 ~ 6번 과정을 반복한다.
# 0. 모든 CSV를 불러온다. 
for i in range(len(list_path)):
    print(list_path[i])
    # 0_1. CSV를 불러온다.
    csv_data = pd.read_csv(list_path[i])
    
    # 1. Null/NaN(결손) 데이터를 제거한다. 
    csv_data.dropna(inplace=True)
    
    # 2. 필요없는 열(bootms)을 삭제한다. 
    csv_data.rename(columns={" aCnt":"aCnt", " RSSI":"RSSI"}, inplace=True)
    
    # 3. Column 이름을 변경한다. (" aCnt" ▶"aCnt", " RSSI" ▶ "RSSI") 
    csv_data.drop(columns=['bootms'], inplace=True)
    
    # 4. 1001 이상 aCnt 행을 삭제한다.
    csv_data.query('aCnt<=1000', inplace=True)

    # 5. aCnt를 Group 내어 평균한다. 
    csv_data_group = csv_data.groupby(['aCnt']).mean().round(1)
    
    # 6. CSV 데이터로 저장한다. 
    csv_data_group.to_csv(list_path[i], mode='w', index=True)

head(5)
tail(5)

1차적으로 필요없는 열 제거, 결손 데이터 제거 등 필수 작업은 끝이 났다. 

 

이제 분석을 하기 위해 Dataframe 병합, 분석에 필요한 열 추가를 할 것이다. 

 

 

 

* Section 2 *

 

import pandas as pd
import numpy as np
import os


list_folder_name = ['JS01', 'JS02', 'JS03']
list_csv_folder = [os.path.join(os.getcwd(), file_name) for file_name in list_folder_name]
list_path = []

for i in list_csv_folder:
    _, _, file_names = next(os.walk(i))
    for j in file_names:
        list_path.append(os.path.join(i,j))
        
# result 
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_222834_p9_고정.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_224020.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225507.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_225821.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230150.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230314.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230540.csv
c:\Users\mangnani\Desktop\Develop\VS Code\Python37\[티스토리]__Pandas전처리\JS01\210210_230845.csv        

 

np_path = np.array(list_path) # (24)
np_path = np_path.reshape(len(list_folder_name), -1) # (3, 8)
np_path_trans = np_path.T  # Transpose (8, 3)  
print(np_path_trans)

# result 
"""
[['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_222834_p9_고정.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_222841_p9고정.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_222859_p9_고정.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_224020.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_224045.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_224041.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_225507.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_225511.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_225519.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_225821.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_225828.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_225837.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_230150.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_230159.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_230155.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_230314.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_230325.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_230329.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_230540.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_230607.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_230601.csv']
 ['c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS01\\210210_230845.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS02\\210210_230850.csv'
  'c:\\Users\\mangnani\\Desktop\\Develop\\VS Code\\Python37\\[티스토리]__Pandas전처리\\JS03\\210210_230903.csv']]
  """

 

df_1 = pd.read_csv(np_path_trans[file_index][0])
df_2 = pd.read_csv(np_path_trans[file_index][1])
df_3 = pd.read_csv(np_path_trans[file_index][2])

print(df_1, df_2, df_3, sep="\n")

# result
       aCnt  RSSI
0       0.0 -73.2
1       1.0 -71.5
2       2.0 -72.5
3       3.0 -72.0
4       4.0 -73.0
..      ...   ...
988   996.0 -73.3
989   997.0 -73.3
990   998.0 -74.0
991   999.0 -72.7
992  1000.0 -73.0

[993 rows x 2 columns]
       aCnt  RSSI
0       0.0 -85.0
1       1.0 -84.0
2       2.0 -85.0
3       4.0 -81.0
4       5.0 -82.0
..      ...   ...
741   996.0 -84.0
742   997.0 -83.0
743   998.0 -81.5
744   999.0 -80.0
745  1000.0 -81.5

[746 rows x 2 columns]
      aCnt  RSSI
0      0.0 -80.5
1      1.0 -82.0
2      2.0 -81.0
3      3.0 -85.0
4      4.0 -81.0
..     ...   ...
759  982.0 -83.0
760  984.0 -83.0
761  990.0 -87.0
762  992.0 -86.0
763  999.0 -85.0

[764 rows x 2 columns]

데이터 프레임을 자세히 보면 세 개의 df 행의 갯수가 다름을 알 수 있다. ( 이는 데이터 특성상 aCnt가 없는 것을 의미한다.) 

 

각각 데이터 프레임 aCnt의 교집합을 찾아 병합할 것이다. 

df_tmp = pd.merge(df_1, df_2, on='aCnt', how='inner')
df_rssi = pd.merge(df_tmp, df_3, on='aCnt', how='inner')

df_rssi

# result
aCnt	RSSI_x	RSSI_y	RSSI
0	0.0	-73.2	-85.0	-80.5
1	1.0	-71.5	-84.0	-82.0
2	2.0	-72.5	-85.0	-81.0
3	4.0	-73.0	-81.0	-81.0
4	5.0	-73.0	-82.0	-83.5
...	...	...	...	...
586	982.0	-73.3	-83.3	-83.0
587	984.0	-73.3	-81.0	-83.0
588	990.0	-73.0	-83.0	-87.0
589	992.0	-73.7	-82.5	-86.0
590	999.0	-72.7	-80.0	-85.0
591 rows × 4 columns

 

Colum name을 알맞게 변경한다. 

 

df_rssi.rename(columns={"RSSI_x":"RSSI_1", "RSSI_y":"RSSI_2", "RSSI":"RSSI_3"}, inplace=True)

df_rssi

# result

aCnt	RSSI_1	RSSI_2	RSSI_3
0	0.0	-73.2	-85.0	-80.5
1	1.0	-71.5	-84.0	-82.0
2	2.0	-72.5	-85.0	-81.0
3	4.0	-73.0	-81.0	-81.0
4	5.0	-73.0	-82.0	-83.5
...	...	...	...	...
586	982.0	-73.3	-83.3	-83.0
587	984.0	-73.3	-81.0	-83.0
588	990.0	-73.0	-83.0	-87.0
589	992.0	-73.7	-82.5	-86.0
590	999.0	-72.7	-80.0	-85.0
591 rows × 4 columns

RSSI를 통한 Distance를 추가할 것이다. ( lambda 함수 사용 )

def lambda_distance(rssi, tp=-64):
    ratio = rssi*1.0/tp
    if ratio < 1.0:
        return pow(ratio, 10)
    else:
        distance = (0.89976)*pow(ratio,7.7095) + 0.111
        return distance

 

df_rssi['distance_1'] = df_rssi['RSSI_1'].apply(lambda rssi:lambda_distance(rssi))
df_rssi['distance_2'] = df_rssi['RSSI_2'].apply(lambda rssi:lambda_distance(rssi))
df_rssi['distance_3'] = df_rssi['RSSI_3'].apply(lambda rssi:lambda_distance(rssi))

df_rssi

# result
	aCnt	RSSI_1	RSSI_2	RSSI_3	distance_1	distance_2	distance_3
0	0.0	-73.2	-85.0	-80.5	2.645139	8.132164	5.384701
1	1.0	-71.5	-84.0	-82.0	2.225242	7.432724	6.191371
2	2.0	-72.5	-85.0	-81.0	2.464196	8.132164	5.642557
3	4.0	-73.0	-81.0	-81.0	2.592246	5.642557	5.642557
4	5.0	-73.0	-82.0	-83.5	2.592246	6.191371	7.103364
...	...	...	...	...	...	...	...
586	982.0	-73.3	-83.3	-83.0	2.671951	6.975277	6.786975
587	984.0	-73.3	-81.0	-83.0	2.671951	5.642557	6.786975
588	990.0	-73.0	-83.0	-87.0	2.592246	6.786975	9.707345
589	992.0	-73.7	-82.5	-86.0	2.781686	6.483119	8.889049
590	999.0	-72.7	-80.0	-85.0	2.514708	5.137370	8.132164
591 rows × 7 columns

df_rssi.to_csv(csv_name, mode='w', index=False)

 

728x90
반응형
반응형

안녕하세요. 

 

pandas_datareader을 이용해서 데이터 처리를 하기 위해 아래 문구처럼 에러문이 뜨는 경우가 있습니다. 

 

FutureWarning: pandas.util.testing is deprecated. Use the functions in the public 
API at pandas.testing instead. from pandas.util.testing import assert_frame_equal

아래 에러문이 뜨더라도 실제 코딩하는데는 아무 문제 없습니다. 

 

위 에러문은 pandas.util.testing 에서 더 이상 사용되지 않기 때문에 뜹니다. 

 

대신, pandas.testing에서 사용할 수 있으니 수정하라는 권고문 같은 정도입니다. 

 

실행될 때마다 에러문이 발생하면 기분이 별로 좋지 않으니 에러문이 뜨지 않도록 수정해주겠습니다. 

 

에러문 옆을 보면 pandas_datareader/compat/__init__.py에서 7번 째 줄에서 해당 에러문이 발생하는 것을 알 수 있습니다.

 

클릭해서 해당 파일에 들어가기
해당 7번째 줄

7: pandas.util.testing을 pandas.testing으로 바꿔주면 됩니다. 

 

수정

위 처럼 수정해주시고 실행시켜 보시면 에러문은 뜨지 않습니다. 

728x90
반응형

+ Recent posts