파이썬 기초

import numpy as np
import pandas as pd

[파이썬]
Dictionary = {'-':'ee'}, del person['age']
List = ['','',]
Tupple = ('-', 'ee')
list.pop(i) #i번째 리턴 #list.pop() #마지막 리턴
list.count(2) #2가 몇개
list.split() #문자열을 공백으로 쪼개
list.split(',')
print("".join(list)) # "apple"
print("&".join(list)) # "pat&cat"

[numpy]
np.zeros(10,dtype=int)
np.ones((3,5),dtype=float)
np.arrange(0,20,2)
np.linspace(0,1,5)
np.random.random((2,2))
np.random.normal(0,1,(2,2))
np.random.randint(0,10,(2,2))
x=np.range(8).reshape(2,4)
np.concatenate([x,y],[x1,y1], axis=0)
np.concatenate(matrix,matrix, axis=0)
upper, lower = np.split(matrix,[3], axis=0)

[pandas]
#DataFrame 만들기
score=pd.DataFrame({
  '이름': ['민수','도윤',,,],
  '국어': [95, 98, ,,,],
})

df=pd.read_cvs('----.csv') #read_excel()
df["어른"]=pd.to_numeric(df["어른"])
df["날짜"]=pd.to_datetime(df["날짜"])
df=pd.concat([df1,df2], axit=0, join='inner|outer', ignore_index=True|False)
df=pd.merge(df1, df2, on='월', how='inner|outer')

df.head()
df.tail()
df[["공휴일","어른"]]
df["공휴일"].value_counts()
df.info()
df["어른"]=df["어른"].astype(int)
df["어른"]=pd.to_numeric(df["어른"])
df["년"]=df["날짜"].dt.year
df["합계"]=df["합계"].str.replace('-','0')
df["요일"]=df["요일"].map(week) #단, week={'sdf':sdf,,,} 딕셔너리
df["날씨"]=df["날씨"].apply(lambda e : '눈/비' if e=='눈' else e)
df["고령여부"]=df["노인인구비율"].apply(lambda e: "X" if e >= 0.14 else "O")
df["어른"].mean()
df.describe()
df.groupby("날씨")["총계"].mean()
df2=df.groupby("지역구분")[["10대 미만","10대"]].sum().reset_index()
df[(df["어른"]>10)&(df["아이"]<10)]
df.loc[23,"합계"]
df.loc[(df2["지역구"]=="마포구"), "혼인"]=1566
df.loc[(df["어른"]>10)&(df["아이"]<10), ["날짜","합계"]]
df.sort_values("총계"ascending=True)

pollution1=mm.sort_values("초미세먼지", ascending=False).iloc[2]["날짜"]
pollution2=pollution1.split('-')
pollution="".join(pollution2)

df.reset_index(drop=True)
df=df.drop(["유료","무료"],axis=1) # "유료","무료" 열을 삭제
df=df.rename(columns={"총계":"개수"})
df.isnull().sum()
df["어른"]=df["어른"].fillna(int(df["어른"].mean()))
df=df.dropna(subset=["어른"],ignore_index=True)
df["구"]=df["시군구"].apply(lambda e: e.split()[1])
df["날짜"]=df["년"].astype('str')+df["월"].astype('str')+df["일"].astype('str')
df["날짜"]=pd.to_datetime(df["일"], format='%y%m%d')
df["요일"]=df["날짜"].dt.dayofweek
df["요일"]=df["요일"].map({0:'월',1:'화',2:'수',,,})
df.isnull().sum()
df.iloc[0] #첫번째행, Index location
pollution=df.sort_values("먼지", ascending=False).iloc[2]["날짜"]
list_pollution=pollution.split('-')
pollution="".join(list_pollution)


[미션] 아파트 실거래 분석
#데이터 전처리
import pandas as pd
import numpy as np
df=pd.read_csv("./data/seoul_apart_2022.csv")
df.head()
df.info()

#불필요 컬럼 제거
df=df.drop(["해제사유발생일", "중개사소재지", "번지", "본번", "부번", "도로명", "거래유형"], axis=1)

#필드명 쉽게 변경
df=df.rename(columns={"전용면적(㎡)":"전용면적"})

