Problem Solving with Algorithms

728x90
반응형

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개

 

Julia 프로그래밍 - 언어 및 강의 소개

Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필요 사항을 만족시키면서 일반 목적 프로그래밍에도 효과적으로 사용될 수 있도록 설계된 고급 동적 프로그래밍 언어이

inner-game.tistory.com

 

 

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 배열 및 선형 대수

 

Julia 프로그래밍 - 배열 및 선형 대수

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개 Julia 프로그래밍 - 언어 및 강의 소개Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필요 사항

inner-game.tistory.com

 

 

 

Julia 프로그래밍 - 플롯과 데이터 프레임

 

플롯.jl
선형 플롯
기능
범위에 대한 함수
PlutoUI를 사용한 대화형 플롯
플롯 속성
순차적 플로팅
LaTeX 문자열
서브 플롯
플롯 저장
다른 플롯 유형
--2D 플롯
--3D 플롯

 

데이터프레임.jl
DataFrame에 데이터 로드
데이터 프레임 인덱싱
StatsPlots를 사용하여 데이터 프레임 플로팅
특징 엔지니어링
--날짜 구문 분석
--DataFrame 변환
최종 결과


추가 자료

 



플롯.jl

이 강의에서는 Plots.jl의 사용법을 알아보겠습니다 . Plots.jl은 여러 플로팅 패키지에 공통된 인터페이스를 제공합니다.

- GR
- PythonPlot – matplotlib 호출
- PGFPlotsX – LaTeX에서 이 사실을 알고 계실 수도 있습니다.
- Plotly – JavaScript 플로팅 패키지
- UnicodePlots - 터미널의 ASCII 플롯

Plots.jl은 이러한 패키지를 백엔드라고 부릅니다 .

Pluto 노트북은 JavaScript와 잘 호환되므로 Plotly 백엔드로 Plots.jl을 로드합니다.

 

using Plots



PlotlyBackend()

plotly() # activate Plotly backend

 

begin
    using Plots
    import PlotlyBase, PlotlyKaleido

    plotly() # activate Plotly backend
end

 

 


선형 플롯

Plots.jl은 다중 디스패치를 ​​효과적으로 활용합니다. 다양한 호출 방법을 살펴보겠습니다 plot.

plot(y) - 단위 범위의 x 값을 사용한 2D 플롯
plot(x, y) - 2D 플롯
plot(x, y, z) - 3D 플롯

 

plot(rand(10))

 


1

 

plot(1:10, rand(10))

 

 


열은 시리즈입니다

입력의 열은 y별도의 시리즈로 처리됩니다.

 


plot(rand(10, 2))

 

 

 

plot(1:10, rand(10, 2))

 

 

 

기능

x두 개의 배열을 미리 계산 하고 플로팅하는 대신 y, 함수를 Plots.jl에 직접 전달할 수 있습니다.


plot(sin)

 

 


plot([sin, cos])
이는 익명 함수의 좋은 사용 사례이기도 합니다.


plot([sin, x -> sin(x)^2, x -> sin(x)^3])

 

 

범위에 대한 함수

플로팅 범위를 더욱 세부적으로 제어하기 위해 x함수를 계산할 지점을 지정할 수 있습니다. 이 목적으로 배열과 범위를 모두 사용할 수 있습니다.


plot(0:0.5:10, [sin, cos])

 

 


수동으로 입력을 정의하는 대신 x다음 구문을 사용할 수도 있습니다 plot(function, lower_bound, upper_bound).



plot([sin, cos], 0, 10)

 

 

 

 

 

PlutoUI를 사용한 대화형 플롯

Pluto의 반응성은 PlutoUI 의 슬라이더를 사용하여 대화형 플롯을 제공합니다 .

1

using PlutoUI



1

@bind a Slider(2:0.1:5)



1
@bind b Slider(-5:5, default=0) # set default value

-10
1
@bind c Slider(-10:10, show_value=true) # show current value

 

 

 


plot(x -> a * x^2 + b * x + c, -4, 4)

 

 


여기에는 마법 같은 것이 없습니다. Pluto는 계수 a, 에 의존하는 모든 셀의 값이 변경될 때마다 해당 b셀 을 업데이트합니다.c

 

플롯 속성

교육적 목적으로 플롯 속성을 사용하여 플롯에 화려한 스타일을 추가해 보겠습니다.

