2025-04-02

장상희·2025년 4월 2일

파이썬

목록 보기
7/31
post-thumbnail

2025-04-02

시리즈의 수정은 loc 혹은 iloc로 특저 위치에 접한 뒤 변경할 값을 넣어주면 된다

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

s.loc['메로나'] = 500          # 값 수정
print(s)

앞서 배운 iloc 연산을 사용하거나 [ ] 기호를 사용해서 메로나의 가격을 수정할 수 있습니다.

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

s.iloc[0] = 500            # iloc 연산 사용
s['메로나'] = 500          # [ ] 기호 사용
print(s)

#메로나      500
#구구콘     2000
#하겐다즈    3000
#dtype: int64

시리즈에서 값의 삭제는 drop 메서드를 사용합니다. drop 메서드의 인자로 인덱스를 넣어주면 해당 인덱스의 값이 삭제됩니다. 참고로 drop 메서드는 시리즈의 인덱스를 사용해야 합니다. 라인 2의 코드처럼 행 번호를 넘겨주면 drop 메서드에서 에러를 발생합니다.

print(s.drop('메로나'))
print(s.drop(0))#인덱스 명칭을 똑바로 지정해줘야 한다         # 에러

drop 메서드는 시리즈의 원본 데이터를 제거하지 않고 새로운 시리즈 객체를 반환하는 것에 유의해야 합니다. 이는 실수로 원본 데이터를 수정해버리는 것을 방지하기 위한 일종의 안전장치입니다. 다음과 같이 drop 메서드를 호출한 결과를 다시 변수에 바인딩하도록 코드를 작성해야 합니다.

data = [1000, 2000, 3000]
index = ["메로나", "구구콘", "하겐다즈"]
s = Series(data=data, index=index)

s = s.drop('메로나')#메로나의 인덱스 값이 삭제되버렸다
#drop 메서드를 호출한 결과를 다시 변수에 바인딩하도록 코드를 작성해야한다
print(s)

#구구콘     2000
#하겐다즈    3000
#dtype: int64

시리즈 연산

시리즈는 넘파이와 동일하게 브로드캐스팅이 적용되며, 같은 인덱스를 갖는 데이터끼리 연산을 수행합니다

철수 = Series([10, 20, 30], index=['NAVER', 'SKT', 'KT'])#철수의 주식 종목 보유 현황을 시리즈 객체로 표현합니다.
영희 = Series([10, 30, 20], index=['SKT', 'KT', 'NAVER'])#영희의 주식 종목 보유 현황을 시리즈 객체로 표현합니다.
가족 = 철수 + 영희#두 시리즈 객체를 더합니다.
#같은 이름의 인덱스의 시리즈를 더해줍니다
print(가족)#더한 두 객체의 시리즈와 인덱스를 출력합니다
#KT       60
#NAVER    30
#SKT      30
#dtype: int64

고가와 저가의 차분값

high = Series([42800, 42700, 42050, 42950, 43000])
low = Series([42150, 42150, 41300, 42150, 42350])

diff = high - low#low와 hight에 들어있는 시리즈들을 빼줍니다 그후 diff에 바인딩해줍니다
print(diff)
#인덱스 명은 정하지 않았기 때문에 0부터 출력합니다
#0    650
#1    550
#2    750
#3    800
#4    650
#dtype: int64

시리즈에서 사용할 수 있습니다. 넘파이에는 max 메서드가 있다

시리즈에서 사용할 수 있습니다. 넘파이에는 min 메서드가 있다

high = Series([42800, 42700, 42050, 42950, 43000])
low = Series([42150, 42150, 41300, 42150, 42350])

diff = high - low
print(diff.max())
print(diff.min())

#800
#550
date = ["6/1", "6/2", "6/3", "6/4", "6/5"]
high = Series([42800, 42700, 42050, 42950, 43000], index=date)# 인덱스의 날짜를 넣어준다
low = Series([42150, 42150, 41300, 42150, 42350] , index=date)# 날자 데이터를 넣을때는 두 곳 모두 넣어줘야 한다
diff = high - low
print(diff)
#6/1    650
#6/2    550
#6/3    750
#6/4    800
#6/5    650
#dtype: int64