#필드를 쉽게 분리
df["구"]=df["시군구"].apply(lambda e: e.split()[1])
df["동"]=df["시군구"].apply(lambda e: e.split()[2])
df.head()

# 면적에 따라 아파트 유형을 분류하는 함수
def category(e):
    if e<=60:
        return "소형"
    elif e<=85:
        return "중형"
    elif e<=102:
        return "중대형"
    else:
        return "대형"

df["유형"]=df["전용면적"].apply(category)
df.head()

df["계약일"]=df["계약년월"].astype('str') + df["계약일"].astype(str)
df["계약일"] = pd.to_datetime(df["계약일"], format='%Y%m%d')
df["계약일"].info()

df["계약월"]=df["계약일"].dt.month
df["계약요일"]=df["계약일"].dt.dayofweek
df["계약요일"]=df["계약요일"].map({0:'월', 1:'화', 2:'수', 3:'목', 4:'금', 5:'토', 6:'일'})
df.head()

# 주요 필드 결측치 확인
df.isnull().sum()

# "거래금액(만원)"컬럼에 결측치가 존재하는 데이터를 삭제
df.dropna(subset=["거래금액(만원)"], ignore_index=True)

df["거래금액(만원)"]=df["거래금액(만원)"].str.replace(",","") # str.replace를 활용해 콤마(,)를 아무것도 없는() 것으로 교체
df["거래금액(만원)"] = pd.to_numeric(df["거래금액(만원)"])
df["거래금액(만원)"].info()

df.sort_values("거래금액(만원)", ascending=False).head(10)

df["전용면적"] = round(df["전용면적"]/3.3, 2) # round(,2)는 소수점 두번째 자리에서 반올림
df=df.rename(columns={"전용면적":"전용면적(평)"})
df.head()

df["평당금액"]=df["거래금액(만원)"]/df["전용면적(평)"]
df["평당금액"]=round(df["평당금액"],2) # 소수점 둘째자리 반올림
df.info()

df.sort_values("평당금액", ascending=False).head(10)

df.groupby("구")[["평당금액"]].mean()
df.groupby(["구","동"])[["평당금액"]].mean().loc["서초구"].sort_values("평당금액", ascending=False)
df[df["구"]="서초구"].groupby("동")[["평당금액"]].mean()

===========================
[시각화]
[Matplotlib]
import matplotlib.pyplot as plt
plt.title("파이썬의 언어 점유율", fontsize=20)
plt.plot(xdata, ydata, label="파이썬", marker=".", linestyle="--", color="r")
plt.plot(xdata, ydata, label="bbb")
plt.xticks([2018, 2019, 2020, 2021, ])
plt.yticks([20, 21, 22, 23, ])
plt.grid(True, axis="both|x|y")
plt.legend()
plt.show()

plt.xlabel("aaa"); plt.ylabel("aaa")
plt.legend(['python', 'b', 'c'])

[Matplotlib:figure, subplot]
fig1 = plt.figure(1,figsize=(4,3)) # ID가 1인 새로운 figure 객체를 생성하고 선택합니다. 앞으로 호출하는 함수는 fig1에 적용됩니다.
plt.plot(year, python, label="Python") # 현재 선택된 figure에 선 그래프를 그립니다.
plt.title("fig1") # 현재 선택된 figure의 제목을 설정합니다.
fig2 = plt.figure(2,figsize=(4,3)) # ID가 2인 새로운 figure 객체를 생성하고 선택합니다. 앞으로 호출하는 함수는 fig2에 적용됩니다.
plt.plot(year, java, label="JAVA") # 현재 선택된 figure에 선 그래프를 그립니다.
plt.title("fig2") # 현재 선택된 figure의 제목을 설정합니다.
plt.show() # 모든 figure를 화면에 그립니다.

fig, (ax1, ax2) = plt.subplots(2, 1, constrained_layout=True) # constrained_layout=True를 전달
ax1.plot(year, python) # ax1에 파이썬 선 그래프를 그립니다.
ax1.set_title("ax1의 제목") # ax1의 제목을 설정
ax1.set_xlabel("x라벨") # ax1의 xlabel을 설정
ax2.plot(year, java) # ax2에 자바 선 그래프를 그립니다.
ax2.set_title("ax2의 제목") # ax2의 제목을 설정
plt.show() # 그래프를 표시합니다.