plot(
    0:0.5:10,
    sin;
    # Text labels
    title="Trigonometric functions",
    xlabel="My x-axis label",
    ylabel="My y-axis label",
    label="sin",
    legend=:bottomright,
    # Line style
    color=:black,
    linestyle=:dash,
    linewidth=4,
    # Marker style
    markershape=:diamond,
    markersize=8,
    # Axis settings
    yscale=:identity,
    xflip=false,
    xlims=(0, 8),
    # Other
    background_color=:green,
    fontfamily="Helvetica",
    size=(600, 350),
    dpi=300,
)

 


이 플롯에는 몇 가지 공통 설정이 사용되었습니다. 더 많은 설정은 Plots.jl 문서 에서 확인하거나 다음을 쿼리하여 확인할 수 있습니다 plotattr.

1

plotattr("shape")


:markershape

Choose from [:none, :auto, :circle, :rect, :star5, :diamond, :hexagon, :cross, :xcross, :utriangle, :dtriangle, :rtriangle, :ltriangle, :pentagon, :heptagon, :octagon, :star4, :star6, :star7, :star8, :vline, :hline, :+, :x].

Aliases: (:markershapes, :shape).

Type: Union{Symbol, Plots.Shape, AbstractVector}.

`Series` attribute, defaults to `none`.
1

plotattr(:Axis)

 
Defined Axis attributes are:
discrete_values, draw_arrow, flip, foreground_color_axis, foreground_color_border, foreground_color_grid, foreground_color_guide, foreground_color_minor_grid, foreground_color_text, formatter, grid, gridalpha, gridlinewidth, gridstyle, guide, guide_position, guidefontcolor, guidefontfamily, guidefonthalign, guidefontrotation, guidefontsize, guidefontvalign, lims, link, minorgrid, minorgridalpha, minorgridlinewidth, minorgridstyle, minorticks, mirror, rotation, scale, showaxis, tick_direction, tickfontcolor, tickfontfamily, tickfonthalign, tickfontrotation, tickfontsize, tickfontvalign, ticks, unitformat, widen

 

 

 

순차적 플로팅

플롯은 다음을 사용하여 순차적으로 업데이트할 수도 있습니다 plot!.

begin
    my_plot = plot(sin; label="sin")
    plot!(my_plot, cos; label="cos")
    plot!(my_plot, tanh; label="tanh")

    title!(my_plot, "Trigonometric functions")
    xaxis!(my_plot, "My x-axis label")
    yaxis!(my_plot, "My y-axis label")
end

 

 

 

 


LaTeX 문자열

LaTeXStrings.jl 패키지 는 플롯 제목과 레이블에 방정식을 정의하는 데 사용할 수 있습니다.


using LaTeXStrings

 

 

이 LaTeX 문자열은 로 시작하며 L"..."Pluto 내부에서 잘 렌더링됩니다.



L"x = \frac{1}{\sqrt{2}}"

 


플로팅 백엔드에 따라 플롯 내부에서도 다음을 사용할 수 있습니다.

plot(sqrt; label=L"\sqrt{x}", title=L"A random equation: $\frac{1}{\sqrt{2}}$")



Plotly는 그러한 백엔드 중 하나가 아니므로 여기서는 이를 보여주지 않습니다.

 

서브 플롯

a를 지정하면 layout이전에 도입된 구문을 사용하여 하위 플롯을 지정할 수 있습니다.

my_subplots = plot([sin, cos], 0, 10; layout=(2, 1))



 

 

 

plot(rand(20, 12); layout=(4, 3), legend=false)


플롯을 "결합"할 수도 있습니다.

1

 

plot(my_plot, my_subplots)



 

plot(my_plot, my_subplots; layout=(2, 1))



더 복잡한 레이아웃에 대한 정보는 Plots.jl 문서 에서 확인할 수 있습니다 .

 

플롯 저장

플롯은 다음 함수를 사용하여 저장됩니다 savefig.

savefig("figure.png")       # save most recent figure
savefig(my_plot, "figure.png")  # save figure `my_plot`



모든 백엔드가 모든 파일 형식을 지원하는 것은 아니라는 점에 유의하세요 .

 

 

 

 

다른 플롯 유형

Plots.jl은 다양한 유형의 플롯을 제공합니다. 여기서는 몇 가지 플롯을 소개합니다.

--2D 플롯

 

 

scatter(rand(100)) # like plot, without "connecting the dots"

 

histogram(randn(10000))

 

 

 

histogram2d(randn(10000), randn(10000))

 

 

--3D 플롯


X = -10.0:0.2:10.0

X = range(-10, 10; length=101)

 

Y = -10.0:0.2:10.0

Y = range(-10, 10; length=101)

 



Z1 = X .* Y

 

plot(X, Y, Z1)



 

