using Pkg
# Pkg.add("RollingFunctions")
using DataFrames
using CSV
using Statistics
using RollingFunctions
DataFrame(x=[1,2,3],y=4:6,z=9)
DataFrame([(x=1,y=2),(x=3,y=4)])
DataFrame("x"=>[1,2],"y"=>[3,4])
df = DataFrame(rand(5,3),[:x,:y,:z])
DataFrame(rand(5,3),:auto)
df = DataFrame(x=[2,1,2,4,3],y=[1,2,3,4,5],z=[5,4,3,2,1])
describe(df)
describe(df,:mean,:std)
function zsq(x)
x.^2
end
describe(df,zsq=>:k)
describe(df,extrema=>:extrema)
sort(df,:x)
sort(df,:x,rev = true)
sort(df,[:x,order(:y,rev=true)])
first(df,2)
last(df,1)
unique(df)
unique(DataFrame(x=[2,1,2,4,3],y=[1,2,1,4,5],z=[5,4,5,2,1]))
unique(df,[:x])
df = CSV.read("data/participation.csv",DataFrame)
filter(:lfp=> !=("no"),df)
@time filter(row->row.noc > 3,df)
@time filter(:noc=> >(3),df)
subset(df,:age => x-> x .> 6.0)
first(select(df,r"^n"),2)
first(select(df,Not([:nyc,:noc])))
df1 = df[:,:]
df1.lfp[1]="yes"
df2 = df1[!,[:lfp]]
df2.lfp[1] = "ko"
first(df1)
names(df)
nrow(df)
ncol(df)
propertynames(df)
Symbol.(names(df)) == propertynames(df)
columnindex(df,:nyc),columnindex(df,"nyc")
df3 = DataFrame(x1=[1,2,3,4],x2=[10,missing,30,40],
x3=[100,200,missing,400])
dropmissing(df3)
allowmissing(df3)
dropmissing!(df3)
df3
allowmissing(df3)
dropmissing(df)
allowmissing(df)
row의 모든 column에 missing이 없는 경우만 1, 아니면 0을 돌려 준다.
completecases(df)
select(df,:nyc=>cumsum)
select(df,:nyc=>cumprod)
select(df,:age=>(v->accumulate(min,v)))
select(df,:age=>(v->accumulate(max,v)))
select(df,:age=>v->cumsum(v) ./(1:length(v)))
select(df,:age=>(v->runmean(v,5)))
select(df,:age=>(v->runmin(v,5)))
using StatsBase
using ShiftedArrays
tmp01 =[30,4,4,2,4,2,11]
각 원소의 오름차순 정렬된 index를 돌려 준다
tmp01 |> ordinalrank
tmp01 |> competerank
결번이 없는 순차 index - 단 동일값에 대해서 동일 index를 부여
tmp01 |> denserank
# ordinal 순위에서 4의 순위가 3,4,5 이고 평균값이 4.0,
# 1의 순위가 1,2 이고 평균값이 1.5
# 순위 index의 평균값을 돌려 준다
tmp01 |> tiedrank
df_m = DataFrame([tmp01],[:x])
select(df_m,:x=>tiedrank)
tmp01을 위로 1칸 shift한다. 아래 빈곳은 missing으로 채운다.
tmp01 |> lead
tmp01을 위로 2칸 shift한다. 아래 빈곳은 missing으로 채운다.
tmp01 |> x->lead(x,2)
tmp01을 아래로 1칸 shift한다. 위의 빈곳은 missing으로 채운다.
tmp01 |> lag
tmp01을 아래로 2칸 shift한다. 위의 빈곳은 missing으로 채운다.
tmp01 |> x->lag(x,2)
select(df_m,:x=>lag)
using Chain
@chain df begin
filter(:lfp => ==("yes"),_)
groupby(:foreign)
combine(:educ=>mean)
end
import Pipe
Pipe.@pipe df |>
filter(:lfp => ==("yes"),_) |>
groupby(_,:foreign) |>
combine(_,:educ=>mean)
combine(df,:lnnlinc=>sum)
combine(df,:lnnlinc=>sum=>:lnnlinc)
combine(df,:age=>(x->mean(skipmissing(x)))=>:mean_age)
# 최대값을 구할 컬럼을 입력한다
# :age중의 최대값, :lnnlinc중의 최대값을 구함
combine(df,[:age,:lnnlinc].=>maximum)
# age가 6.2인 사람들의 정보
filter(:age=> ==(6.2),df)
# lnnlinc가 최대인 사람들의 정보
filter(:lnnlinc=> >=(12.375),df)
first(
transform(df,:lnnlinc=>mean=>:average_lnnlinc),
5)
# lnnlinc에 대해 5개의 이동평균을 구하고 moving_average_lnnlinc 컬럼에 추가하여
# 전체를 돌려준다
# 10 ~ 20번째 행을 보여줌
transform(df,:lnnlinc=>(x->runmean(x,5))=>:moving_average_lnnlinc)[10:15,:]
# 선택한 항목에 대해서 처리 하고 결과를 돌려 준다.
# 선택한 항목과 특정항목 예를들어 lnnlinc에 대해 5개의 이동평균을 구하고
# moving_average_lnnlinc 컬럼에 추가하여 돌려준다
select(df,:lfp,:lnnlinc,:lnnlinc => (x->runmean(x,5))=> :moving_average_lnnlinc )[10:15,:]
# row별로 원하는 컬럼에 대해 function을 적용한 결과를 새로운 컬럼에 추가 하여
# 전체를 돌려 준다.
transform(df,[:nyc,:noc]=>ByRow(+)=>:nc)[1:5,:]
select(df,:lfp,:age,[:nyc,:noc]=>ByRow(+)=>:nc)[1:5,:]
transform(df,:age=>ByRow(x->split(string(x),"."))=>[:f,:s])[1:5,:]
gdf1 = groupby(df,:educ)
keys(gdf1)
# tuple을 사용하여 key값으로 검색한다.
# 위 예제는 컬럼하나에 대해서 그룹을 했기 때문에 key의 차원은 1
# key값이 2번을 선택
gdf1[(2,)]
gdf2 = groupby(df,[:lfp,:educ])
keys(gdf2)
# tuple을 사용하여 key값으로 검색한다.
# 위 예제는 컬럼 두개에 대해서 그룹을 했기 때문에 key의 차원은 2
# key값이 yes, 2 인 그룹을 선택
gdf2[("yes",2)]
# 각 그룹에 대해 combine 수행
combine(gdf1,:age=>mean=>:average_age)
# 위와 같은 결과
combine(gdf1) do sdf
DataFrame(average_age=mean(sdf.age))
end
combine(gdf1,AsTable(:)=>(x->mean(x.age))=>:average_age)
# 각 그룹에 대해 combine 수행
combine(gdf2,:age=>mean=>:average_age)
df1 = DataFrame(id1=[1,2,3],x=[4,5,6],y=[7,8,9])
df2 = DataFrame(id2=[1,2,4,5],z=[10,11,12,13])
innerjoin(df1,df2,on=[:id1=>:id2])
leftjoin(df1,df2,on=[:id1=>:id2])
rightjoin(df1,df2,on=[:id1=>:id2])
outerjoin(df1,df2,on=[:id1=>:id2])
# df2의 id와 동일한 id를 가진 df1의 데이터를 돌려 준다
semijoin(df1,df2,on=[:id1=>:id2])
# df1의id와 df2의id를 비교하여 df2에 없는 df1의
# id에 해당 하는 데이터를 돌려 준다
antijoin(df1,df2,on=[:id1=>:id2])
df1 = DataFrame(id=[1,2],x=[4,5],y=[7,8])
df2 = DataFrame(id=[3,4],x=[10,11],y=[12,13])
vcat(df1,df2)
df1 = DataFrame(id=[1,2],x=[4,5])
df2 = DataFrame(y=[7,8])
hcat(df1,df2)