소연의_개발일지
article thumbnail

사용자료

day,temp,condition
Monday,12,Sunny
Tuesday,14,Rain
Wednesday,15,Rain
Thursday,14,Cloudy
Friday,21,Sunny
Saturday,22,Sunny
Sunday,24,Sunny

weather_data.csv
0.00MB

파이썬에서 데이터 읽기

readlines 이용해서 데이터 읽기

with open('weather_data.csv') as data_file:
    data = data_file.readlines()
    print(data)

 

출력결과

['day,temp,condition\\n', 'Monday,12,Sunny\\n', 'Tuesday,14,Rain\\n', 'Wednesday,15,Rain\\n', 'Thursday,14,Cloudy\\n', 'Friday,21,Sunny\\n', 'Saturday,22,Sunny\\n', 'Sunday,24,Sunny']

csv import 해 와서 각각의 열 읽기

import csv
with open('weather_data.csv') as data_file:
    data = csv.reader(data_file)
    for row in data:
        print(row)

출력결과

['day', 'temp', 'condition']
['Monday', '12', 'Sunny']
['Tuesday', '14', 'Rain']
['Wednesday', '15', 'Rain']
['Thursday', '14', 'Cloudy']
['Friday', '21', 'Sunny']
['Saturday', '22', 'Sunny']
['Sunday', '24', 'Sunny']

 

temp를 정수형으로 리스트에 넣어보기

  • 시도1 int형으로 넣어봄 (실패)
import csv
with open('weather_data.csv') as data_file:
    data = csv.reader(data_file)
    temperature = []
    for row in data:
        temperature.append(int(row[1]))
print(temperature)

ValueError: invalid literal for int() with base 10: 'temp’

밸류에러가 났다.

  1. 나의 해결방법
import csv
with open('weather_data.csv') as data_file:
    data = csv.reader(data_file)
    temperature = []
    for row in data:
        temperature.append(row[1])
# temperature = [eval(i) for i in temperature]
# print(temperature)
new_a= list(map(int, temperature[1:]))
print(new_a)

   2. 다른 해결방법

  • 열 제목인 temp 부분을 해결하지 못해 난 오류였다.
import csv
with open('weather_data.csv') as data_file:
    data = csv.reader(data_file)
    temperature = []
    for row in data:
        if row[1] != 'temp':
            temperature.append(int(row[1]))
    print(temperature)

하지만 너무 복잡한 방법이기 때문에 pandas가 필요하다.

 


Pandas

우리가 가지고 있는 표 형태로 된 데이터를 분석하는데 효과적으로 데이터를 사용하는 모듈이다.

만약 pandas가 설치되어 있지 않다면 빨간줄에 install package pandas를 클릭하면 pycharm의 기능으로 자동으로 가상환경에 pandas가 설치된다.

pandas의 라이브러리

documentation을 자세히 살펴보기 (시간이 된다면)

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')
print(data)

출력결과

day  temp condition
0     Monday    12     Sunny
1    Tuesday    14      Rain
2  Wednesday    15      Rain
3   Thursday    14    Cloudy
4     Friday    21     Sunny
5   Saturday    22     Sunny
6     Sunday    24     Sunny

다른 식으로 출력해보기

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')
print(data['temp']) #첫번째 줄을 열으로 인식하기 때문에 열 제목을 넣으면 그 열의 값들이 출력된다.

출력결과

0    12
1    14
2    15
3    14
4    21
5    22
6    24
Name: temp, dtype: int64

 

  • 판다스는 작업하고 있는 객체 유형을 확인할 수 있다.
import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#판다스는 작업하고 있는 객체 유형을 확인할 수 있다.
print(type(data))

#출력결과
<class 'pandas.core.frame.DataFrame'>

판다스의 공식문서를 보면 판다스의 두 가지 주요 데이터 구조인 series와 데이터 프레임 data frame에 대해서 언급한 것을 볼 수 있다.

참조링크:

  1. https://pandas.pydata.org/docs/user_guide/dsintro.html
  2. https://sdc-james.gitbook.io/onebook/4.-numpy-and-scipy/4.4-pandas/4.4.1-pandas
  3. https://www.geeksforgeeks.org/data-structures-in-pandas/

데이터 프레임은 전체 표와 같은 것이라고 보면 된다.

엑셀 파일이나 구글 시트같은 데이터는 판다스에서는 데이터 프레임으로 여겨진다.

 

