반응형

제목 그대로다.

네이버 블로그도 인스타, 트위터처럼 좋아요 버튼이 있다.

바로 공감하기 이다.

말 그대로 나와 이웃된 블로거들의 포스팅에 공감을 눌러주는 매크로 프로그램이다.

아래 영상은 데모영상이다.

https://youtu.be/1_RBb1bjl48?si=VR2HDsotghQVmPEj 

 

728x90
반응형
반응형

저는 티스토리 뿐만 아니라 네이버 블로그도 운영했고 요새 정신이 없어서 포스팅을 그만 둔 상태였습니다. 

오랜만에 네이버 블로그를 들어 갔는데 아래와 같이 네이버측에 경고를 받았습니다.

하나가 아니라 여러 글에 대해서 경고를 받음...

네이버 블로그 서로 이웃을 추가해주는 프로그램을 버전 별로 정리해서 포스팅했는데 그걸 전부 비공개 처리가 된 것.

작년에 만든 프로그램이지만, 만들어 놓은게 아까워서 티스토리에 올리기로 했습니다.

 

 

네이버 블로그 서로이웃 추가 프로그램 ver1.2

로컬을 찾아보니 초기 버전을 찾을 수 있었음.

QT를 이용해 오밀조밀하게 한 레이아웃에서 전부 처리할 수 있게 만들었었음.

저 때는 사용안하는 네이버 계정으로 테스트했던 것을 알 수 있음.

 

 

네이버 블로그 서로이웃 추가 프로그램 ver2.0


2.0 버전이 최종 버전인 것 같음.

코드를 살짝 분석해보니, 1.2 버전과 다른 것은 총 네 가지임.

1. 코드 간략화

목적은 잘 모르겠으나, 프로젝트의 기능들을 객체화 하여 코드를 간략화 시킴. 아무래도 새로운 기능들을 추가하고 유지보수를 위해 그런 것으로 보임.

2. GUI 변경

테스트를 위해 블로거들에게 한 번 사용해보라고 했을 때, 어려워 함. 설명하기 귀찮아서 GUI를 좀 더 순차적으로 만들고 간략화 한 것으로 보임.

 

3. 쓰레드 추가

1.2 버전을 돌려보니 네이버 매크로가 기동중 일 때는 GUI가 멈추는 현상이 발생하여 쓰레드를 추가해 GUI가 멈추는 것을 방지함.

4. 랜덤 딜레이 추가

매크로를 돌리다 보면 반복적인 동작과 동일한 시간을 네이버가 이를 매크로로 감지하기 때문에 랜덤으로 딜레이를 추가한 것으로 추측함.

 

데모 영상

https://www.youtube.com/watch?v=9MyQLyCm4Qo 

 

728x90
반응형
반응형

안녕하세요. 

 

요즘 LoRa에서 End Device에서 바이트형식으로 오는 데이터를 파싱하기 위해 bytearray로 골머리를 썩고 있는데, 연구실 형님이 Python Struct을 추천해서 알게 되었습니다.

 

Python이 굉장히 잘 만든 언어이지만, 바이트나 비트를 처리하기에는 너무 까다롭습니다. 

 

bytearray를 이용해 데이터를 파싱하거나 checksum 계산을 수행할 때 PTSD가 왔는데, Python Struct는 정말 신세계에 가까웠습니다.

checksum
bytearray

 


파이썬 Struct는 C언어 Struct와 비슷합니다. 자세한 내용은 공식문서를 통해 참고하시면 됩니다.

https://docs.python.org/3/library/struct.html

 

struct — Interpret bytes as packed binary data — Python 3.9.7 documentation

struct — Interpret bytes as packed binary data Source code: Lib/struct.py This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network c

docs.python.org

 

https://coding-yoon.tistory.com/120

 

[C] UNION 공용체와 Struct 구조체를 이용해 간단한 패킷 만들기

안녕하세요. 오늘은 UNION과 STRUCT에 대해 이야기 하겠습니다. coding-yoon.tistory.com/119 [C] 구조체 포인터 접근과 최적화 요즘 기본기가 중요함을 느끼고 C를 공부하고 있습니다. 1. 구조체 단순히접근

coding-yoon.tistory.com

 

위 내용을 이해할 수 있다면, 저 말이 무슨 말인지 쉽게 이해할 수 있습니다. 

 

아래와 같은 하나의 14바이트의 packet을 전송했다고 가정합니다. ( 아래 코드는 실제 패킷 중 하나이다. 쉬운 이해를 위해 그림으로)

위 union을 설명하는 블로그에서는 __attribute__에 대해 이야기하지 않았습니다. __attribute__는 패딩 비트가 생기지 않도록 합니다. 그러므로 16바이트가 아닌 14바이트로 메모리가 할당됩니다. 

