Codes for chapters 1, 2, and 3
This commit is contained in:
442
ch02.jl
Normal file
442
ch02.jl
Normal file
@@ -0,0 +1,442 @@
|
||||
# Bogumił Kamiński, 2021
|
||||
|
||||
# Codes for chapter 2
|
||||
|
||||
# Code for listing 2.1
|
||||
|
||||
1
|
||||
true
|
||||
"Hello world!"
|
||||
0.1
|
||||
[1, 2, 3]
|
||||
|
||||
# Code for listing 2.2
|
||||
|
||||
typeof(1)
|
||||
typeof(true)
|
||||
typeof("Hello world!")
|
||||
typeof(0.1)
|
||||
typeof([1, 2, 3])
|
||||
|
||||
# Code for showing bit representation of numbers
|
||||
|
||||
bitstring(1)
|
||||
bitstring(1.0)
|
||||
bitstring(Int8(1))
|
||||
|
||||
# Code showing to what Int alias expands
|
||||
|
||||
Int
|
||||
|
||||
# Code for checking if value is of some type
|
||||
|
||||
[1, 2, 3] isa Vector{Int}
|
||||
[1, 2, 3] isa Array{Int64, 1}
|
||||
|
||||
# Code for section 2.2
|
||||
|
||||
x = 1
|
||||
y = [1, 2, 3]
|
||||
|
||||
x = 1
|
||||
x
|
||||
typeof(x)
|
||||
x = 0.1
|
||||
x
|
||||
typeof(x)
|
||||
|
||||
Kamiński = 1
|
||||
x₁ = 0.5
|
||||
ε = 0.0001
|
||||
|
||||
?₁
|
||||
?ε
|
||||
|
||||
# Code for listing 2.3
|
||||
|
||||
x = -7
|
||||
if x > 0
|
||||
println("positive")
|
||||
elseif x < 0
|
||||
println("negative")
|
||||
elseif x == 0
|
||||
println("zero")
|
||||
else
|
||||
println("unexpected condition")
|
||||
end
|
||||
|
||||
# Code showing that logical condition must be Bool
|
||||
|
||||
x = -7
|
||||
if x
|
||||
println("condition was true")
|
||||
end
|
||||
|
||||
# Code showing comparisons against NaN
|
||||
|
||||
NaN > 0
|
||||
NaN >= 0
|
||||
NaN < 0
|
||||
NaN <= 0
|
||||
NaN == 0
|
||||
|
||||
NaN != 0
|
||||
NaN != NaN
|
||||
|
||||
# Code showing that floating point arithmetic is only approximate
|
||||
|
||||
0.1 + 0.2 == 0.3
|
||||
|
||||
0.1 + 0.2
|
||||
|
||||
isapprox(0.1 + 0.2, 0.3)
|
||||
|
||||
0.1 + 0.2 ≈ 0.3
|
||||
|
||||
# Code showing combining conditions
|
||||
|
||||
x = -7
|
||||
x > 0 && x < 10
|
||||
x < 0 || log(x) > 10
|
||||
|
||||
x = -7
|
||||
log(x)
|
||||
|
||||
# Code showing typical one-line conditional execution expressions
|
||||
|
||||
x = -7
|
||||
x < 0 && println(x^2)
|
||||
iseven(x) || println("x is odd")
|
||||
|
||||
x = -7
|
||||
if x < 0
|
||||
println(x^2)
|
||||
end
|
||||
if !iseven(x)
|
||||
println("x is odd")
|
||||
end
|
||||
|
||||
x = -7
|
||||
if x < 0 && x^2
|
||||
println("inside if")
|
||||
end
|
||||
|
||||
# Code showing ternary operator
|
||||
|
||||
x = -7
|
||||
x > 0 ? println("x is positive") : println("x is not positive")
|
||||
|
||||
# Code from listing 2.4
|
||||
|
||||
for i in [1, 2, 3]
|
||||
println(i, " is ", isodd(i) ? "odd" : "even")
|
||||
end
|
||||
|
||||
# Code from listing 2.5
|
||||
|
||||
i = 1
|
||||
while i < 4
|
||||
println(i, " is ", isodd(i) ? "odd" : "even")
|
||||
global i += 1
|
||||
end
|
||||
|
||||
# Code showing break and continue keywords
|
||||
|
||||
i = 0
|
||||
while true
|
||||
global i += 1
|
||||
i > 6 && break
|
||||
isodd(i) && continue
|
||||
println(i, " is even")
|
||||
end
|
||||
|
||||
# Code from listing 2.6
|
||||
|
||||
x = -7
|
||||
x < 0 && begin
|
||||
println(x)
|
||||
x += 1
|
||||
println(x)
|
||||
2 * x
|
||||
end
|
||||
x > 0 ? (println(x); x) : (x += 1; println(x); x)
|
||||
|
||||
# Code from section 2.3.4
|
||||
|
||||
x = [8, 3, 1, 5, 7]
|
||||
k = 1
|
||||
|
||||
y = sort(x)
|
||||
|
||||
for i in 1:k
|
||||
y[i] = y[k + 1]
|
||||
y[end - i + 1] = y[end - k]
|
||||
end
|
||||
y
|
||||
|
||||
s = 0
|
||||
for v in y
|
||||
s += v
|
||||
end
|
||||
s
|
||||
s / length(y)
|
||||
|
||||
# Code from listing 2.7
|
||||
|
||||
function times_two(x)
|
||||
return 2 * x
|
||||
end
|
||||
times_two(10)
|
||||
|
||||
# Code from listing 2.8
|
||||
|
||||
function compose(x, y=10; a, b=10)
|
||||
return x, y, a, b
|
||||
end
|
||||
compose(1, 2; a=3, b=4)
|
||||
compose(1, 2; a=3)
|
||||
compose(1; a=3)
|
||||
compose(1)
|
||||
compose(; a=3)
|
||||
|
||||
# Code from listing 2.9
|
||||
|
||||
times_two(x) = 2 * x
|
||||
compose(x, y=10; a, b=10) = x, y, a, b
|
||||
|
||||
# Code showing the use of map function
|
||||
|
||||
map(times_two, [1, 2, 3])
|
||||
|
||||
# Code from listing 2.10
|
||||
|
||||
map(x -> 2 * x, [1, 2, 3])
|
||||
|
||||
# Code showing sum taking a function as a first argument
|
||||
|
||||
sum(x -> x ^ 2, [1, 2, 3])
|
||||
|
||||
# Code showing do-end syntax
|
||||
|
||||
sum([1, 2, 3]) do x
|
||||
println("processing ", x)
|
||||
return x ^ 2
|
||||
end
|
||||
|
||||
# Code showing the difference between sort and sort!
|
||||
|
||||
x = [5, 1, 3, 2]
|
||||
sort(x)
|
||||
x
|
||||
sort!(x)
|
||||
x
|
||||
|
||||
# Code showing a simple implementation of winsorized_mean function
|
||||
|
||||
function winsorized_mean(x, k)
|
||||
y = sort(x)
|
||||
for i in 1:k
|
||||
y[i] = y[k + 1]
|
||||
y[end - i + 1] = y[end - k]
|
||||
end
|
||||
s = 0
|
||||
for v in y
|
||||
s += v
|
||||
end
|
||||
return s / length(y)
|
||||
end
|
||||
winsorized_mean([8, 3, 1, 5, 7], 1)
|
||||
|
||||
# Code from section 2.5
|
||||
|
||||
function fun1()
|
||||
x = 1
|
||||
return x + 1
|
||||
end
|
||||
fun1()
|
||||
x
|
||||
|
||||
function fun2()
|
||||
if true
|
||||
x = 10
|
||||
end
|
||||
return x
|
||||
end
|
||||
fun2()
|
||||
|
||||
function fun3()
|
||||
x = 0
|
||||
for i in [1, 2, 3]
|
||||
if i == 2
|
||||
x = 2
|
||||
end
|
||||
end
|
||||
return x
|
||||
end
|
||||
fun3()
|
||||
|
||||
function fun4()
|
||||
for i in [1, 2, 3]
|
||||
if i == 2
|
||||
x = 2
|
||||
end
|
||||
end
|
||||
return x
|
||||
end
|
||||
fun4()
|
||||
|
||||
function fun5()
|
||||
for i in [1, 2, 3]
|
||||
if i == 1
|
||||
x = 1
|
||||
else
|
||||
x += 1
|
||||
end
|
||||
println(x)
|
||||
end
|
||||
end
|
||||
fun5()
|
||||
|
||||
function fun6()
|
||||
x = 0
|
||||
for i in [1, 2, 3]
|
||||
if i == 1
|
||||
x = 1
|
||||
else
|
||||
x += 1
|
||||
end
|
||||
println(x)
|
||||
end
|
||||
end
|
||||
fun6()
|
||||
|
||||
# Code from section 2.6
|
||||
|
||||
methods(cd)
|
||||
|
||||
sum isa Function
|
||||
|
||||
typeof(sum)
|
||||
typeof(sum) == Function
|
||||
|
||||
supertype(typeof(sum))
|
||||
|
||||
function traverse(T)
|
||||
println(T)
|
||||
T == Any || traverse(supertype(T))
|
||||
return nothing
|
||||
end
|
||||
traverse(Int64)
|
||||
|
||||
function print_subtypes(T, indent_level=0)
|
||||
println(" " ^ indent_level, T)
|
||||
for S in subtypes(T)
|
||||
print_subtypes(S, indent_level + 2)
|
||||
end
|
||||
return nothing
|
||||
end
|
||||
print_subtypes(Integer)
|
||||
|
||||
traverse(typeof([1.0, 2.0, 3.0]))
|
||||
traverse(typeof(1:3))
|
||||
|
||||
AbstractVector
|
||||
|
||||
typejoin(typeof([1.0, 2.0, 3.0]), typeof(1:3))
|
||||
|
||||
# Code from section 2.7
|
||||
|
||||
fun(x) = println("unsupported type")
|
||||
fun(x::Number) = println("a number was passed")
|
||||
fun(x::Float64) = println("a Float64 value")
|
||||
methods(fun)
|
||||
|
||||
fun("hello!")
|
||||
fun(1)
|
||||
fun(1.0)
|
||||
|
||||
bar(x, y) = "no numbers passed"
|
||||
bar(x::Number, y) = "first argument is a number"
|
||||
bar(x, y::Number) = "second argument is a number"
|
||||
bar("hello", "world")
|
||||
bar(1, "world")
|
||||
bar("hello", 2)
|
||||
bar(1, 2)
|
||||
|
||||
bar(x::Number, y::Number) = "both arguments are numbers"
|
||||
bar(1, 2)
|
||||
methods(bar)
|
||||
|
||||
function winsorized_mean(x::AbstractVector, k::Integer)
|
||||
k >= 0 || throw(ArgumentError("k must be non-negative"))
|
||||
length(x) > 2 * k || throw(ArgumentError("k is too large"))
|
||||
y = sort!(collect(x))
|
||||
for i in 1:k
|
||||
y[i] = y[k + 1]
|
||||
y[end - i + 1] = y[end - k]
|
||||
end
|
||||
return sum(y) / length(y)
|
||||
end
|
||||
|
||||
winsorized_mean([8, 3, 1, 5, 7], 1)
|
||||
winsorized_mean(1:10, 2)
|
||||
winsorized_mean(1:10, "a")
|
||||
winsorized_mean(10, 1)
|
||||
|
||||
winsorized_mean(1:10, -1)
|
||||
winsorized_mean(1:10, 5)
|
||||
|
||||
# Code from section 2.8
|
||||
|
||||
import Statistics
|
||||
x = [1, 2, 3]
|
||||
mean(x)
|
||||
Statistics.mean(x)
|
||||
|
||||
using Statistics
|
||||
mean(x)
|
||||
|
||||
# start a fresh Julia session before running this code
|
||||
mean = 1
|
||||
using Statistics
|
||||
mean
|
||||
|
||||
# start a fresh Julia session before running this code
|
||||
using Statistics
|
||||
mean([1, 2, 3])
|
||||
mean = 1
|
||||
|
||||
# start a fresh Julia session before running this code
|
||||
using Statistics
|
||||
mean = 1
|
||||
mean([1, 2, 3])
|
||||
|
||||
# start a fresh Julia session before running this code
|
||||
using Statistics
|
||||
using StatsBase
|
||||
?winsor
|
||||
mean(winsor([8, 3, 1, 5, 7], count=1))
|
||||
|
||||
# Code from section 2.9
|
||||
|
||||
@time 1 + 2
|
||||
|
||||
@time(1 + 2)
|
||||
|
||||
@assert 1 == 2 "1 is not equal 2"
|
||||
@assert(1 == 2, "1 is not equal 2")
|
||||
|
||||
@macroexpand @assert(1 == 2, "1 is not equal 2")
|
||||
|
||||
@macroexpand @time 1 + 2
|
||||
|
||||
# before running these codes
|
||||
# define the winsorized_mean function using the code from section 2.7
|
||||
|
||||
using BenchmarkTools
|
||||
x = rand(10^6);
|
||||
@benchmark winsorized_mean($x, 10^5)
|
||||
using Statistics, StatsBase
|
||||
@benchmark mean(winsor($x; count=10^5))
|
||||
|
||||
@edit winsor(x, count=10^5)
|
||||
Reference in New Issue
Block a user