파이썬_visdom_port_변경하기

파이썬 visdom의 port 변경하기

  • visdom의 기본포트는 8097포트이다.

  • CNN모델 학습 Loss그래프를 그리기 위해 visdom을 사용하려 했으나 다음과 같은 에러가 발생했다.

1
액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다
  • 이는 이미 8097포트를 다른 프로세스에서 사용하고 있기 때문에 발생한다.

  • 따라서, 해당 프로세스를 찾아야하는데 cmd에 다음과 같은 명령어로 사용중인 포트와 프로세스를 확인할 수 있다.

1
netstat -ano
  • 해당 프로세스를 찾았으면 좌측 끝의 PID를 확인하고 작업 관리자를 열어주자.

  • 작업 관리자 –> 서비스 탭에 들어가면 PID로 프로세스를 정렬할 수 있다.

  • 그곳에서 포트를 사용중인 프로세르를 선택하고 서비스 센터로 접근해 작업을 종료하면 된다.

  • 이후 다시,

1
python -m visdom.server
  • 명령어로 visdom 로컬 서버를 키면된다.

  • 하지만, 8097 포트를 사용하는 프로세스를 찾을 수가 없었다.

  • 방화벽 문제인지 공유기 문제인지 확실하지는 못했지만 원인을 찾을수가 없었기에 visdom의 포트를 변경해서 사용하기로 결정했다.

  • visdom의 포트는 다음과 같이 변경할 수 있다.

1
python -m visdom.server -port [포트번호]
  • 예를들어, 포트번호를 9000으로 옮긴다면 다음과 같이 바꿀 수 있다.
1
python -m visdom.server -port 9000
  • 이제 코드에서 visdom 객체를 불러올 때 다음과 같이 정한 포트 번호를 사용해서 불러오기만 하면 된다.
1
vis = visdom.Visdom(port=9000)
  • 아래 예제를 실행해서 올바르게 출력되는것을 확인할 수 있다.
1
vis.text('hello world', env="main")

파이썬_dataframe_loc_iloc_인덱싱

파이썬 dataframe 인덱싱하기

  • dataframe을 인덱싱할때 loc과 iloc을 사용할 수 있다.

  • 다음과 같은 데이터 프레임을 예시로 두 가지를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd

df = pd.DataFrame({
'age' : [13,17,19,21,23],
'class' : ['math','science','english','math','science'],
'city' : ['A','B','A','C','B'],
'gender' : [ 'M', 'F', 'F', 'M', 'M'],
})

print(df)
>>>
age class city gender
0 13 math A M
1 17 science B F
2 19 english A F
3 21 math C M
4 23 science B M
  • loc을 사용하여 인덱싱하기

    • loc 인덱싱은 두 가지 사용법이 있다.

      1
      2
      3
      4
      5
      df.loc[행 인덱스값]

      or

      df.loc[행 인덱스값, 열 인덱스값]
    • 이를 이용해 둘째, 셋째 행만을 가져오면 다음과 같다.

      1
      2
      3
      4
      5
      6
      7
      ex1 = print(df.loc[1:2])

      print(ex1)
      >>>
      age class city gender
      1 17 science B F
      2 19 english A F
    • boolean 시리즈를 행을 선택하는 인덱스값으로 사용할 수 있다.

    • 이를 이용하여 A 도시에 사는 행을 선택하면 다음과 같다.

      1
      2
      3
      4
      5
      6
      7
      ex2 = df.loc[df.city == 'A']

      print(ex2)
      >>>
      age class city gender
      0 13 math A M
      2 19 english A F
    • 한 걸음 더 나가서 A 도시에 사는 사람들의 성별을 나타내는 시리즈를 알고 싶다.

    • 이럴때는 열 인덱스값을 추가해서 다음과 같이 얻어낼 수 있다.

      1
      2
      3
      4
      5
      6
      ex3 = df.loc[df.city == 'A', 'gender']

      print(ex3)
      >>>
      0 M
      2 F
    • 이렇게 열 인덱스값을 추가하여 다음과 같이 나이와 성별만을 갖는 두개의 행으로 datframe을 슬라이싱 할 수도 있다.

      1
      2
      3
      4
      5
      6
      7
      ex4 = df.loc[1:2,['age','gender']]

      print(ex4)
      >>>
      age gender
      1 17 F
      2 19 F
  • iloc을 사용하여 인덱싱하기

    • iloc은 integer-location based indexing 로서 정수(integer)를 인덱스값으로 받는다는 점이 loc과의 차이점이다.

    • loc의 마지막 예제를 iloc을 통해 나타내면 다음과 같다.

      1
      2
      3
      4
      5
      6
      7
      ex5 = df.iloc[1:3,[0,3]]

      print(ex5)
      >>>
      age gender
      1 17 F
      2 19 F
    • ex4와 ex5의 코드를 살펴보면 단순히 정수값을 받는다는 점 이외에도 차이점이 있다.

    • loc 은 행 인덱스값을 1:2 까지로 나타내면 마지막 행까지 모두 포함한 결과를 내놓지만, iloc은 행 인덱스값의 마지막 행을 포함하지 않기 때문에 1:3 으로 나타내줬다.

