관리 메뉴

HAMA 블로그

심심할때 보는 파이썬 데이터 다루기 본문

Python

심심할때 보는 파이썬 데이터 다루기

[하마] 이승현 (wowlsh93@gmail.com) 2017. 4. 12. 10:13


다양한 데이터 다루기 


0. 다양한 리스트 다루기 

# 첫번째 값 리턴
a = [1, 2, 3]
print a[0]

# 마지막값 리턴
print a[-1]

# 리스트안의 리스트에서 값 가져오기
b = [1, 2, 3, ['a', 'b', 'c']]
print b[3][0] # 'a' 리턴

# 리스트 슬라이싱 하기
print b[0:2] # [1,2] 리턴

#리스트 삭제
c = [1, 2, 3, 4, 5, 6, 7]
c.pop(0) # 첫번째 값 삭제
del c[1] # 두번째값 삭제
c.remove(4) # 리스트에서 첫번째로 나오는 4 삭제
c=[] #전체삭제

# 리스트 정렬
d = [1, 9, 3, 2, 5, 14, 7,4]
d.sort()

# 리스트 값 삽입
d.insert(0,4) # 0번째 위치에 4 삽입

# 리스트에서 특정 요소의 갯수 세기
d.count(4) # 리스트에 None 이 없다면 if None not in shaplet:


1. 리스트에서 같은 값의 카운트 세기 

import collection.Counter

c = Counter("문재인", "문재인", "안희정", "안희정", "안철수","이재명", "이재명")
c["문재인"] 2


2. 리스트에서 특정 값만 솎아내기 

 a = [1,2,3,4,5] 중에서 홀수만 골라내기  

람다식을 이용하면 아래와 같이 됩니다.

filter (lambda x : x % 2 , a)   

근데 이것을 List comprehension 으로 표현하면

 [x for x in a if x % 2] 


3. 두개 리스트의 요소를 곱하기 

일반

[a * b for a, b in zip(lista, listb)]

numpy 이용 

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([2, 3, 4, 5])
a * b
array([2, 6, 12, 20])


4. 리스트에서 index 와 값을 뽑아내서 순회하기 (enumerate 이용) 

[i for i, x in enumerate(testlist) if x == 1]


5. 리스트에서 몇개씩 가져오기 ( 예를들어 48개의 데이터에서 24개씩 가져오기) 

def group(iterator, count):
itr = iter(iterator)
while True:
yield [itr.next() for i in range(count)]

for item in group(watts,24):

이렇게 사용하면 watts 라는 리스트에 있는 데이터에서 24개씩 가져온다. 


6. reduce 와  operator.add 를 이용해서 합구하기 


import operator

def sum(numbers):
return reduce(operator.add, numbers, 0)


7. min 함수의 강력함 ( 데이터를 비슷한 것 끼리 3등분하기) 

import random

k = 3
inputs = [1,5,6,50,55,60,100,111,132]
means = random.sample(inputs, k)

def classify_1dim(input):
return min(range(k), key=lambda i: abs(input - means[i]))

new_assignments = map(classify_1dim, inputs)

결과: [0,0,0,1,1,1,2,2,2] 

설명 :
map(classify_1dim, inputs) 는 inputs 리스트에서 하나씩 classify_1dim 에 적용시킨다.
min (range(k), key=lambda i : abs(input - means[i])) 은 들어온 input 를 means[0], means[1], means[2] 와 각각의 차를 구한 후에 가장 낮은 숫자에 대한 인덱스를 리턴해준다.

결국 new_assignments 에는 inputs 리스트값들이 가장 가까운  means[0], means[1], means[2]  중 하나로 매핑되어 진다.


시나리오가 있는 데이터 다루기

@ 아래와 같은 주식 데이터가 있다고 하자.  / 종가 / 날짜 / 심볼로 이루어져있다.

symbol date closing_price
AAPL 2015-01-23 112.98
AAPL 2015-01-22 112.4
AAPL 2015-01-21 109.55
AAPL 2015-01-20 108.72
AAPL 2015-01-16 105.99
AAPL 2015-01-15 106.82
AAPL 2015-01-14 109.8
..


 심볼이 'AAPL' 인 것들 중에서  가장 높은 가격 산출

max_aapl_price = max(row["closing_price"]
for row in data if row["symbol"] == "AAPL")

data 컬렉션에서 값(row) 을 하나 가져와서  심볼이 "AAPL" 인것들 중에서 값이 가장 높은것


심볼별로 데이터 그룹화

from collections import defaultdict
# group rows by symbol
by_symbol = defaultdict(list)

for row in data:
by_symbol[row["symbol"]].append(row)

심볼이 같은것 끼리 묶어 줍니다. 즉 { "AAPL" : [ ... , ... ]  , "BBPL" : [ ..., ... ]  .......} 이런식으로요~


그룹별 가장 높은 가격 

max_price_by_symbol = {symbol: max(row["closing_price"] for row in grouped_rows)
for symbol, grouped_rows in by_symbol.iteritems()}

위에서 심볼별 리스트들을 가져와서 각각에 대한 가장 높은 값을 구해줍니다.

결과는 {'AAPL': 119.0, 'FB': 38.23, 'MSFT': 22.78}


특정필드를 리스트로 추출  

def picker(field_name):
return lambda row: row[field_name]

def pluck(field_name, rows):
return map(picker(field_name), rows)

picker 는 특정 필드의 값을 리턴해주는 함수를 반환합니다.
pluck 는 rows 들 중 특정 필드의 값 만으로 리스트를 만들어 줍니다.  
즉 field_name 에 "closing_price" 를 입력해주면 , 그 값들로만 이루어진 리스트를 리턴함. 


데이터를 그룹화시켜서 모으고 , value_transform 공식에 의해서 변경시킨다. 

def group_by(grouper, rows, value_transform=None):
grouped = defaultdict(list)
for row in rows:
grouped[grouper(row)].append(row)
if value_transform is None:
return grouped
else:
return {key: value_transform(rows)
for key, rows in grouped.iteritems()}

심볼이라든지 어떤 특정 것을 구분하여 그룹화시키고 , 각 그룹을 value_transform 에 의해 계산합니다.
value_transform  가 그룹의 max 값을 찾는 것이라면 {"AAPL" : 1030 , "BBPL" : 2000 ..} 뭐 이런식으로 결과가 나오겠지요.


Comments