Z2 = [sin(sqrt(x^2 + y^2)) / sqrt(x^2 + y^2) for x in X, y in Y]

 

contour(X, Y, Z2; fill=true)

 

 

 

surface(X, Y, Z2)

 

 

 

 

 

 

 

 

데이터프레임.jl

DataFrames는 대규모 표 형식 데이터 세트(Excel 스프레드시트)를 처리하는 데 사용되는 데이터 구조입니다.

DataFrames.jl 사용법을 알아보기 위해 실제 사례를 살펴보겠습니다 . 저희는 기후 연구에 관심이 있어서 독일 기상청( Deutscher Wetterdienst , DWD) 에서 제공하는 공개 날씨 데이터를 다운로드했습니다 .




 

IOBuffer란 무엇인가요?

파일을 다운로드할 필요가 없도록 이 노트북에 데이터를 붙여 넣었습니다.

모든 것을 .로 묶으면 문자열이 아닌 실제 파일인 IOBuffer것처럼 가장할 수 있습니다 .csv_file

 

DataFrame에 데이터 로드

파일을 수동으로 구문 분석하는 대신 CSV.jl을 사용하여 모든 내용을 직접 읽습니다 DataFrame.

begin
    using CSV
    using DataFrames
end

 

raw_weather_data = CSV.read(
    csv_file,  # path to our file
    DataFrame; # read to DataFrame
    delim=';', # values are separated by ";"
)

 

 

 

 

 

데이터 프레임 인덱싱

DataFrame 인덱싱은 배열과 유사합니다.

 

raw_weather_data[1:3, :]

 

 

raw_weather_data[1:3, 2:4]



또한, 이름으로 인덱싱할 수 있습니다.

2021091900
2021091906
2021091912

 

raw_weather_data[1:3, :MESS_DATUM]

 

 

 

 

 

raw_weather_data[1:3, [:MESS_DATUM, :TT_TER]]



또는 이름으로 데이터에 직접 액세스:

 

raw_weather_data.MESS_DATUM



뷰는 예상대로 작동합니다.

 

 

@view raw_weather_data[1:3, [:MESS_DATUM, :TT_TER]]



더 많은 인덱싱 구문은 DataFrames.jl 문서 에서 확인할 수 있습니다 .

 

 

StatsPlots를 사용하여 데이터 프레임 플로팅

이 시점에서 데이터를 플로팅해 볼 수 있습니다. StatsPlots.jl 패키지는 DataFrames에 대한 여러 플로팅 레시피를 제공합니다. 매크로를 사용하면 열 이름을 기호로 지정하여 @df호출할 수 있습니다 (예: ).plot:column_name

MESS_DATUM측정 날짜와 시간에 해당하고 TT_TER측정된 기온은 다음과 같습니다.

using StatsPlots

 

 

 

@df raw_weather_data plot(:MESS_DATUM, :TT_TER)

 

 

 

안 돼!

6시간 간격으로 정기적으로 데이터를 샘플링했지만, 측정 시간의 정수 형식이 문제를 일으킨 것으로 보입니다 MESS_DATUM.

다음 슬라이드에서 이 문제를 해결하겠습니다!

 

 

특징 엔지니어링 Feature engineering

종종 DataFrame의 데이터를 변환해야 합니다. 예를 들어, 누락된 값을 정리하거나 열을 더 의미 있는 기능으로 결합해야 합니다.

MESS_DATUM예를 들어, 열의 날짜를 더 적합한 데이터 유형으로 구문 분석해 보겠습니다 . 현재는 큰 정수를 사용하여 날짜를 나타냅니다.



raw_weather_data.MESS_DATUM

 

 

--날짜 구문 분석

표준 라이브러리 패키지 Dates.jl은 데이터 유형을 제공 Date하고 DateTime문자열에 대한 구문 분석 기능이 내장되어 있습니다.

using Dates



이를 위해 DateFormat데이터가 다음과 같이 작성되어야 합니다.

format = dateformat"yyyymmddHH"

format = DateFormat("yyyymmddHH")


parse_date (generic function with 1 method)

parse_date(d::Integer) = DateTime(string(d), format)


이 함수를 열에 수동으로 적용하여 MESS_DATUM제대로 작동하는지 확인해 보겠습니다.

 

parse_date.(raw_weather_data.MESS_DATUM)

 

 

 

--DataFrame 변환

DataFrames.jl은 DataFrames 변환을 지원하는 세 가지 함수, 즉 combine, , 를 제공합니다 . 이러한 변환에 대한 자세한 내용은 DataFrames.jl 설명서 에서 확인할 수 있습니다 .selecttransform

