EEE/파이썬

[파이썬 시작만 N번째?] 실무에서 사용할 능력 키우기_(3) : Pandas 활용

이도비오 2024. 3. 28. 12:28
반응형

[9일차(4일차)]

* df 인덱스는 0부터 시작된다. 

* df의 열 중 하나만 떼오면 Series가 된다

* 정렬하면 뒤죽박죽 -> df.reset_index(drop=True)   *기본값:drop=F

* 날짜표현 : pd.to_datetime() : 기본은 2024-01-01

        -> pd.to_datetime(%Y%m%d) : 20240101

* df.index : 자체로 0열인 index를 array로 뽑을 수 있다!!!!!

  —>list_불라 = df.index[0]

  —> x = month_count[product_name].index 해도 

    >>> m_c df의 인덱스(제일 왼쪽 세로열) 나옴

*** index가 숫자만은 아니다, 여러 변수들일수도 있음

 

<데이터 시각화>

* 이론

- (16pg) 데이터 변수유형

- (28pg) 변수에 따른 시각화 방법분류

- (34pg) Code기반/NoCode기반

- (36pg) 용도별 차트 분류

- (51pg) 시각화 유의사항

 

<각 기본문법 & 선 - 막대 그래프>

Matplotlib —> plt

* import matplotlib.pyplot as plt     *그리드 : plt.grid(True, axis="x")

* plt.plot( x데, y데, label=“-”, marker=“*”, linestyle=“—”,color=“”)     

      *n번쓰면  한 그래프에 n번 표시

* 그래프 이름쓰기/라벨링 :   plt.title(“-”)     /    plt.xlabel(“-”)  

 

* 종이 여러개 쓰기 : figure 2개 씀

 

* 종이1장에 그래프 2개 : figure 1개 / subplot 2개

* subplot                                                       *최적간격 자동조절

  —> fig, (ax1, ax2) = plt.subplots(2, 1, constrained_layout=True)

+ ax1.plot(year, python)                   # 현재 선택된 figure에 선 그래프

+ ax2.plot(year, java)                       # 현재 선택된 figure에 선 그래프

  *원래 plt.plot인데 ax1, ax2 선언해뒀으니 써야지

+ plt.show()                                     # 그래프를 표시

▷ 라벨링&이름                              *ax1은 그래프 이름

+ ax1.plot(year, python)                                 # ax1에 파이썬 선 그래프

+ ax1.set_title("파이썬의 점유율")       # ax1의 제목을 "파이썬의 점유율"

+ ax1.set_xlabel("연도”, fontsize=15)       # ax1의 xlabel을 "연도"로 설정

+ ax1.set_ylabel("점유율")                   # ax1의 ylabel을 "점유율"로 설정

+ plt.show()                                       # 그래프를 표시

 눈금격자 & 특정범위

+ plt.xticks( [2018, 2019, 2020, 2021, 2022] )

+ plt.xticks( [mon for mon in range(1, 13)] )   —> 1~12까지

+ plt.ylim(0, 6000)  

+ plt.xlim(0, 35000)

 

Seaborn —> sns                                           ※ 훨씬 깔끔 / matplot 기반이라 matplot호출필요

* import matplotlib.pyplot as plt    *같이 쓴다

* import seaborn as sns

 

* x축에 ~~, y축에 ~~ 등 각각 넣어줘야 함!

  —> sns.lineplot(x = year, y = python, label=“-”)

* 내장테마 5가지 : sns.set_style(“—”) 

* seaborn 사용해도, 옵션조절은 matplot으로 설정  <—눈금격자는 다 plt다

 

* subplot

fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True)  

fig = sns.lineplot(x=year, y=python, label="python", ax=ax1)  sns.lineplot(x=year, y=java, label="java", ax=ax2)

 

 

선그래프 plt.plot  sns.lineplot / 막대그래프 plt.bar   sns.barplot

*  matplot으로 그래프 그리려면 데이터 묶어야 함

  —> 데이터 묶기 : gb_mon = df.groupby(“월”)

* plt.plot(df_mon["어른"], label="어른")

  —> x, y데이터가 df[“-”]로 들어간다

 

* seaborn으로 그래프 그리려면 묶을 필요 없이 data 매개변수에 대입

  > sns.lineplot(data=df, x=“월”, y=“어른”, errorbar=None, hue=“”)

* hue : 비교해서 보고 싶은 기준값

* error bar : 기본값은 95% 신뢰구간의 범위 표시함

———

* 막대그래프도 plt.bar  /  sns.barplot  만 달라지지 똑같다!

* plt.barh( )     : 가로 막대그래프

 

그래프 그릴때 대상데이터를 추출해서 새로 df 만들어 두고 시작 soso

  —> df_2019 = df[df[“연”]==2019][[“열”, ”-”, “-”]].sum()

  —> df_sat = df[df[“요일”]==“토”]

 

* 문제유형은 4일차 오전, 오후 연습문제 참고 * 

 

<파이차트>                      *plt만 있음

파이차트 만들기 위해 각각의 레이블과 값 가져옴

  —> labels = df_2019.index.tolist()

  —> data = df_2019.tolist()

* plt.pie(x=data, labels=labels, autopct="%1.1f%%")

