본문 바로가기
수업 문제(국비 지원)/Python

[Python] 2022.12.08 (age.csv 파일에서 해당 지역의 인구비율과 전체지역의 인구 비율을 함께 그래프로 작성하기, age.csv 파일에서 해당 지역의 인구비율과 전체 인구 구조와 같은 지역 찾기, supplier_da..

by byeolsub 2023. 4. 29.

'''
1. age.csv 파일에서 해당 지역의 인구비율과 전체지역의 인구 비율을 함께  
   그래프로 작성하기
   20221208-1.png 참조   
'''

###################### 1 #######################
import numpy as np
import csv
import matplotlib.pyplot as plt
import re
f =open('data/age.csv')
data = csv.reader(f)  #기본 인코딩:cp949. 맥:기본인코딩:UTF-8
# data = csv.reader(f,encoding="cp949") #
next(data) #한줄 읽기 첫줄을 버림.
data=list(data) #리스트로 변경. IO스트림형태는 다시 읽기 못함.
name='역삼' #행정구역이름이 역삼 이름이 있는 모든 지역 조회
homelist=[]  #역삼이 있는 행정구역의 데이터들
namelist=[]  #실제 행정 구역 이름 목록
for row in data :
     if row[0].find(name) >= 0 :
        #숫자의 ,값을 제거 
        row = list(map((lambda x:x.replace(",","")),row))
        homelist.append \\
            (np.array(row[3:], dtype =int) / int(row[2]) *100) #비율%
        namelist.append(re.sub('\\(\\\\d*\\)', '', row[0])) #() 제거
        alldata = np.array(row[3:], dtype =int) / int(row[2])*100

#전체 지역의 데이터 alldata에 저장
for row in data :
    row = list(map((lambda x:x.replace(",","")),row))
    away = np.array(row[3:], dtype = int) / int(row[2]) *100
    #np.isnan : 결측값?
    if np.isnan(away).any() :  #away 데이터셋에 한개라도NA값이 존재하면 
        continue    #반복문의 처음으로 
    #vstack : 배열 행을 기준으로 합하기    
    alldata = np.vstack((alldata,away))  #행을 기준으로 연결

#연령별 연령별인구수/전체인구수 평균값
alldata = alldata.mean(axis=0)  #열별 평균
plt.style.use('ggplot')
plt.figure(figsize = (10,5), dpi=100)
plt.rc('font', family ='Malgun Gothic')
for h,n in zip(homelist,namelist) :
    plt.plot(h,label=n) 
plt.plot(alldata, label="전체")
plt.xlabel("나이")    
plt.ylabel("비율(%)")    
plt.legend()
plt.show()
plt.savefig("20221208-1.png",dpi=400,bbox_inches="tight")
###################### 2 #######################
import pandas as pd
df = pd.read_csv\\
   ("data/age.csv",encoding="cp949",thousands=",",index_col=0)
df.info()
#컬럼명 다시 설정
col_name=['총인구수','연령구간인구수']
for i in range(0,101) : #0~100
    col_name.append(str(i)+'세')
col_name    
df.columns = col_name
df.columns
#df의 모든 컬럼들을 총인구수로 나누기. 비율로 저장하기
df = df.div(df["총인구수"],axis=0)
del df["총인구수"],df["연령구간인구수"]
df.info()
df.fillna(0,inplace=True) #결측값을 0으로 치환
name = "역삼"
a = df.index.str.contains(name)
a
df2=df[a]
df2 #지정 지역 데이터
df2 *= 100  #비율%
#이름들의 () 제거.
names = list(df2.index)
names = list(map(lambda x: x[:x.find('(')],names))
df2.index = names
df2.index
#전체 인구수
tot_mean = df.mean() * 100  #비율%
tot_mean.name = "전체"
df2.T.plot() #지정된 데이터 
tot_mean.plot()
plt.legend()
plt.xlabel("나이")    
plt.ylabel("비율(%)")

 

'''
1-1. age.csv 파일에서 해당 지역의 인구비율과 
    전체 인구 구조와 같은 지역 찾기
'''
###################### 1 #######################
import numpy as np
import csv
import matplotlib.pyplot as plt
import re
f =open('data/age.csv')
data = csv.reader(f)
next(data) 
data=list(data) 
alldata = np.array([])
for row in data :
   row = list(map((lambda x:x.replace(",","")),row))
   away = np.array(row[3:], dtype = int) / int(row[2])
   if np.isnan(away).any() :  #away 데이터셋에 한개라도NA값이 존재하면 
      continue 
   if alldata.size == 0 :
      alldata = away
   else :   
    alldata = np.vstack((alldata,away))  #행을 기준으로 연결

#연령별 인구수/전체인구수 평균값
alldata = alldata.mean(axis=0) 

mn =1 
for row in data:
    row = list(map((lambda x:x.replace(",","")),row))
    away = np.array(row[3:], dtype =int) /int(row[2])
    s = np.sum((alldata - away) **2)
    if s < mn:
        mn = s
        result = away
        result_name =  row[0][:row[0].find('(')]
        

plt.style.use('ggplot')
plt.figure(figsize = (10,5), dpi=100)            
plt.rc('font', family ='Malgun Gothic')
plt.title('전체 인구 구조와 가장 비슷한 인구 구조를 가진 지역')
plt.plot(alldata, label = "전체")
plt.plot(result, label = result_name)
plt.xlabel("나이")    
plt.ylabel("비율")    
plt.legend()
plt.show()
plt.savefig("20221208-2.png",dpi=400,bbox_inches="tight")
###################### 2 #######################
import pandas as pd
df = pd.read_csv("data/age.csv",encoding="cp949",thousands=",",index_col=0)
df.info()
col_name=['총인구수','연령구간인구수']
for i in range(0,101) : #0~100
    col_name.append(str(i)+'세')
col_name    
df.columns = col_name
df.columns
df = df.div(df["총인구수"],axis=0)

del df["총인구수"],df["연령구간인구수"]
df.info()
df.fillna(0,inplace=True) #결측값을 0으로 치환
tot_mean = df.mean()
tot_mean.name="전체"
mn=1
for label,content in df.T.items() :
    s=sum((content - tot_mean) ** 2)
    if s < mn :
        mn = s;
        result = content
        name = result.name
        result.name = name[:name.find('(')]

tot_mean.plot() #지정된 데이터 
result.plot()
plt.legend()        
plt.title('전체 인구 구조와 가장 비슷한 인구 구조를 가진 지역')
plt.xlabel("나이")    
plt.ylabel("비율")

'''
2. supplier_data.csv 파일을 pandas를 이용하여 읽고 
 ["1/20/14","1/30/14"] 일자 데이터만 화면에 출력하기
 isin() 함수 이용. - pandas에 있음
'''
import pandas as pd
infile = "data/supplier_data.csv"
df = pd.read_csv(infile)
df
importdate = ["1/20/14","1/30/14"]
#isin : 주어진 값이 맞는지? boolean값으로 리턴.
df["Purchase Date"].isin(importdate)
df_inset = df.loc[df["Purchase Date"].isin(importdate),:]
df_inset
#2 강사님
import pandas as pd

infile='data/supplier_data.csv'
df = pd.read_csv(infile)
print(df);
print(df.info());
importdate = ["1/20/14","1/30/14"]
df_inset = df.loc[df["Purchase Date"].isin(importdate),:]
df_inset = df[df["Purchase Date"].isin(importdate)]
print(df_inset)

'''
3.  supplier_data.csv 파일 데이터에서 Invoice Number가 920으로
 시작하는 레코드만 화면에 출력하기
 startswith("920") 함수 이용 : 920문자열로 시작?
'''
import pandas as pd
infile = "data/supplier_data.csv"
df = pd.read_csv(infile)
df.info()
df
# Invoice Number : 문자열 함수
# startswith() : 
#     대상 문자열에서 인자의 문자열로 시작을 하게 되면 True 출력함.
df["Invoice Number"].str.startswith("920-")
df_inset = df.loc[df["Invoice Number"].str.startswith("920-"),:]
df_inset
#2 강사님
infile='data/supplier_data.csv'
df = pd.read_csv(infile)
print(df["Invoice Number"].str.startswith("920"))
df_inset = df.loc[df["Invoice Number"].str.startswith("920"),:]
df_inset = df[df["Invoice Number"].str.startswith("920")]
print(df_inset)

'''
4. sales_2013.xlsx 파일 중 Purchase Date 컬럼의 값이 
"01/24/2013"과 "01/31/2013" 인 행만 sales_2013_01.xlsx 파일로 저장하기
 isin 함수 사용.
'''
import pandas as pd
infile = "data/sales_2013.xlsx"
df = pd.read_excel(infile)
df
importdate = ["01/24/2013","01/31/2013"]
#isin : 주어진 값이 맞는지? boolean값으로 리턴.
df["Purchase Date"].isin(importdate)
df_inset = df.loc[df["Purchase Date"].isin(importdate),:]
df_inset

df_inset.to_excel("sales_2013_01.xlsx",index=False)
#2 강사님
import pandas as pd
infile="data/sales_2013.xlsx"
outfile = "data/sales_2013_01.xlsx"
df = pd.read_excel(infile,"january_2013")
print(df.info())
print(df.head())
df
#엑셀파일의 날짜형태의 데이터 
select_date = ['01/24/2013','01/31/2013']
#select_date = ['2013-01-24','2013-01-31']
df_value = df[df['Purchase Date'].isin(select_date)]
df_value
print(df_value.info())
writer = pd.ExcelWriter(outfile)
df_value.to_excel(writer,sheet_name="jan_13_output",index=False)
writer.save()

'''
5. seaborn 모듈의 titanic 데이터를 이용하여 class별  생존 인원을 출력하시오
'''
import seaborn as sns 
df = sns.load_dataset("titanic")
df.info()
df.groupby(['class']).survived.sum()
#2 강사님
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.info()
titanic.groupby(['class']).survived.sum() #생존인원수
titanic.groupby(['class'])["survived"].sum() #생존인원수
table = titanic.pivot_table\\
    (index=['survived'], columns=['class'], aggfunc='size')
table