DataFrame의 두 열에만 관심이 있으므로 다음을 사용하여 선택 select하고 변환합니다 MESS_DATUM.TT_TER

weather_data = select(
    raw_weather_data,
    :MESS_DATUM => ByRow(parse_date) => :date_time,
    :TT_TER => :air_temperature,
)


여기서는 DataFrames.jl에서 정의한 두 가지 패턴을 사용했습니다.

 source_column => transformation => target_column_name열을 변환하고 새 대상 이름으로 저장하려면
 source_column => target_column_name열 이름을 바꾸려면

기본적으로 이 transformation함수는 전체 열에 적용됩니다. DataFrames.jl은 각 데이터 포인트에 개별적으로 ByRow적용할 수 있는 유틸리티를 제공합니다.transformation

 

 

최종 결과

이제 데이터를 로드하고 정리했으므로 데이터를 플로팅하고 제목과 축 레이블을 추가할 수 있습니다.


 

@df weather_data plot(
    :date_time,
    :air_temperature,
    title="Air temperature in Berlin",
    xaxis="Time of measurement",
    yaxis="Temperature [°C]",
    marker=:rect,
    legend=false,
)

 

 

추가 자료

살펴볼 만한 다른 Julia 플로팅 패키지는 다음과 같습니다.

 Makie.jl : 강력한 대안 플로팅 생태계
● UnicodePlots.jl : Julia REPL의 플롯


julia> using UnicodePlots

julia> lineplot([sin, cos], 0, 2π)  # prints plot in color
           ┌────────────────────────────────────────┐
         1 │⠉⠓⢆⠀⠀⠀⡰⠊⠉⠉⠓⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠊⠉⠀⠀⠀⠀│ sin(x)
           │⠀⠀⠈⠱⣀⠎⠀⠀⠀⠀⠀⠈⠱⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⠀⠀⠀⠀⠀⠀⠀│ cos(x)
           │⠀⠀⠀⢀⠗⡄⠀⠀⠀⠀⠀⠀⠀⠑⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⠀⠀⠀│
           │⠀⠀⢀⠎⠀⢱⠀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀│
           │⠀⢀⡎⠀⠀⠀⢳⠀⠀⠀⠀⠀⠀⠀⠀⢳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
           │⠀⡜⠀⠀⠀⠀⠀⢇⠀⠀⠀⠀⠀⠀⠀⠀⢇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
           │⡰⠁⠀⠀⠀⠀⠀⠈⢆⠀⠀⠀⠀⠀⠀⠀⠈⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
   f(x)    │⠧⠤⠤⠤⠤⠤⠤⠤⠼⡤⠤⠤⠤⠤⠤⠤⠤⠼⡤⠤⠤⠤⠤⠤⠤⠤⢤⠧⠤⠤⠤⠤⠤⠤⠤⢤⠤⠤⠤⠤│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⠀⠀⠀⠀⠀⠀⠱⡀⠀⠀⠀⠀⠀⢀⠎⠀⠀⠀⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢣⠀⠀⠀⠀⠀⠀⠀⠀⢣⠀⠀⠀⠀⠀⡎⠀⠀⠀⠀⠀⠀⠀⠀⡎⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢇⠀⠀⠀⠀⠀⠀⠀⠈⢇⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣆⠀⠀⠀⠀⠀⠀⠀⠈⣆⠀⡰⠁⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡆⠀⠀⠀⠀⠀⠀⠀⠈⡶⠁⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢆⠀⠀⠀⠀⠀⢀⡰⠉⢆⠀⠀⠀⠀⠀⢀⡰⠁⠀⠀⠀⠀⠀⠀⠀⠀│
        -1 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⢄⣀⣀⡤⠎⠀⠀⠀⠱⢄⣀⣀⡤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
           └────────────────────────────────────────┘
           ⠀0⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀7⠀
           ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀x⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

 


강좌 웹사이트에서 이 노트북을 보고 계신다면 Ctrl + click링크가 필요할 수 있습니다. 또는 독립형 노트북을 사용하세요.

 

 

 

이 블로그의 관련 글

[AI 인공지능 머신러닝 딥러닝/Julia] - Julia 프로그래밍 - 언어 및 강의 소개

 

Julia 프로그래밍 - 언어 및 강의 소개

Julia 프로그래밍 언어줄리아(Julia)는 고성능의 수치 해석 및 계산과학의 필요 사항을 만족시키면서 일반 목적 프로그래밍에도 효과적으로 사용될 수 있도록 설계된 고급 동적 프로그래밍 언어이

inner-game.tistory.com

 

728x90
반응형
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
250x250