파이썬_dataframe_function_apply_방법_without_iterrrows

파이썬 dataframe 각 row에 function을 apply하는 방법에 대하여.

  • dataframe을 다루다보면 각 행(row)에 대해 특정 값에 대한 결과를 얻거나 과정을 수행하고 싶을 때가 있다.

  • 이럴때 가장먼저 떠오르는것은 pd.iterrows() 였다.

  • 하지만 천만건이 넘어가는 데이터를 다루려 하다보니 iterrows는 너무나 느리다는 것을 알게 되었다.

  • 이를 해결하기 위해 찾아낸 방법이 수행할 작업을 function으로 만들고 각 행에 apply하는 것이다.

  • 간단한 dataframe 을 만들어서 살펴보자.

1
2
3
4
5
6
7
8
9
10
import pandas as pd

rectangles = [
{ 'Name': "A", 'Age': 17 },
{ 'Name': "B", 'Age': 20 },
{ 'Name': "C", 'Age': 27 }
]

rectangles_df = pd.DataFrame(rectangles)
print(rectangles_df)
Name Age
A 17
B 20
C 27
  • 이름과 성별이 주어진 dataframe이 있을 때 각 행을 살펴보며 어떤 사람이 투표권을 행사할 수 있을지 판단해보려고 한다.

  • 각 행을 입력받아 Age 가 18세 이상이라면 True를 그렇지 않다면 False를 반환하는 함수를 만든뒤 datafrmae에 apply한다.

1
2
3
4
5
6
7
8
def vote(row):
if row['Age'] >= 18:
return True
else: return False

rectangles_df["vote"] = rectangles_df.apply(vote, axis=1)

print(rectangles_df)
Name Age vote
A 17 False
B 20 True
C 27 True
  • 위와 같이 각 행의 Age 를 판단해 vote라는 새로운 칼럼을 만들어낸 것을 볼 수 있다.

  • 이와같이 함수를 dataframe에 apply할 때 각 행(row)에 대하여 적용하고 싶다면 df.apply(func, axis=1) 로 axis=1 을 잊지말아야 한다.

  • 위의 예제는 행이 3개라 iterrows로 실습해도 차이를 느낄순 없을것이다. 하지만 데이터 크기가 커질수록 iterrows를 사용하는것은 자제하고 apply를 적용하는 방법을 알아야한다.

  • apply 외에도 몇가지 다른 방법을 알고 싶다면 참고해보자.

파이썬_딕셔너리___missing___메서드에_관하여.

파이썬 딕셔너리 missing 메서드에 관하여

  • 파이썬 딕셔너리를 사용할 때 찾는 key값이 없는 경우 다음과 같은 에러가 발생한다.
1
2
3
4
5
mine2 = dict()
mine2["dog"] = ["Na", "Mg"]
print(mine2["cat"])

### print >> KeyError: 'cat'
  • 이러한 KeyError 를 딕셔너리를 상속받는 자기만의 딕셔너리 클래스를 만들어서 해결할 수 있는 방법이 있다.

    • missing 메서드는 딕셔너리의 key 값을 찾고싶다는 입력을 보냈을 때 키 값이 존재하지 않을 경우 어떤 값을 return 할까를 작성할 수 있다. (정확히는 getitem 에서 key가 없을 경우 정의된 missing 을 호출한다.)

    • 다음과 같은 나만의 딕셔너리를 만들어보자.

      1
      2
      3
      class mydict(dict):
      def __missing__(self, key):
      return []
    • 딕셔너리를 상속받은 나의 mydict에 다음과 같은 데이터를 넣어보자.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      mine = mydict()

      mine["dog"] = ["H"]
      mine["tiger"] = ["He, Li"]
      mine["wolf"] = ["Be", "B", "C"]

      print(mine)

      ### print >> {'dog': ['H'], 'tiger': ['He, Li'], 'wolf': ['Be', 'B', 'C']}
    • 위와 같은 mine 딕셔너리에서 처음과 같이 “cat” 을 찾으려고 한다면 어떻게 될까?

      1
      2
      3
      print(mine["cat"])

      ### print >> []
    • KeyError 가 발생하지 않았다. 왜냐하면 나만의 딕셔너리에 정의한 missing 메서드를 통해 key값이 없다면 빈 리스트를 return하게 만들었기 때문이다!

    • 이를 이용하면 다음과 같이 데이터를 다룰 수도 있다.

      1
      2
      3
      4
      5
      mine["cat"] += ["N", "O", "F", "Ne"]

      print(mine)

      ### print >> {'dog': ['H'], 'tiger': ['He, Li'], 'wolf': ['Be', 'B', 'C'], 'cat': ['N', 'O', 'F', 'Ne']}
    • 그냥 처음과 같이 데이터를 입력하면 되는것이 아닌가? 라고 생각할 수 있지만 큐나 스텍을 이용해 순차적으로 모든 데이터를 순회하는 경우에는 이와같은 방법이 유용하게 쓰일 수 있다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×