만약 데이터 프레임의 특정 열의 형식을 출력한다면

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#판다스는 작업하고 있는 객체 유형을 확인할 수 있다.
print(type(data['temp']))

#출력결과
<class 'pandas.core.series.Series'>

시리즈라고 출력되는 모습을 볼 수 있다.

이 시리즈는 판다스에서 아주 중요한 개념인데 기본적으로 리스트와 같은 것이다.

각각의 열을 의미한다. 시리즈(각각의 열)이 모여 데이터프레임(표)가 됨을 알 수 있다.

 

판다스로 데이터를 딕셔너리로 변형해보기

to_dict() 사용

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#csv파일을 딕셔너리로 변형하기
data_dict = data.to_dict()
print(data_dict)

#출력결과
{'day': {0: 'Monday', 1: 'Tuesday', 2: 'Wednesday', 3: 'Thursday', 4: 'Friday', 5: 'Saturday', 6: 'Sunday'}, 'temp': {0: 12, 1: 14, 2: 15, 3: 14, 4: 21, 5: 22, 6: 24}, 'condition': {0: 'Sunny', 1: 'Rain', 2: 'Rain', 3: 'Cloudy', 4: 'Sunny', 5: 'Sunny', 6: 'Sunny'}}

딕셔너리로 변형한 자료의 한 열을 리스트로 변경해서 호출하기

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#csv파일을 딕셔너리로 변형하기
data_dict = data.to_dict()

#변경한 딕셔너리 파일의 한 열을 리스트로 변경해서 호출하기
temp_list = data['temp'].tolist()
print(temp_list)

#출력결과
[12, 14, 15, 14, 21, 22, 24]

이 자료들을 사용해서 자료의 길이를 체크하거나, (len 사용) 더할 수도 있다.(sum) 사용

 

데이터 평균, 최고값 구하기

평균 구하기

#평균 구하기
print(sum(temp_list)/len(temp_list))

#출력결과
17.428571428571427

⇒ 즉 그 주의 평균 온도는 17도였다는 것을 알 수 있다.

판다스 메소드 가지고 코드 단순화 해보기

mean 메소드를 호출하여 사용해보기

#평균 구하기
print(data['temp'].mean())

#출력결과
17.428571428571427

동일한 결과가 나옴을 확인할 수 있다.

 

최고값 구하기

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#csv파일을 딕셔너리로 변형하기
data_dict = data.to_dict()
print(data_dict)

#변경한 딕셔너리 파일의 한 열을 리스트로 변경해서 호출하기
temp_list = data['temp'].tolist()

#최고값 구하기
print(data['temp'].max())

출력결과: 24

 

자료 열 호출하기

판다스는 자료의 컬럼명을 가져가서 속성값으로 변환하므로,

가져온 자료.열이름 하면 자료를 읽어올 수 있다.

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

# 열 호출하기
print(data.condition)

출력결과

0     Sunny
1      Rain
2      Rain
3    Cloudy
4     Sunny
5     Sunny
6     Sunny
Name: condition, dtype: object

이 방식으로 사용하면 딕셔너리를 사용하는 것처럼 좀 더 쉽게 값들을 가져올 수 있다. 그리고 열 이름을 잘 사용했는지 확인해야 한다.

 

조건에 맞는 자료를 출력하기

  • 월요일인 자료들을 불러와 본다.
import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

# 월요일인 자료 가져오기
print(data[data.day == 'Monday'])

출력결과

day  temp condition
0  Monday    12     Sunny

월요일인 행들이 정확하게 출력되었다.

  • 그 주에서 가장 높은 온도가 있는 행 찾기
import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

# 그 주에서 가장 높은 온도가 있는 행 찾기
print(data[data.temp == max(data['temp'])])

다른 방식(더 간단함)

print(data[data.temp == data.temp.max()])
  • 월요일인 자료 가져오기

전체 칼럼에서 데이터를 얻은 것과 같은 방식으로 다른 열 아래 있는 값들을 사용할 수 있다.

월요일 값을 가져와서 그 날의 상태를 찾아보자.

이렇게 하면 특정 요일에 대한 날씨 상태를 볼 수 있다.

import pandas

#csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

#월요일 값 가져오기
monday = data[data.day == 'Monday']
print(monday.condition)

