Category: Python

  • Telegram on Python

    파이썬에서 Telegram 메세지 보내는 방법은 두 가지가 있는 것 같다. 첫 번째는 api.telegram.org를 이용하는 것이다. 이 경우 다음과 같이 한다.

    import requests
    
    def Send_Message_2(text):
        url = f"https://api.telegram.org/bot{my_token}/sendMessage"
        params = {
            "chat_id" : my_channel_id,
            "text" : text
        }
        requests.get(url, params=params)
    
    Send_Message_2("test2")

    telegram 에서 제공하는 python 모듈을 이용할 경우에는 다음과 같다. asyncio 라는 것을 이용해야 한다고 한다. 그리고 jupyter lab 같은 환경에서는 오류가 난다. 직접 실행하는 환경에서는 정상 동작한다.

    import telegram
    import asyncio
    
    bot = telegram.Bot(token=my_token)
    
    async def Send_Message_1(text):
        await bot.sendMessage(chat_id=my_channel_id, text=text)
    
    asyncio.run(Send_Message_1("test1"))
  • PIP update all packages

    R에서는 비교적 쉽게 모든 패키지를 업데이트 할 수 있다. 나는 파이썬에서 PIP를 이용해서 패키지를 관리한다. PIP 자체로 모든 패키지를 업데이트 하는 방법은 아직 없는 것 같다. 나는 데비안의 도커의 컨테이너 환경에서 파이썬을 이용한다. 다음의 방법이 내가 적용하기 쉬운 방법이었다.

    적당한 디렉토리에서 다음과 같은 명령어로 현재 설치된 패키지를 확인한다.

    pip freeze > requirements.txt

    sed를 이용해서 ‘==’를 ‘>=’로 변경한다.

    sed -i 's/==/>=/' requirements.txt

    PyTorch 패키지는 이 방법으로 업그레이드 할 수 없다. 그러므로 torch 와 nvidia 이름이 포함된 패키지는 제외하도록 파일에서 삭제한다.

    sed -i '/torch/d' requirements.txt
    sed -i '/nvidia/d' requirements.txt

    다음의 명령어를 실행하면 패키지들 중에서 버젼이 더 높은 것들이 있는 것이 있으면, 해당 패키지가 업데이트 된다.

    pip install -r requirements.txt --upgrade --break-system-packages

  • WGS84, 두 지점 사이의 거리

    남한 정도의 지형에서라면 굳이 구면 혹은 타원체 두 점 사이의 거리를 이용해야 할 정도는 아닐 것이다. 그럼에도 불구하고 처리 시간이 엄청 바뀌지 않는다면 제대로 측정해 보는 것도 좋을 것이다.

    좌표계 변환에 사용했던 pyproj 의 Geod 를 이용한다. 입력값으로 scalar와 array 모두 가능하다. 그렇다면 편리하게 array 형식으로 한 번에 계산한다.

    geo = pandas.read_csv("area_data.csv")
    
    import pyproj
    g = pyproj.Geod(ellps='WGS84')
    _,_,dist = g.inv([target_long] * len(geo), 
                     [target_lati] * len(geo), 
                     geo['longitude'],
                     geo['latitude'])
    geo['distance'] = dist
    geo.sort_values(by='distance', inplace = True)

    결과적으로 보면 이렇게 할 경우 거리는 m 단위로 나오는 것 같다.

  • 좌표계 변경

    GPS로 얻을 수 있는 좌표는 WGS84 좌표계이다. 다른 표현으로 EPSG:4326이다.

    기상청 예보는 좌표계로 도로명 주소를 이용한다. 초단기예보는 동네까지 적용된다. 기술문서에 주소와 GPS 좌표가 있는 엑셀 파일을 제공한다. 이를 이용하여 현재 GPS 좌표와 가장 가까운 대표 주소를 알아낼 수 있다.

    에어코리아에서는 TM 좌표를 이용한다. TM이라는 것은 표현 방식에 대한 것으로 어떤 좌표계를 말하는 것인지 알 수 없다. 정부기관에서 하는 일이니까 적어도 표준적인 좌표계를 쓸 것 같았다. 인터넷 검색으로 통계청 자료 자료를 구할 수 있었다.

    기술 문서에 ‘중부원점’ 표현이 있다. 따라서, EPSG:5181과 EPSG:5186 중 하나일 가능성이 높다.

    이런 예시의 진위 여부가 고민이기는 한데, 소수점 이하까지 만들어 내는 것은 쉽지 않을 것이다. 이 예시를 참고한 결과 EPSG:5181 좌표계를 이용한 것 같다.

    EPSG:4326의 좌표를 EPSG:5181로 변환하려면 다음과 같이 한다. 이 함수를 이용할 때 X와 Y 순서가 반대로 되어 있음에 유의하자.

    import pyproj
    y, x = pyproj.Transformer.from_crs("epsg:4326", "epsg:5181").transform(target_lati, target_long)