* plt.show()

 

<히스토그램>   : 특정구간의 빈도 표현

* plt.hist(df_sat["어린이"], bins=10, histtype="bar")

* plt.title("bar")

* plt.figure()

 

* todo1 = sns.histplot(data=df_april2017, x="어른", bins=20)

* sns.histplot(

    data=df_feb,

    x="어린이",

    hue="연",

    binrange=(0, 800),

    bins=10,

    multiple="dodge", : 겹치지 않게 (쌓아올린 히스토그램인 경우)

    shrink=0.8, : 막대의 너비조절

)

 

<박스그래프>    : 데이터 분포 보여줌

* 여러개 그리기

  —> plt.boxplot( [df_apr["어린이"], df_apr["어른"], df_apr["청소년"]] )

* plt.xticks( [1, 2, 3], labels=["어린이", "어른", "청소년"] )

* plt.title("2018년 4월의 입장객 수")

* plt.show()

&

* sns.boxplot(data=df_apr, y="어린이")

* sns.boxplot(data=df_2018, x="월", y="어린이")

 

<산점도>      : 두 변수간 관계

* plt.scatter(df['어른'], df['청소년'])

&

* sns.scatterplot(data=df, x='어른', y='어린이')

* sns.regplot : 상관도를 선까지 그려줌

  —> sns.regplot( x_data, y_data, line_kws={“color” : “red”} )

 

<히트맵>      

* 피어슨 상관계수가 (+1) , (-1) 에 가까울수록 상관관계가 있다

* df_corr = df.corr(numeric_only=True)

* sns.heatmap(df_corr, , annot=True) *annot : 각 칸에 상관계수 뜸


[10일차(5일차)]

— 머신러닝 데이터 프로젝트 —

<이론>

* 데이터 수집 -> EDA: 탐색적 데이터 분석과정 -> …

* 과적합(과소, 과대) : 머신러닝의 가장 큰 문제

  —> …k-Fold : 일부만 따지는 비소모적 교차검증 중 하나, 과적합 해결책

  —> k개 데이터 fold 세트 만들어 k번만큼 각 fold에 학습/검증

* 과적합 : 모델이 학습용데이터에만 최적화되어 있어 

      검증데이터로 평가시 성능이 잘 나오지 않는 것을 말 함

* 결측치 처리(즉, 데이터 정제)방법

  : 삭제-( 전체(열 제거), 부분(행 제거) ) / 대체-(일괄, 유사유형)

  : 전체삭제(결측값이 발생한 변수 삭제)

  : 부분삭제(결측값 발생한 관측치의 인덱스 에 해당된 데이터 모두 삭제)

* 연속형 데이터-> boxplot , 이산형 데이터-> histogram 사용이 굿 

* 특성엔지니어링 : 스케일링, 바이닝(연속->범주), 더미(범주->연속)

  —+ 새로운 관측치를 추가하지는 X

 

***추가설명 : df.drop( [“Cab”], axis=1, inplace = True) :값 재정의 필요X

  —> 전체삭제 됨 (axis=1)   /   df.dropna() : 부분삭제

  —> df.fillna() : 결측치에 대해 일괄대체

 

<활용>

* titanic['Survived'].value_counts().plot(kind='bar')

* titanic['Age'] = titanic['Age'].fillna(0) <—age데이터 중 결측치 0으로

  —> 아예 제거는= titanic['Age’].dropna()

* plt.hist(titanic['Age'], bins = 10)  <— 구간을 10개로 나눠 보여줌

* Reviews기준으로 내림차순 정렬한 뒤, 상위 30개 출력

  —> print( df.sort_values(“Reviews”, ascending=False).iloc[:30] )

* feature = dataset[ :  ,  :3]  : 모든 행과 0~2까지의 열 만큼의 df의미

* 한개의 칼럼(열)만 추출하면 Series 데이터로 저장됨

* 상위, 하위 범주 출력 & 합

  —> quiz_3 = day_df.groupby("Product")["Quantity Ordered"]

.count().sort_values(ascending=False).head(1)

.head(3).sum()

.tail(4).sum()

.count().sort_values(ascending=False)[-3:].sum()


[11일차(1일차)]

* Chat GPT를 이용하여 데이터 분석 및 처리를 요청하고, 코드를 받는다.

 

<Langchain을 활용한 데이터 정제>

* LangChain Agent 개설

* LangChain Agent : pandas의 dataframe을 자동으로 분석

* Agent : 생성 AI를 활용해서, 생각과 행동을 통해 의사결정을 주체적으로 

  수행하는 AI 비서의 역할을 수행합니다.

* Agent 생각하는 과정 다 보지 않고 최종결과만 원한다면

  —> agent = create_pandas_dataframe_agent(ChatOpenAI(temperature=0, model='gpt-3.5-turbo'), df, verbose=True,

                                                                                  agent_type=AgentType.OPENAI_FUNCTIONS,) 

 

* agent.run(소스데이터, “질문”)

* qa_bot(소스데이터, “질문”)      <— 직접 만든 함수

 

open ai api key

  : 유료 사용가능

 

google_search_key    https://serpapi.com/dashboard

  : 에서 얻어올 수 있다.

 

반응형