#출력결과
0    Sunny
Name: condition, dtype: object
  • 월요일 온도를 화씨온도로 바꾸기
    • 화씨온도 공식: (0°C × 9/5) + 32 = 32°F
import pandas

# csv파일 읽어오기. 만약 경로가 길다면 따로 변수로 설정하여 ()안에 넣으면 된다.
data = pandas.read_csv('weather_data.csv')

# 월요일 값 가졍괴
monday = data[data.day == 'Monday']
monday_temp = int(monday.temp) #int로 바꿔줬지만 다음에는 ser.iloc[0] 사용하라는 오류가 뜸. 정상적으로 결과가 나오기는 함
monday_temp_F = (monday_temp * 9 / 5) + 32 #공식에 넣어주기
print('화씨온도는', monday_temp_F) #결과 출력하기

 

 

데이터 프레임 만들기

만약 딕셔너리 값을 판다스로 변환하고 싶다면, DataFrame을 사용한다.

예시:

import pandas

# 딕셔너리를 데이터로 변환하기
data_dict = {
    'students': ['Vernon', 'Dino', 'Joshua'],
    'scores': [76, 56, 65]
}

data = pandas.DataFrame(data_dict)
print(data)

data_dict이란 자료형을 표로 만들고 싶다면, DataFrame을 사용하여 넣어주고 data에 담아준다.

그리고 print()를 찍어주면

출력결과:

students  scores
0   Vernon      76
1     Dino      56
2   Joshua      65

원하는 대로 자료가 출력된다.

이 자룔르 csv 파일로 변경할 수 있다.

import pandas

# 딕셔너리를 데이터로 변환하기
data_dict = {
    'students': ['Vernon', 'Dino', 'Joshua'],
    'scores': [76, 56, 65]
}

data = pandas.DataFrame(data_dict)
data.to_csv('new_data.csv')

자료옆에 to_csv(저장될 이름)을 추가하고 실행시켜주면

import pandas

# 딕셔너리를 데이터로 변환하기
data_dict = {
    'students': ['Vernon', 'Dino', 'Joshua'],
    'scores': [76, 56, 65]
}

data = pandas.DataFrame(data_dict)
print(data)
data.to_csv('new_data.csv')

 

새로운 자료가 생긴다.

 


다람쥐분석

뉴욕 센트럴파크에 있는 다람쥐 분석

출처: https://data.cityofnewyork.us/Environment/2018-Central-Park-Squirrel-Census-Squirrel-Data/vfnx-vebw

 

2018 Central Park Squirrel Census - Squirrel Data | NYC Open Data

 

data.cityofnewyork.us

 

  1. 회색, 시나몬색, 검은색 다람쥐 갯수를 각각 구하여라.
import pandas

data = pandas.read_csv('2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv')

#회색 다람쥐 마릿수 찾아보기
gray_squirrels_count = len(data[data['Primary Fur Color'] == 'Gray'])
red_squirrels_count = len(data[data['Primary Fur Color'] == 'Cinnamon'])
black_squirrels_count = len(data[data['Primary Fur Color'] == 'Black'])

#출력
print(gray_squirrels_count)
print(red_squirrels_count)
print(black_squirrels_count)

#출력결과
2473
392
103

회색 다람쥐가 가장 많은 것을 알 수 있다.

 

2. 데이터를 딕셔너리로 만들고 이를 csv 파일로 저장한다.

import pandas

data = pandas.read_csv('2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv')
#회색 다람쥐 마릿수 찾아보기
gray_squirrels_count = len(data[data['Primary Fur Color'] == 'Gray'])
red_squirrels_count = len(data[data['Primary Fur Color'] == 'Cinnamon'])
black_squirrels_count = len(data[data['Primary Fur Color'] == 'Black'])
# print(gray_squirrels_count)
# print(red_squirrels_count)
# print(black_squirrels_count)

# 다람쥐 색과 갯수를 딕셔너로 만들기
data_dict = {
    'Fur_color': ['Gray', 'Cinnamon', 'Black'],
    'Count': [gray_squirrels_count, red_squirrels_count, black_squirrels_count]
}

# 이를 csv파일로 만들기
df = pandas.DataFrame(data_dict)
df.to_csv('squirrels_count.csv')

데이터가 잘 생성되었다.

이런 방식을 통해 원하는 부분만 csv 파일로 저장할 수 있다.

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!