*** 값을 여러개를 다루자!!
---> 리스트 : 정수기반 접근, 차원X
---> array : 모든 원소에 벡터연산!!
---> 인덱스 조건식 : 필터링
: 정수기반 접근, 차원O ==> 좌표
---> 1d Series, 2D DF ,,, : 정수기반 접근 + 내가 만든 것 접근 !!
: 인덱스 (**) + 값들 //dict
: array를 기본으로 --> 벡터연산 ( 인덱스 )
: 접근 FM --> 1개 (at, iat) vs 여러개(loc, iloc)
벡터연산
---> 데이터 갯수와 독립적인 알고리즘의 일반화 수식 : 그대로 코드화!!
---> 개별 원소를 다 어떻게 처리할까의 관점 X
줄 단위로 어떤 일을 할까/ 기능 중심으로 ---> 코드화!!
롤링 ( 벡터연산, apply + lambda/ f) :기능/규칙 중심 코드
03_pandas_2D_DataFrame
(어제내용이어서)
stock_price_df = pd.DataFrame(
data = [ 10000, 10300, 9900, 10500, 11000],
index = ["2024-12-01","2024-12-02","2024-12-03",
"2024-12-04","2024-12-5"]
)
stock_price_df.rename( columns ={0:"시가"},
inplace=True)
stock_price_df["종가"] = [11000,12000, 10000,13000, 12000]
stock_price_df["고가"] = [13000,15000,15000,18000,17000]
stock_price_df["저가"] = [3200,5700,5500,8500,7000]
stock_price_df
stock_price_df.apply( lambda x:x.max() - x.min(), axis=1 )
stock_price_df["Gap"]= stock_price_df.apply( lambda x:x.max() - x.min(), axis=1 )
stock_price_df
+++ To Do)
위의 apply +lambda/function 사용 안 하고 하면,,
==> 할 수는 있음!!!!
줄 단위 기능이 아니라, 직접 하나씩 내가 다 돌려서 하는 방법!!!
==> 상당히 잘 사용해야 하는 부분...
전체 데이터를 쭉~~스캔하면서 차이들을 계산하고, 기록하고,
stock_price_df["GapFor"]=0
stock_price_df
---> DF에서 가로줄을 돌아가면서 for
i번쨰 날의 4개의 가격을 수집해서
==> 최고값을 찾고, 최저값을 찾아서 : 차이계산!!!
==> GapFor 컬럼의 i번째 위치 : 값을 기록
했던 여러가지들 리뷰 : for, DF-->값 접근
# 태생적인 정수인덱스 중심으로 코드를 짜겠다!!
for i in range(len(stock_price_df)):
print(i)
0
1
2
3
4
# 내가 만든 가로줄 인덱스로 할래..
for i in stock_price_df.index:
print(i)
2024-12-01
2024-12-02
2024-12-03
2024-12-04
2024-12-5
# 기본적인 접근 방식!!!
==> 모든 "가로줄"을 돌아가면서 : for --> 정수/내가만드것
==> i번째 가로줄에서 무엇을 할지!!!
1) 가로 i번째, 세로(시/종/고/저) : 4개 값 -->loc/iloc
2) 1번의 4개 값의 max
3) 1번의 4개 값의 min
4) max-min 계산
* 5) 4번의 계산결과를 기록
(가로i번째, 세로:gapGor위치) : at/iat
// loc[ , ]: 행/열 선택, iloc[ , ]: 위치 기반 선택, max(), min(), at : 특정 위치 값 접근, iat : 위치 기반 특정 값 접근)
# sol1) 태생적인 정수 인덱스 중심!!!
# stock_price_df.shape[0]
for i in range( len(stock_price_df) ):
# i번째 가로줄에서 필요한 4개 값을 가져오기!!
data = stock_price_df.iloc[i,:4] # -->Series
# max-min 계산
temp = data.max() - data.min()
# i번째 가로줄, 세로줄 GapFor 위치(5) : --> at/iat
stock_price_df.iat[i,5] = temp
print("Done!!")
Done!!
# sol1) 수정 ==> 정수인덱스를 사용을 하는데,,규칙화!!!get_loc
cols = ["시가","고가","종가","저가"] # *******
# ---> 4개 컬럼의 세로줄 정수 인덱스 : get_loc
cols_idx = [ stock_price_df.columns.get_loc(c) for c in cols]
# 기록할 새로운 컬럼
new_col_name = "GapFor2" # **********
stock_price_df[new_col_name] = 0
gap2_idx = stock_price_df.columns.get_loc(new_col_name)
for i in range( len(stock_price_df) ):
# i번째 가로줄에서 필요한 4개 값을 가져오기!!!
data = stock_price_df.iloc[i, cols_idx] # --> Series
# max-min 계산
temp = data.max() - data.min()
# i번째 가로줄, 세로줄 GapFor 위치(5) : --> at/iat
stock_price_df.iat[i, gap2_idx] = temp
stock_price_df
# sol2) 내가 만든 인덱스로 돌리자!!!!
===> 가로줄 날짜 중심으로 돌리자!!!
cols = ["시가","고가","종가","저가"] # *******
new_col_name = "GapFor3"
stock_price_df[new_col_name] = 0
for i in stock_price_df.index:
# 내가 만든 i번째 날짜에 대해서,,,,, : 내가 만든것들로...
data = stock_price_df.loc[ i, cols ]
temp = data.max() - data.min()
stock_price_df.at[i, new_col_name] = temp
stock_price_df
2024-12-01
2024-12-02
2024-12-03
2024-12-04
2024-12-5
************************************************************
**** 줄 단위 처리 : apply사용법
: 직접 롤링방법 --> 태생적 정수인덱스
--> 내가 만든거 중심
--> + enumerate(정수,내가만든것)
************************************************************
===> 데이터 전처리에 핵심!!!!!!
# ex) 위의 DF에서 날짜별로 시가/종가/고가/저가의
평균가격을 계산해보세요!!!!
==> apply + lambda
==> 코드 에러 이외에 진짜 평균맞는지 더블체크!!!!
stock_price_df.apply(lambda x : x.mean(), axis=1)
// 에러가 발생하지 않았지만 4개의 평균이 아닌 7개의 평균으로 원하는 값이 안나옴
// 더블 체크가 필수인 이유!!
stock_price_df.iloc[:, :4].apply(lambda x: x.mean(), axis=1)
# 간단하게 데이터를 볼 때
# ==> 수치형 컬럼에 한해서 보여줌
stock_price_df.describe()
# corr : 컬럼의 속성들의 선형성에 대한 계량화 지표
==> 상관계수
==> 유사 성능에서는 변수/특징이 심플한 모델이 best!!!
종속성에 대한 부분을 처리할 때
stock_price_df.corr()
stock_price_df.info()
# ML --> 내가 어떤 컬럼들을 수치화를 해야할지 선택(인코딩)
# --> 결측치 비율 체크!!!! 단, "", None 빠질 수도 있음...
# 중요!!!!!!
---> 가로줄에 대한 인덱스 : 수집한 개별 샘플에 대한 id/유니크
: 유니크한 값들에 대한 체크!!!!
panda는 기본적으로 이중인덱스를 허용을 함!!!!
==> 동일한 인덱스가 존재할 수 있음!!!!!!!!!
len(stock_price_df.index.unique()) == len(stock_price_df)
# ---> 가로줄 인덱스는 유니크하!!!
# ---> 가로줄에 중복된 인덱스는 없음!!!!
# 왜 중요할까????
# ===> 이중 인덱스가 있다면,,,,조회했을 때 1줄 여러줄 : DF
True
stock_price_df.loc["2024-12-02",:] # Series
t = pd.concat([stock_price_df,stock_price_df])
t
t.loc["2024-12-02",:] # DF
04_json
# JSON : 서로 다른 프로그램/ 서비스/ 어플리케이션 사이에
"데이터를 주고 받을 때 사용하는 양식 중 하나!!"
==> 어떤 값은 뭐에요~~~~스타일로 정보들을 구성을 함!!!
==> 파이썬의 리스트, dict 상당히 유사함!!!
리스트 < ㅊ,ㅊ,ㅊ,ㅊ,ㅊ>
[ㅌ,ㅌ,ㅌ,ㅌ,ㅌ]
dict < z.a, z.f,,,,>
<z;a, z;aaa, ....>
{z:a, z:n,,,,,,}
실제 JSON 데이터 : 문자열로 작성된 text 데이터!!!!!
===> 문자열로 작성하는 양식이 파이썬의 리시트, dict 대응!!!!
===> re정규식 활용해서 정보들을 추출!!!!
json룰로 작성된 정보들을 파이썬의 자료형(리스트,dict) 자동 변환!!
json 패키지를 배포( anaconda, colba 기본 패키지)
===> 정규식을 안 써도,,,파이썬의 리스트/dict로 값을 접근할 수 있다!!!!
import json
json_data1= """{
"color":"red",
"value":"$100"
}"""
json_data1
'{\n "color":"red",\n "value":"$100"\n}'
json_data1["color"]
TypeError: string indices must be integers
result = json.loads( json_data1 )
result
{'color': 'red', 'value': '$100'}
type(result)
dict
type(json_data1)
str
result["color"]
'red'
result["value"]
'$100'
json_data2 = """{
"id" : "0001",
"type" : "donut",
"name" : "Cake",
"ppu" : 0.55,
"groups" : {
"group" : [
{"id":"1001", "type":"Regular"},
{"id":"1002", "type":"Choco"},
{"id":"1003", "type":"Cream"}
]
},
"topping" : [
{"id":"5001", "type":"None"},
{"id":"5002", "type":"Sugar"},
{"id":"5003", "type":"Choco"}
]
}
"""
json_data2
{\n "id" : "0001",\n "type" : "donut",\n "name" : "Cake",\n "ppu" : 0.55,\n "groups" : {\n "group" : [\n {"id":"1001", "type":"Regular"},\n {"id":"1002", "type":"Choco"},\n {"id":"1003", "type":"Cream"}\n ]\n },\n "topping" : [\n {"id":"5001", "type":"None"},\n {"id":"5002", "type":"Sugar"},\n {"id":"5003", "type":"Choco"}\n ]\n}\n
data = json.loads( json_data2)
data
# ==> json양식으로 작성된 문자열을
# 파이썬의 자료형으로 변환을 해준다 : json패키지!!!
# ===> 내가 원하는 값에 대한 접근 : 정규식X
# 키값, 정수인덱스 주어진 대로 활용하면서 접근!!!!!!
{'id': '0001',
'type': 'donut',
'name': 'Cake',
'ppu': 0.55,
'groups': {'group': [{'id': '1001', 'type': 'Regular'},
{'id': '1002', 'type': 'Choco'},
{'id': '1003', 'type': 'Cream'}]},
'topping': [{'id': '5001', 'type': 'None'},
{'id': '5002', 'type': 'Sugar'},
{'id': '5003', 'type': 'Choco'}]}
type(data)
dict
data.keys()
dict_keys(['id', 'type', 'name', 'ppu', 'groups', 'topping'])
# ex) 받은 데이터에서 id값은 무엇인가요?
data["id"]
'0001'
# ex) 받은 데이터 중에서 topping 항목 중에서
처음 토핑 항목의 id 값은 얼마인가요?
data["topping"][0]["id"]
'5001'
# ex) 받은 데이터 중에서 2번쨰 group의 type은 무엇인가요?
data["groups"]["group"][1]["type"]
'Choco'
# JSON으로 되어 있는 정보를 파이썬으로 접근하기 위해서는
==> 순차적으로 한 depth 접근해야 함!!!
==> 하나씩 보시면서 순차적으로 접근을 하면 됨!!!!정수/key
그냥 눈에 보이는대로, 하나씩 처리하면 됨!!!!!
'ASAC 빅데이터 분석가 7기 > ASAC 일일 기록' 카테고리의 다른 글
ASAC 빅데이터 분석가 과정 12일차 - 1 (24.12.19) (2) | 2024.12.19 |
---|---|
ASAC 빅데이터 분석가 과정 11일차 - 2 (24.12.18) (2) | 2024.12.18 |
ASAC 빅데이터 분석가 과정 10일차 - 3 (24.12.17) (0) | 2024.12.17 |
ASAC 빅데이터 분석가 과정 10일차 - 2 (24.12.17) (0) | 2024.12.17 |
ASAC 빅데이터 분석가 과정 10일차 - 1 (24.12.17) (1) | 2024.12.17 |