[Seaborn]
import matplotlib.pyplot as plt
import seaborm as sns

# 선 그래프
sns.set_style("darkgrid")
sns.lineplot(x=year, y=python, label="python")
plt.plot(year, python, label="python", linestyle="--", color="r")
plt.grid(True, axis="both|x|y")

fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True) # 1행 2열의 서브플롯을 생성합니다.
fig = sns.lineplot(x=year, y=python, label="python", ax=ax1) # seaborn을 이용해 그래프 그리기
sns.lineplot(x=year, y=java, label="java", ax=ax2) # seaborn을 이용해 그래프 그리기
plt.show()

fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True) # 1행 2열로 배치된 서브플롯을 생성
sns.lineplot(x=year,y=C,label="C",ax=ax1) # sns.lineplot()을 이용하여 ax1에 C언어의 연도별 점유율을 선 그래프로 그립니다.
sns.lineplot(x=year,y=JS,label="JS",ax=ax2) # sns.lineplot()을 이용하여 ax2에 자바스크립트의 연도별 점유율을 선 그래프로 그립니다.
plt.show()

# 막대 그래프
df_mon=df.groupby("월").mean(numeric_only=True)
plt.title("서울공원 입장객 분석")
plt.plot(df_mon["어른"], label="어른")
plt.bar(df_week["요일"], df_week["청소년"], label="어른")
plt.barh(df_week["요일"], df_week["청소년"], label="어른")
plt.show()

sns.countplot(data=df, x='계약월')
plt.show()

# 오차막대의 기본값은 95% 신뢰구간
sns.lineplot(data=df, x="월", y="어른", errorbar=None)
sns.barplot(data=df, x="월", y="어른", errorbar=None) # 데이터를 칼럼 이름으로 전달 가능
sns.barplot(data=df, x="날씨", y="어린이", errorbar=None, hue="공휴일")
plt.xtics([mon for mon in range(1,13)])

# 파이 차트
data_2019=df[df["연"]==2019][["어른", "청소년", "어린이"]].sum()
labels=data_2019.index.tolist()
data=data_2019.tolist()
plt.pie(x=data, labels=labels, autopct="%1.1f%%")
plt.legend(loc='lower left')

# 히스토그램
막대그래프는 범주형 데이터를 비교하는 데 사용되며, 막대 사이에 간격이 있습니다.
히스토그램은 연속형 데이터의 분포를 나타내는 데 사용되며, 막대 사이에 간격이 없습니다.
df_sat=df[df["요일"]=="토"]
plt.hist(df_sat["어린이"],bins=10) # bins: 구간의 수

sns.histplot(
data=df_feb
x="어린이",
hue="연"
binrange=(0,800),
bins=10,
multiple="dodge"
shrink=0.8,
)

# 박스 그래프
df_2028_apr=df[(df["연"]==201&df["월"]==4)
plt.boxplot(df_2018_apr["어린이"])
plt.boxplot([df_2018_apr["어린이"], df_2018_apr["어른"], df_2018_apr["청소년"]])
plt.xticks([1,2,3], labels=["어린이", "어른", "청소년"])
plt.title("2018년 4월의 입장객 수")

sns.botplot(data=df_2018_apr, y="어린이") # sns.boxplot()에서 박스의 중앙선은 중앙값(median)
sns.botplot(data=df_2018_apr, x="월", y="어린이")

q1=df[df["구"]=="성동구"]["평당금액"].quantile(0.25) # 25% 분위수
q3=df[df["구"]=="성동구"]["평당금액"].quantile(0.75) # 75% 분위수
boundary=(q3-q1)*1.5 # 데이터의 정상 범위
df[(df["구"]=="성동구") & (df["평당금액"]>q3+boundary)] # 성동구의 정상치의 상한을 넘는 데이터 추출

#산점도
plt.scatter(df['어른'],df['청소년'])
sns.scatterplot(data=df, x='어른', y='어린이')

plt.xlim(0,35000) # 산점도 특정 범위만 보기
plt.ylim(0,6000) # 산점도 특정 범위만 보기

df_corr=df.corr(numeric_only=True) # 상관계수 구하기

#히트맵
sns.heatmap(df_corr)

댓글 쓰기

0 댓글