2010-12-08 5 views
4

저는 현재 F #을 배우고 있으며 금융 시계열을 분석하기 위해이 도구를 사용하고 있습니다. 누구든지 시계열 데이터를 저장할 좋은 데이터 구조를 추천 할 수 있습니까?F #에 큰 시계열을 저장하는 간결하고 유용하며 효율적인 방법은 무엇입니까?

F #은 다양한 유형의 네이티브 유형을 제공하며 우아하고 간결하며 효율적인 솔루션을 제공하는 몇 가지 간단한 조합을 찾고 있습니다.

타임 스탬프가있는 수백만 개의 레코드와 누락 된 값이있는 숫자 및 텍스트 데이터의 여러 (~ 5-20) 필드로 구성된 매장 진드기 데이터를 찾고 있습니다.

첫 번째 생각은 아마도 일련의 튜플 또는 레코드 일 것입니다. 그러나 누군가가 현실 세계에서 잘 작동하는 것을 친절하게 제안 할 수 있는지 궁금합니다.

편집 : 명확한 설명을 위해

몇 가지 추가 포인트 :

내가 필요로 할 가능성이있어 일반적인 작업은 다음과 같습니다

  • 시간 기반 검색 - 즉, 가장 최근의 데이터 포인트를 찾을 수 주어진 시간에
  • 시간 기반 조인
  • 추가 (업데이트 및 삭제는 거의 발생하지 않습니다.)

필자는 주로 F #을 연구용 대화식 도구로 사용하여 (실제로 큰) 추가 보너스로 컴파일 할 수있는 기능을 탐색하고 있습니다.

ANOTHER 편집 : 나는 또한 언급해야

, 내 역할/F 번호의 사용이 데이터를 연구하지 개발에서 순전히이다. 일단 데이터를 이해하고 나면이를 더 잘 이해하고 나중에 개발자가 작성할 도구를 지정할 수 있습니다.

우리 모델은 계산 집약적이며 많은 메모리를 사용하며 항상 재귀 적으로 코딩 할 수는 없다는 점에 우려합니다. . 그래서 많은 사람들이 어쨌든 큰 덩어리를 질의해야합니다.

필자는 이러한 종류의 작업을 위해 항상 Matlab 또는 R을 사용해 왔지만 지금은 F #에 관심이 있습니다. 연구용 인터랙티브하고 높은 수준의 유연성을 제공하지만 동일한 코드를 사용할 수 있습니다. 생산.

처음에이 컨텍스트 정보를 제공하지 않아서 사과드립니다. (이것이 내 첫 번째 질문입니다.) 사람들이 대답을 할 수있게되었습니다.

저에게 도움이 된 모든 사람들에게 다시 한 번 감사드립니다.

+1

,하지만 당신이 정말로 시계열 분석을 위해 수백만 개의 레코드를로드해야합니까 :

여기에 F # 파워 팩에 LINQ 지원에 대한 돈 사임의 링크입니다? 내가 아는 한, 데이터 마이닝 모델은 무작위로 샘플링 된 데이터로 만들 수 있으며 임의로 샘플링 한 다른 데이터에서 테스트 할 수 있습니다. (모든 데이터베이스 행에서 모델을 빌드해야한다는 엄격한 요구가없는 한) –

+0

문제에 규모를 부여하기 위해 수백만 달러가 포함되었습니다. 물론 많은 레코드가 많은 응용 프로그램에서로드 될 필요가 없으며 편의성,로드 효율성 및 사용 된 메모리간에 트레이드 오프가있을 수 있습니다. 서브 샘플링, 이동하는 윈도우 등을 사용할 수 있습니다. 그러나 진드기의 큰 더미가 편리한 경우가 있습니다. 예를 들어 광범위한 시간 규모에 걸쳐 데이터 집계의 영향을 실험하고있는 경우입니다. –

+1

즉, 처음에는 데이터를 일부 데이터베이스 저장소에 집계해야합니다. 일반적으로 이러한 집계는 데이터웨어 하우스에서 수행됩니다. 그 후에는 이미 집계 된 (효율적인/소형) 데이터에서 데이터 마이닝을 수행 할 수 있습니다. –

답변

2

데이터 구조의 최선의 선택은 사용자가 원하는 작업에 따라 다릅니다.

