728x90
반응형
금요일[와 벌써 금요일이라고..? 이번 주가 어떻게 지나간거지..]
1. 라이브러리
2. 코드
3. 후기
1. 라이브러리
pandas -> 머신러닝 활용여부를 판단 = 데이터를 정제하는 역할
텐서플로도 머신러닝에 활용되는 것이지만 다른 라이브러리와 같이 import해서 사용하는 것, ..
2. 코드
import numpy as np
a = numpy.random.randint(1, 10, (2, 3))
b = np.random.randint(1, 10, (2, 3))
print(a)
print(b)
print( '-' *10)
print(a+b)
print('-' * 10)
print(a-b)
print('-' * 10)
print(a*b)
print('-' * 10)
print(a / b)
print('-' * 10)
print(a * 5)
print('-' * 10)
print(a > b)
[[7 8 6]
[8 1 5]]
[[3 8 5]
[1 1 3]]
----------
[[10 16 11]
[ 9 2 8]]
----------
[[4 0 1]
[7 0 2]]
----------
[[21 64 30]
[ 8 1 15]]
----------
[[2.33333333 1. 1.2 ]
[8. 1. 1.66666667]]
----------
[[35 40 30]
[40 5 25]]
----------
[[ True False True]
[ True False True]]
In [11]:
arr = np.array(['ba','ch','ap'])
print(np.sort(arr)) #정렬
['ap' 'ba' 'ch']
In [15]:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]])
print(arr)
print('-' * 20)
print(arr.mean()) #평균
print(arr.sum()) #더하기
print(arr.std()) #편차
print(arr.var())
print(arr.min()) #최소값
print(arr.max()) #최대값
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]
[16 17 18]]
--------------------
9.5
171
5.188127472091127
26.916666666666668
1
18
In [19]:
# sqrt 제곱근 exp지수함수
arr = np.arange(10)
print(arr)
print(np.sqrt(arr))
print(np.exp(arr))
[0 1 2 3 4 5 6 7 8 9]
[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
In [23]:
a = np.random.randint(0, 10, (2, 3))
print(a)
np.savetxt("./data/score.csv", a)
[[3 7 7]
[1 5 2]]
#판다스 시작
import pandas as pd
In [95]:
age = pd.Series([24,36,None,67,89,45,234,7,5,23]) #시리즈
score = pd.Series([2,6,8,0,36,None,609,67,48,96])
salary = pd.Series([2,3,4,5,None,7,8,9,6,8])
print(age[0])
print(age)
print(score)
print(salary)
24.0
0 24.0
1 36.0
2 NaN
3 67.0
4 89.0
5 45.0
6 234.0
7 7.0
8 5.0
9 23.0
dtype: float64
0 2.0
1 6.0
2 8.0
3 0.0
4 36.0
5 NaN
6 609.0
7 67.0
8 48.0
9 96.0
dtype: float64
0 2.0
1 3.0
2 4.0
3 5.0
4 NaN
5 7.0
6 8.0
7 9.0
8 6.0
9 8.0
dtype: float64
In [ ]:
import pandas as pd
a = [1, 7, 2]
# 레이블 생성
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar) #레이블로 접근
print(myvar["y"])
In [36]:
#pandas = DataFrame
df = pd.DataFrame({'age' : age,
'score' : score,
'salay' : salary})
# print(df)
df
df.head() #앞에 5개만 노출
df.tail() #뒤에 5개만 노출 함수안에 숫자를 넣으면 그 숫자만큼 행이 노출됨
Out[36]:
agescoresalay56789
45 | 27 | 7 |
234 | 609 | 8 |
7 | 67 | 9 |
5 | 48 | 6 |
23 | 96 | 8 |
In [42]:
df.loc[0] #행 인덱스가 나옴
Out[42]:
age 24
score 2
salay 2
Name: 0, dtype: int64
In [41]:
df.index
df.columns
df.values
Out[41]:
array([[ 24, 2, 2],
[ 36, 6, 3],
[ 23, 8, 4],
[ 67, 0, 5],
[ 89, 36, 6],
[ 45, 27, 7],
[234, 609, 8],
[ 7, 67, 9],
[ 5, 48, 6],
[ 23, 96, 8]], dtype=int64)
In [45]:
df.describe() #요약정보 확인 -> 많이 쓰인다고 함
Out[45]:
agescoresalaycountmeanstdmin25%50%75%max
10.000000 | 10.000000 | 10.000000 |
55.300000 | 89.900000 | 5.800000 |
67.998448 | 185.052215 | 2.299758 |
5.000000 | 0.000000 | 2.000000 |
23.000000 | 6.500000 | 4.250000 |
30.000000 | 31.500000 | 6.000000 |
61.500000 | 62.250000 | 7.750000 |
234.000000 | 609.000000 | 9.000000 |
In [48]:
#데이터 전치
df.T
Out[48]:
0123456789agescoresalay
24 | 36 | 23 | 67 | 89 | 45 | 234 | 7 | 5 | 23 |
2 | 6 | 8 | 0 | 36 | 27 | 609 | 67 | 48 | 96 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 6 | 8 |
In [49]:
df.sort_values(by='score') #score기준으로 오름 차순 정렬 훈련이 잘 됐는지 검증하는데 머신러닝 할 때는 정렬되어있는게 좋은 건 아니라고 함
Out[49]:
agescoresalay3012548796
67 | 0 | 5 |
24 | 2 | 2 |
36 | 6 | 3 |
23 | 8 | 4 |
45 | 27 | 7 |
89 | 36 | 6 |
5 | 48 | 6 |
7 | 67 | 9 |
23 | 96 | 8 |
234 | 609 | 8 |
In [51]:
df.sort_values(by='age', ascending=False) #올림차순을 false로 하여 내림차순으로 변경 != ture 일 경우 올림차순(default)
Out[51]:
agescoresalay6435102978
234 | 609 | 8 |
89 | 36 | 6 |
67 | 0 | 5 |
45 | 27 | 7 |
36 | 6 | 3 |
24 | 2 | 2 |
23 | 8 | 4 |
23 | 96 | 8 |
7 | 67 | 9 |
5 | 48 | 6 |
In [53]:
df.info() #데이터의 전반적인 정보를 확인
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 10 non-null int64
1 score 10 non-null int64
2 salay 10 non-null int64
dtypes: int64(3)
memory usage: 368.0 bytes
In [63]:
#데이터 열 추가
df['class'] = pd.Series([1,1,2,2,3,3,4,4,3,2])
df.head()
# 데이터 열 삭제
df.drop(columns=['class'])
df.drop(columns=['class'], inplace=True)
In [72]:
df.drop(labels=[0,1], axis = 0 ) #삭제된 데이터 프레임이 실제로 지워지기 위함이라면 inplace = True를 기재해야함
Out[72]:
agescoresalay23456789
23 | 8 | 4 |
67 | 0 | 5 |
89 | 36 | 6 |
45 | 27 | 7 |
234 | 609 | 8 |
7 | 67 | 9 |
5 | 48 | 6 |
23 | 96 | 8 |
In [96]:
stu_class = pd.Categorical([1,2,3,None,1,2,3,4,1,3])
gender = pd.Categorical(['F', None,'F','F','F','F','F','F','M','M'])
df = pd.DataFrame({'age' : age,
'score' : score,
'salay' : salary,
'stu_class' : stu_class,
'gender' : gender})
# Series 타입으로 추출
df.gender
df[df.score > 3.0 ]
Out[96]:
agescoresalaystu_classgender1246789
36.0 | 6.0 | 3.0 | 2 | NaN |
NaN | 8.0 | 4.0 | 3 | F |
89.0 | 36.0 | NaN | 1 | F |
234.0 | 609.0 | 8.0 | 3 | F |
7.0 | 67.0 | 9.0 | 4 | F |
5.0 | 48.0 | 6.0 | 1 | M |
23.0 | 96.0 | 8.0 | 3 | M |
In [91]:
cctv = pd.read_csv("data/cctv_in_seoul.csv", encoding = "utf-8")
cctv.head()
cctv.tail()
cctv.describe()
Out[91]:
소계2013년도 이전2014년2015년2016년countmeanstdmin25%50%75%max
25.000000 | 25.000000 | 25.000000 | 25.000000 | 25.000000 |
1179.080000 | 764.760000 | 159.480000 | 205.200000 | 385.880000 |
556.728983 | 415.510257 | 104.132976 | 137.877059 | 182.479981 |
485.000000 | 238.000000 | 21.000000 | 30.000000 | 81.000000 |
748.000000 | 464.000000 | 78.000000 | 103.000000 | 292.000000 |
1015.000000 | 573.000000 | 142.000000 | 184.000000 | 377.000000 |
1496.000000 | 1070.000000 | 218.000000 | 269.000000 | 467.000000 |
2780.000000 | 1843.000000 | 430.000000 | 584.000000 | 932.000000 |
In [93]:
popseoul = pd.read_excel("data/population_in_seoul.xls")
popseoul.head()
popseoul.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 29 entries, 0 to 28
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 기간 28 non-null object
1 자치구 28 non-null object
2 세대 28 non-null object
3 인구 28 non-null object
4 인구.1 28 non-null object
5 인구.2 28 non-null object
6 인구.3 28 non-null object
7 인구.4 28 non-null object
8 인구.5 28 non-null object
9 인구.6 28 non-null object
10 인구.7 28 non-null object
11 인구.8 28 non-null object
12 세대당인구 28 non-null object
13 65세이상고령자 28 non-null object
dtypes: object(14)
memory usage: 3.3+ KB
In [94]:
df = pd.read_json('data/score.json')
df
Out[94]:
idnamemathphysicschemistry012
A001 | Tom | 60 | 66 | 61 |
A002 | James | 89 | 76 | 51 |
A003 | Jenny | 79 | 90 | 78 |
In [208]:
#결측치 - 값이 들어가 있지 않는 것, 조인으로 엑셀파일을 같이 함칠수 있음 = 행제거 및 값을 채워넣음 or 열 자체를 삭제
df = pd.DataFrame({'age' : age,
'score' : score,
'salay' : salary,
'stu_class' : stu_class,
'gender' : gender})
df_new = df.copy() #별도로 만들어버리는 것
In [202]:
df_new
#isno = None만 찾아주는 것
pd.isna(df_new)
Out[202]:
agescoresalaystu_classgender0123456789
False | False | False | False | False |
False | False | False | False | True |
True | False | False | False | False |
False | False | False | True | False |
False | False | True | False | False |
False | True | False | False | False |
False | False | False | False | False |
False | False | False | False | False |
False | False | False | False | False |
False | False | False | False | False |
In [203]:
# 열별로 결측치 확인
df_new.isnull().sum()
Out[203]:
age 1
score 1
salay 1
stu_class 1
gender 1
dtype: int64
In [204]:
#결측지 제거
df_new = df_new.dropna()
df_new #제거된 table만보임
df_hi = df.copy()
In [133]:
x = df_hi["age"].mean()
df_hi["age"] = df_hi["age"].fillna(value=x)
df_hi
Out[133]:
agescoresalaystu_classgender0123456789
24.0 | 2.0 | 2.0 | 1 | F |
36.0 | 6.0 | 3.0 | 2 | NaN |
30.0 | 8.0 | 4.0 | 3 | F |
67.0 | 0.0 | 5.0 | NaN | F |
89.0 | 36.0 | NaN | 1 | F |
45.0 | NaN | 7.0 | 2 | F |
234.0 | 609.0 | 8.0 | 3 | F |
7.0 | 67.0 | 9.0 | 4 | F |
5.0 | 48.0 | 6.0 | 1 | M |
23.0 | 96.0 | 8.0 | 3 | M |
In [143]:
df['stu_class'].isin([1,2]) #3,4안보이게
Out[143]:
0 True
1 True
4 True
5 True
8 True
Name: stu_class, dtype: bool
In [209]:
# df = df[df['stu_class'].isin([1,2])]
df_i = df.copy()
In [213]:
#2반을 3반으로change
# df_i = df(df["stu_class"]) == 2
# df_i.loc[:,'class'] = 3
# df_i
for a in df_i.index :
if df_i.loc[a,'stu_class'] == 2 :
df_i.loc[a, 'stu_class'] = 3
df_i
Out[213]:
agescoresalaystu_classgender0123456789
24.0 | 2.0 | 2.0 | 1 | F |
36.0 | 6.0 | 3.0 | 3 | NaN |
NaN | 8.0 | 4.0 | 3 | F |
67.0 | 0.0 | 5.0 | NaN | F |
89.0 | 36.0 | NaN | 1 | F |
45.0 | NaN | 7.0 | 3 | F |
234.0 | 609.0 | 8.0 | 3 | F |
7.0 | 67.0 | 9.0 | 4 | F |
5.0 | 48.0 | 6.0 | 1 | M |
23.0 | 96.0 | 8.0 | 3 | M |
In [159]:
fruit = pd.DataFrame(
{'Num' : [12, 23, 33, 34, 77],
'Fruit' : ['ap','ba','ch','le','pe']})
grade = pd.DataFrame(
{'Num' : [12, 33, 55],
'Grade' : ['A','B','C']})
prince = pd.DataFrame(
{'No' : [12,33, 55],
'Grade' : [134, 745, 456]})
# print(fruit)
# print(grade)
# print(prince)
In [161]:
df = pd.concat([fruit, grade, prince])
df
Out[161]:
NumFruitGradeNo01234012012
12.0 | ap | NaN | NaN |
23.0 | ba | NaN | NaN |
33.0 | ch | NaN | NaN |
34.0 | le | NaN | NaN |
77.0 | pe | NaN | NaN |
12.0 | NaN | A | NaN |
33.0 | NaN | B | NaN |
55.0 | NaN | C | NaN |
NaN | NaN | 134 | 12.0 |
NaN | NaN | 745 | 33.0 |
NaN | NaN | 456 | 55.0 |
In [163]:
#inner join 같은 키의 값이 노출됨
df = pd.merge(fruit, grade, on ='Num')
df
Out[163]:
NumFruitGrade01
12 | ap | A |
33 | ch | B |
In [171]:
#left join/ Right join/ outer join
df = pd.merge(fruit, grade, on = 'Num', how = 'left')
df
print(df.isnull().sum())
df = pd.merge(fruit, grade, on = 'Num', how = 'right')
df
df = pd.merge(fruit, grade, on = 'Num', how = 'outer')
df
Num 0
Fruit 0
Grade 3
dtype: int64
Out[171]:
NumFruitGrade012345
12 | ap | A |
23 | ba | NaN |
33 | ch | B |
34 | le | NaN |
77 | pe | NaN |
55 | NaN | C |
In [174]:
#카럼이름이 다를 경우 기재할 때 _how 의 left는 왼쪽의 있는 벤다이어그램 +겹치는 거를 노출시킴
df = pd.merge(fruit, prince, left_on = 'Num', right_on='No', how = 'left')
df
Out[174]:
NumFruitNoGrade01234
12 | ap | 12.0 | 134.0 |
23 | ba | NaN | NaN |
33 | ch | 33.0 | 745.0 |
34 | le | NaN | NaN |
77 | pe | NaN | NaN |
In [226]:
#범주형 데이터 /더미데이터(범주형 데이터) /비닝 -구간을 나눠줌,
df = pd.read_csv('data/dirtydata.csv')
pd.get_dummies(df['Duration'])
Out[226]:
304560450012345678910111213141516171819202122232425262728293031
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 |
In [251]:
bins = [df['Maxpulse'].min(), 110, df['Maxpulse'].max()]
#bins = [100, 110, 120, 130]
#위의 값을 아래의 bins처럼 반환한값.
df['Maxp'] = pd.cut(x =df['Maxpulse'], bins=bins, labels=['Low', 'High']) #다시 열을 만들어서 labels을 추가한 값
#cut이라는 메소드의 키값을 넣은것
df
# bins = [df['Calories'].min(), 300, df['Calories'].max()]
# df['Calories'] = pd.cut(x =df['Calories'], bins=bins, labels=[0,1])
# df
Out[251]:
DurationDatePulseMaxpulseCaloriesMaxpCalor012345678910111213141516171819202122232425262728293031
60 | '2020/12/01' | 110 | 130 | 1 | High | NaN |
60 | '2020/12/02' | 117 | 145 | 1 | High | NaN |
60 | '2020/12/03' | 103 | 135 | 1 | High | NaN |
45 | '2020/12/04' | 109 | 175 | 0 | High | NaN |
45 | '2020/12/05' | 117 | 148 | 1 | High | NaN |
60 | '2020/12/06' | 102 | 127 | 0 | High | NaN |
60 | '2020/12/07' | 110 | 136 | 1 | High | NaN |
450 | '2020/12/08' | 104 | 134 | 0 | High | NaN |
30 | '2020/12/09' | 109 | 133 | NaN | High | NaN |
60 | '2020/12/10' | 98 | 124 | 0 | High | NaN |
60 | '2020/12/11' | 103 | 147 | 1 | High | NaN |
60 | '2020/12/12' | 100 | 120 | 0 | High | NaN |
60 | '2020/12/12' | 100 | 120 | 0 | High | NaN |
60 | '2020/12/13' | 106 | 128 | 1 | High | NaN |
60 | '2020/12/14' | 104 | 132 | 1 | High | NaN |
60 | '2020/12/15' | 98 | 123 | 0 | High | NaN |
60 | '2020/12/16' | 98 | 120 | 0 | High | NaN |
60 | '2020/12/17' | 100 | 120 | 0 | High | NaN |
45 | '2020/12/18' | 90 | 112 | NaN | High | NaN |
60 | '2020/12/19' | 103 | 123 | 1 | High | NaN |
45 | '2020/12/20' | 97 | 125 | 0 | High | NaN |
60 | '2020/12/21' | 108 | 131 | 1 | High | NaN |
45 | NaN | 100 | 119 | 0 | High | NaN |
60 | '2020/12/23' | 130 | 101 | 0 | NaN | NaN |
45 | '2020/12/24' | 105 | 132 | 0 | High | NaN |
60 | '2020/12/25' | 102 | 126 | 1 | High | NaN |
60 | 20201226 | 100 | 120 | 0 | High | NaN |
60 | '2020/12/27' | 92 | 118 | 0 | High | NaN |
60 | '2020/12/28' | 103 | 132 | NaN | High | NaN |
60 | '2020/12/29' | 100 | 132 | 0 | High | NaN |
60 | '2020/12/30' | 102 | 129 | 1 | High | NaN |
60 | '2020/12/31' | 92 | 115 | 0 | High | NaN |
In [ ]:
In [252]:
#csv를 어떻게 pandas에 활용할 수 있는가?
df = pd.read_csv('data/ds6/survey_person.csv', encoding='utf-8')
print(df)
tt = pd.read_csv('data/ds6/survey_site.csv', encoding='utf-8')
print(tt)
cf = pd.read_csv('data/ds6/survey_visited.csv', encoding='utf-8')
print(cf)
dd = pd.read_csv('data/ds6/survey_survey.csv', encoding='utf-8')
dd
# df.isnull().sum()
3. 후기
점점 새로운 걸 배우는게 늘어가면서 배운것을 활용하는 것보다 구글링 하는게 더 많아지고 광대한 정보에 머리가 살짝씩 아파온다.. 주말은 기력을 좀 충전해야할 거같다.
tomorrow with list
. 준한테 할 말 딱 정해보기{쓰읍..할 수 있을까..}
. 즐겁게 시간 보내기
. 충분한 휴식 취하기
728x90
반응형
'IT To do and To was' 카테고리의 다른 글
22년 1월 9일_team project work (0) | 2022.01.10 |
---|---|
22년 1월 8일_개인 small project made, python그래프 (0) | 2022.01.09 |
22년 1월 6일_젤네일 이상한가..?ㅜㅜ (0) | 2022.01.06 |
22년 1월 5일_크롤링, 다시 학교 수업 시작 (0) | 2022.01.05 |
22년 1월 4일_헐, 너무 행복해, Json (0) | 2022.01.04 |