시리즈는 자료구조이므로 반복문을 사용할 수 있습니다. 반복문으로 값에 하나씩 접근하면서, 비교를 통해 최댓값과 인덱스를 저장해 놓습니다. 반복문이 끝나면 최댓값과 인덱스를 알 수 있으니 index를 하나 선택합니다.

date = ["6/1", "6/2", "6/3", "6/4", "6/5"]
high = Series([42800, 42700, 42050, 42950, 43000], index=date)
low = Series([42150, 42150, 41300, 42150, 42350] , index=date)
diff = high - low

max_idx = 0
max_val = 0
 
for i in range(len(diff)):#diff에 모든 값을 세어준다 
    if diff[i] > max_val:#max_val 값이 diff[i]번째의 값을 비교하고 i번째 값이 더 크다면 
         max_val = diff[i]#그 값을 max_val을 넣어준다
         max_idx = i#몇번째 인지 알려줌

print(max_idx)
print(diff.index[max_idx])

#3
#6/4

위에 있는 for문은 idmax() 메서드의 원리다(idxmin()도 이와 같다)

date = ["6/1", "6/2", "6/3", "6/4", "6/5"]
high = Series([42800, 42700, 42050, 42950, 43000], index=date)
low = Series([42150, 42150, 41300, 42150, 42350] , index=date)
diff = high - low

max_idx = 0
max_val = 0
 
print(diff.idxmax())#가장 높은 값의 인덱스를 출력한다

#6/4

저가에 사서 고가에 팔았을 경우 수익률 계산하기(수수료 고려 안함(나누기))

date = ["6/1", "6/2", "6/3", "6/4", "6/5"]
high = Series([42800, 42700, 42050, 42950, 43000], index=date)
low = Series([42150, 42150, 41300, 42150, 42350] , index=date)
profit = high / low
print(profit)

#6/1    1.015421
#6/2    1.013049
#6/3    1.018160
#6/4    1.018980
#6/5    1.015348
#dtype: float64

누적 수익률은 모든 수익률을 누적해서 곱함으로써 계산할 수 있습니다. 반복문을 사용할 수도 있지만 판다스가 제공하는 cumprod 메서드를 사용하면 한 번에 결과를 얻을 수 있습니다.

date = ["6/1", "6/2", "6/3", "6/4", "6/5"]
high = Series([42800, 42700, 42050, 42950, 43000], index=date)
low = Series([42150, 42150, 41300, 42150, 42350] , index=date)
profit = high / low
print( profit.cumprod( ) )#cumprod 메서드를 사용하면 한 번에 결과를 얻을 수 있습니다.
#누적해서 곱함
#6/1    1.015421
#6/2    1.028671
#6/3    1.047351
#6/4    1.067230
#6/5    1.083610
#dtype: float64

5개의 종목에 대한 업종 데이터를 시리즈 객체로 표현한 겁니다. 5개의 종목에서 중복을 제거하고 업종 리스트를 가져오고 싶을 때가 있습니다. 이 경우 unique 메서드를 사용합니다.

unique 메서드는 다음과 같이 시리즈의 values 중 유일한 값들을 ndarray로 반환합니다.

data = {
    "삼성전자": "전기,전자",
    "LG전자": "전기,전자",
    "현대차": "운수장비",
    "NAVER": "서비스업",
    "카카오": "서비스업"
}
s = Series(data)
print(s.unique())#중복을 제거하고 업종 리스트 #unique

시리즈 안에 업종이 몇 번 존재하는지 횟수를 세어봅시다. value_counts 메서드를 사용하면 값의 출현 빈도를 계산해서 시리즈 객체로 반환합니다.

data = {
    "삼성전자": "전기,전자",
    "LG전자": "전기,전자",
    "현대차": "운수장비",
    "NAVER": "서비스업",
    "카카오": "서비스업"
}
s = Series(data)
s.value_counts()#밸류와 시리즈만 카운트된다

#count
#전기,전자	2
#서비스업	2
#운수장비	1

#dtype: int64
profile
프로그래머 꿈나무

0개의 댓글