Spark SQL을 활용하여 날씨 데이터를 비교그래프로 나타내어 보는 것을 목표로한다.
-
Spark 실행
-
DataFrame으로 CSV파일 읽어오기
-
날짜와 평균 기온 추출
-
비교그래프(1) - 꺾은선 그래프 그리기
3-0. 월별 평균 기온 출력
3-1. Pandas 형태 변환
3-2. 꺾은선 그래프 비교
-
비교그래프(2) - 막대 그래프 그리기
4-0. 월별 평균 기온 출력
4-1. Pandas 형태 변환
4-2. 막대 그래프 비교
- 2011~2020년의 날씨데이터를 공공데이터포털에서 수집
- 일 단위로 서울의 평균기온, 일강수량, 평균풍속, 평균상대습도, 평균기압, 평균최심신적설, 평균전운량을 수집
data.kma.go.kr/data/grnd/selectAsosRltmList.do?pgmNo=36
import findspark findspark.init() import pyspark from pyspark import SparkConf from pyspark import SparkContext from pyspark.sql import SQLContext from pyspark.sql import SparkSession sc = SparkSession.builder\ .master('local[*]')\ .appName('hello_world_app')\ .getOrCreate()#1. 데이터 DataFrame으로 읽기
#1-1. dataframe 스키마
from pyspark.sql.types import StructType, StructField
from pyspark.sql.types import DoubleType, IntegerType, StringType
schema=StructType([\
StructField("local",IntegerType()),\
StructField("local_name",StringType()),\
StructField("date",StringType()),\
StructField("ave_temperature",DoubleType()),\
StructField("daily_precipitation",DoubleType()),\
StructField("ave_windspeed",DoubleType()),\
StructField("ave_relative_humidity",DoubleType()),\
StructField("ave_airpressure",DoubleType()),\
StructField("the_latest_snowfall",DoubleType()),\
StructField("ave_total_cloud",DoubleType())])
#1-2. 파일 불러오기
PATH='weather_20110101_20201231.csv'
file_df=sc.read.csv(PATH, header=True,schema=schema)
print(file_df)
#1-3. 데이터 확인
file_df.show()#1-4. 데이터 스키마 확인
file_df.printSchema()#2-1. 기온 열값만 뽑아내기
date_temp_df=file_df['date','ave_temperature']
date_temp_df.show()#2-2. 우선 2011년도 월별 평균기온 구하기
from pyspark.sql.functions import *
temp_2011_df=date_temp_df.select(col('date'),col('ave_temperature'))\
.where(year('date')=='2011')\
.select(date_format('date','MM').alias('date'),col('ave_temperature'))\
.groupBy('date').avg()\
.orderBy('date')
temp_2011_df.show()
temp_2011_df.count() #temp_2011_df.printSchema()- .select : 선택 column
- .where : 조건 ('date' column에서 year(년도)가 '2011'인 것)
- .select(date_format('date','MM').alias('date'),col('ave_temperature'))\ : 날짜를 월 형식으로 변환하고 열 이름을 'date'로 변환
- .groupBy('date').avg() : 'date'가 같은것끼리(같은 월별끼리) 평균기온 구하기
- .orderBy('date') : 'date'(월별)순으로 정렬
우선 2011년도 데이터만 출력
#3.선그래프 그리기
from matplotlib import pyplot as plt
temp_2011_pd=temp_2011_df.toPandas()
x_values=temp_2011_pd['date']
y_values=temp_2011_pd['avg(ave_temperature)']
plt.figure(figsize=(30, 10))
plt.plot(x_values,y_values,color='green',marker='o')
plt.xlabel('month')
plt.ylabel('ave_temperature')
plt.legend(['2011'])
plt.show()category=478380 #3-0. 년도별로 월별 평균 기온 출력
range_year=[i for i in range(2011,2021)]
temp_year=['temp_'+str(i)+'_df' for i in range_year]
print(range_year)
print(temp_year)
for i in range(len(temp_year)):
temp_year[i]=date_temp_df.select(col('date'),col('ave_temperature'))\
.where(year('date')==str(range_year[i]))\
.select(date_format('date','MM').alias('date'),col('ave_temperature'))\
.groupBy('date').avg()\
.orderBy('date')
#temp_year[i].show()그래프를 그리기 위해서 Spark DataFrame을 Pandas형태로 변환
#3-1. 그래프를 그리기 위해 pd로 변환
temp_year_pd=['temp_'+str(i)+'_pd' for i in range_year]
for i in range(len(temp_year_pd)):
temp_year_pd[i]=temp_year[i].toPandas()
display(temp_year_pd[0])2018~2020년(3년)간의 꺾은선 그래프 비교
#3-2. 우선 3년간 선그래프 비교 (2018-2020)
#축 사이즈 plt.figure(figsize=(30, 10))
#그래프 그리기
x_values=temp_year_pd[7]['date']
y_values=temp_year_pd[7]['avg(ave_temperature)']
plt.plot(x_values,y_values,marker='o')
x_values=temp_year_pd[8]['date']
y_values=temp_year_pd[8]['avg(ave_temperature)']
plt.plot(x_values,y_values,marker='o')
x_values=temp_year_pd[9]['date']
y_values=temp_year_pd[9]['avg(ave_temperature)']
plt.plot(x_values,y_values,marker='o')
#축 라벨 표시
plt.xlabel('month')
plt.ylabel('ave_temperature')
plt.legend(['2018','2019','2020'])
plt.show()2018~2020년(3년)간의 막대 그래프 비교
#4-2. 우선 3년간 막대그래프 비교 (2018-2020)
import numpy
#축 사이즈
plt.figure(figsize=(30, 10))
#그래프 그리기
X=numpy.arange(12)
print(X)
_value=temp_year_pd[7]['avg(ave_temperature)']
plt.bar(X-0.25+1,_value,width=0.25)
_value=temp_year_pd[8]['avg(ave_temperature)']
plt.bar(X+0.00+1,_value,width=0.25)
_value=temp_year_pd[9]['avg(ave_temperature)']
plt.bar(X+0.25+1,_value,width=0.25)
#축 눈금 표시
ax = plt.subplot()
ax.set_xticks([i for i in range(1,13)])
#축 라벨 표시
plt.xlabel('month')
plt.ylabel('ave_temperature')
plt.legend(['2018','2019','2020'])
plt.show()