Packet

파이썬에서 위 같은 바이트로 이루어진 패킷을 받을려면 어떻게 해야하나? bytearray를 쓰려고 하면 정신이 혼미해지지만,  Python Struct를 사용하면 머리의 두통이 사라진다.

 

사용법은 간단하다. 한 줄이면 위 데이터를 쉽게 파싱할 수 있다.

 

from struct import *

"""
Do Something
"""

data = "14바이트패킷" # stirng 아님 # <class 'bytes'>

payload = unpack('<Hfff',data)

u_cnt = payload[0]
lat = payload[1]
long_ = payload[2]
alt = payload[3]

unpack 명령어 한 줄로 파싱이 가능하다.

 

'<Hfff' 의 foramt 형식만 사용할 줄 알면 된다. 간단하다. 위 python 공식 문서에 나와 있는 내용이다. 

 

1. 맨 처음쓰는 것은 바이트 정렬이다. 위 사진의 패킷은 litte endian이므로 '<' 를 추가한다. 

byteorder

2. 바이트 정렬을 적었다면, 데이터의 타입이 나오게 된다. 패킷의 구성은 unsigned int(2), float(4), float(4), float(4)의 순서로 아래 표의 C Type을 보고 해당하는 format을 적으면된다.  'HFF'

결과적으로 unpack은 list 형태로 payload를 반환하게 된다. 

 

 

728x90
반응형
반응형

안녕하세요.

 

제가 통신 전공으로 프로토콜 등도 중요하지만 정확한 센서 데이터 수집하는 것도 굉장히 중요하다고 요즘 느낍니다.

 

정확한 데이터를 기반으로 머신러닝, 딥러닝, 필터링이 가능하기 때문에 정확한 데이터를 모으는 것은 가장 중요합니다. 

 

UART Serial 통신(9600, 115200bps)을 통해 가장 심플한 CSV형식이 현재 구글에서 가장 돌고 있습니다. 

 

매번 데이터  수집을 위해 데이터 짜는 것이 귀찮기 때문에 저를 위해 메모장 느낌으로 코딩을 기록했습니다. 

 

파이썬 공식 문서를 보면 쉽게 알 수 있지만, 번역기에 돌린 한국말이 약간 이상합니다. 

https://docs.python.org/ko/3/library/csv.html

 

csv — CSV 파일 읽기와 쓰기 — Python 3.9.7 문서

소위 CSV (Comma Separated Values – 쉼표로 구분된 값) 형식은 스프레드시트와 데이터베이스에 대한 가장 일반적인 가져오기 및 내보내기 형식입니다. CSV 형식은 RFC 4180에서 표준화된 방식으로 형식을

docs.python.org

 

import os

path_ = './data/test.csv'
fieldnames = ['device_name','f_port', 'ucnt', 'dr', 'rssi', 'snr', 'channel', 'lat', 'long_', 'alt']


if __name__ == '__main__':
	file_exists = os.path.isfile(path_)
	
    while(1):
    """
    Do something ex) serial.read, post, parsing...
    """
        with open(file_name, 'a', newline='\n') as csvfile:
            wr = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames)
            if not file_exists: wr.writeheader()
            wr.writerow({
                'device_name' :device_name,
                'f_port':f_port,
                'ucnt' : ucnt, 
                'dr' :dr, 
                'rssi':rssi, 
                'snr':snr, 
                'channel':channel, 
                'lat':lat, 
                'long_': long_, 
                'alt': alt})

 

1. with문을 사용한 이유 :

우선 파이썬 공식문서는 with문을 쓰기 권장한다. 파일 쓰기 위해선 파일을 열어야 합니다. 그리고 쓰기가 완료되면 닫아야 합니다. 하지만 파일 쓰기가 완료되었지만, 파일이 열려 있으면 파일이 깨지거나, 제대로 된 데이터가 아닐 수 있습니다. with문은 이를 방지 위해 파일 열기, 닫기를 자동으로 해줍니다. 

 

2. 위 csv 저장하는 코드는 데이터를 이어 저장하는 형식이며, 만약 파일 이름(path_)이 지정한 경로(./data/) 내에 이름이 같은 파일이 없다면, csv header(fieldnames)를 추가한다. 파일 이름이 지정한 경로 내에 이름이 같은 파일이 있다면, csv header를 추가하지 않고, 데이터를 그대로 이어 저장한다.

    

csv 형태를 잘 만들어 놓으면 나중에 pandas 혹은 matlab가지고 놀기 편합니다. 

 

이런 느낌의 코드를 전에 짜놓고 또 못찾아서 새로 짜고를 3번 정도 반복할쯤 그냥 블로그에 올리기로 했습니다.

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
반응형

+ Recent posts