ASAC 빅데이터 분석가 7기/ASAC 일일 기록

ASAC 빅데이터 분석가 과정 11일차 - 1 (24.12.18)

junslee 2024. 12. 18. 09:28

*** 값을 여러개를 다루자!!

---> 리스트 : 정수기반 접근, 차원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
       그냥 눈에 보이는대로, 하나씩 처리하면 됨!!!!!