가장 간단한 것은 구조체의 배열입니다. 이것은 빠른 무작위 검색, 압축되지 않은 표현을위한 좋은 공간 효율성 및 좋은 지역성의 장점이 있습니다. 하위 구조 (문자열과 같은) 사이에 공유가있는 경우 공유하여 공유하도록하십시오.

대안은 디스크에서 필요할 때로드되는 seq 일 수 있습니다. 요소를 빠르게 추가 할 수있는 단일 연결 목록 또는 임의 위치에 효율적으로 삽입하는 등의 작업을 효율적으로 수행 할 수있는 균형 이진 이진 트리가 있습니다.

+0

감사합니다. Jon, 시도해 볼만한 몇 가지 좋은 제안입니다. 마음에 들지 않으면 몇 가지 질문이 있습니다. 첫 번째 두 가지 제안에 대해 어떻게 시간을 기준으로 액세스합니까? 나는 당신이 문자열을 '인턴'하는 것이 무슨 뜻인지 모르겠다. (미안 나는 지난 10 년 동안 Matlab을 사용 해왔다) F #의 우아한 기능적 특성에 가장 잘 어울리겠습니까? - 예 : 주문형 Seq의 아이디어가 마음에 든다 –

+1

배열의 요소가 시간순으로 정렬되어 있으면 이진 검색을 사용하여 O (* log n *)에서 찾을 수 있습니다. 'seq' 또는'list'는 선형 검색이 필요합니다. 시간을 키로하는 균형 이진 검색 트리도 O (* log n *)입니다. .NET에서 hash consing * 및'System.String.Intern'을 읽으십시오 (구조적으로 동일한 값을 다시 사용한다는 의미입니다). –

+1

사실, F #의'Map'은 키와 값 (즉 사전)을 연결하는 균형 이진 트리를 제공하지만 관련 값을 찾으려면 정확한 시간 (키)을 알아야합니다. 자신 만의 균형 잡힌 검색 트리를 구축했다면 시간의 범위에서 효율적으로 값을 찾을 수있을 것입니다.하지만 말했듯이, 모든 것은 데이터로 효율적으로 수행해야하는 작업에 달려 있습니다. –

4

데이터를 저장하고 관계형 데이터베이스에서 쿼리해야합니다 (현재 저장되어있는 위치는 어디입니까?) : 여러 필드가있는 수백만 개의 레코드를 메모리에로드하는 것은 값 비싼 작업이어야하며 오래된 데이터로 남을 수 있습니다. 어려움을 유지하는 어려움). 그리고 F # LINQ to SQL 구현 (Power Pack에서 찾을 수 있다고 생각합니다)을 사용하여 F # 표현식을 SQL 표현식으로 변환 할 수 있습니다. ... 나는 매우 확실하지 않다 http://blogs.msdn.com/b/dsyme/archive/2009/10/23/a-quick-refresh-on-query-support-in-the-f-power-pack.aspx

+0

스티븐 감사합니다. 나는 그것을 들여다 볼 것이다. 확실히이 데이터를 데이터베이스로 옮기는 계획입니다. 그러나 연구원으로서 데이터를 이해하고 db를 설정하는 방법을 지정하기 위해 데이터를 사용하는 방법을 이해하려면 몇 가지 실험을해야합니다. 내가 조사해야 할 한 가지 관심사는있다. 우리는이 데이터를 사용하여 많은 계산을 수행합니다. 예를 들어 다양한 시간 프레임에 걸쳐 여러 적응 형 모델을 유지 관리 할 수 ​​있습니다. 모두 재귀 적으로 코딩 할 수있는 것은 아닙니다. db가이 계산을위한 최적의 장소가 아니기 때문에 어쨌든 큰 덩어리를 쿼리해야 할 수도 있습니다. –

+1

데이터가 실제 크기보다 큰 경우 관계형 데이터베이스는 시간 낭비입니다. 즉 틱 데이터입니다. db를 사용하려면 열 기반 연산자를 시계열 연산자로 사용하십시오. –

+1

@ 스티브, 나는 당신을 믿습니다. 필자는 관계형에 대해 간단하게 설명했는데, F #은 LINQ to SQL 구현과 함께 제공되므로 익숙한 것입니다. 어쩌면 OP의 도움이 될 것입니다. 당신이 말한 데이터베이스 종류의 구현에 이름을 짓는다면 (적어도 관심이있을 것입니다). –