2010-12-21 2 views
9

이전 질문 (Working with heterogenous data in a statically typed language)에서 형식이 지정되지 않은 CSV 파일을 조작하는 등의 F #에서 데이터 분석의 표준 작업을 처리하는 방법에 대해 질문했습니다. 동적되는 언어의이 F 번호에F # 형식 공급자 및 데이터 처리

data = load('income.csv') 
data.log_income = log(income) 

같은 기본 작업에 탁월, 가장 우아한 방법은 물음표 (?) 연산자 것으로 보인다. 불행하게도 우리는 정적 타이핑을 잃어 버렸고 여전히 여기 저기에 타입 애노테이션이 필요합니다.

F #의 가장 흥미로운 미래 기능 중 하나는 Type Providers입니다. 유형 안전성을 최소한으로 잃어 버리면 CSV 유형 공급자가 파일을 동적으로 검사하여 유형을 제공 할 수 있습니다.

그러나 데이터 분석은 일반적으로 중단되지 않습니다. 우리는 종종 작업의 파이프 라인을 통해 데이터를 변형하고 새로운 데이터 세트를 생성합니다. 우리가 데이터를 대부분 조작하는 경우 입력 공급자가 도움이 될 수 있습니까? 예를 들면 다음과 같습니다.

open CSV // Type provider 
let data = CSV(file='income.csv') // Type provider magic (syntax?) 
let log_income = log(data.income) // works! 

이것은 작동하지만 전역 이름 공간을 오염시킵니다. 새로운 변수를 만드는 것보다는 열 추가에 대해 생각하는 것이 더 자연스러운 경우가 있습니다. 할 수있는 방법이 있습니까?

let data.logIncome = log(data.income) // won't work, sadly. 

유형 제공자는 목표에서 새 파생 데이터 세트 또는 정리 된 데이터 세트를 만들 때 (?) 연산자를 사용하지 못하도록합니까?

아마도 같은 :

let newdata = colBind data {logIncome = log(data.income)} // ugly, does it work? 

다른 아이디어?

답변

6

짧은 대답은 아니오입니다. 긴 대답은 예 (하지만 결과가 마음에 들지 않습니다)입니다. 기억해야 할 중요한 점은 F #이 정적으로 입력 된 언어 인 경우 전체 중지입니다.

제공 한 코드의 경우 newData에는 어떤 유형이 있습니까? 컴파일 타임에 고정 할 수 없다면, Obj로 /로부터의 캐스팅에 의지 할 필요가 있습니다.

// newdata MUST have a static type, even if obj 
let newdata = colBind data {logIncome = log(data.income)} 

colBind을 상상해은 다음과 sinature 있습니다

val colBind: Thingey<'a> -> 'b -> Thingey2<'a, 'b> 

실제로 방법을 작동합니다,하지만 보편적으로 작동하지 않을 것입니다. 결과적으로 컴파일시에는 존재하지 않는 유형이 필요하기 때문입니다.

F 유형 공급자를 사용하면 에 정적으로 데이터를 표준 컴파일 타임 환경 외부에서 발생시키는 것으로 허용합니다. 그러나 유형은 여전히 ​​정적입니다. 런타임에 이러한 유형을 동적으로 변경할 수있는 방법은 없습니다 *.

*DynamicObject과 같은 속임수를 사용하여 런타임에 개체를 수정할 수 있습니다. 그러나 일단 이 길을 잃기 시작하면 Intellisense와 같은 정적으로 입력 된 언어의 모든 이점을 잃게됩니다. (어느 것이 먼저 F #을 사용하는 주된 이유입니다.)

개념적으로, 당신이하고 싶은 일은 직설적입니다.System.Data.DataTable 유형에는 이미 동적으로 열을 추가 할 수있는 표 형식의 데이터를 저장하는 개념이 있습니다. 그러나 추가 된 열의 유형 정보는 컴파일 타임에 알려지지 않으므로 해당 열에 저장된 객체는 Obj로 처리되고 런타임에 캐스팅되어야합니다.

0

또는 필요한 열이있는 테이블을 사용하여 '에서'및 '대상'테이블을 만들 수 있습니다. 그런 식으로 형식 공급자가 사용하는 정적 형식의 쿼리 및 결과 스키마가 있습니다.