Гарантии столбца/валидации с Deedle

Есть ли способ выразить мысль о том, что фрейм данных уже проверен? Лучший способ, который я могу придумать, - это создать тип оболочки для ограничения доступа. Я приветствую любые предложения.

Простой пример:

#r "nuget: Deedle"

open Deedle

type CustomFrame = 
    | Some of Frame<int,string>
    | None
let map mapping option = match option with None -> None | Some x -> Some (mapping x)
let iter action option = match option with None -> () | Some x -> action x

let parse (df:Frame<_,_>) = 
    let keys = df.ColumnKeys |> Set.ofSeq
    if keys.Contains("Entry") && keys.Contains("Color") then
        df    
        |> Frame.indexRowsInt "Entry"
        |> CustomFrame.Some
    else
    CustomFrame.None

let go (df:CustomFrame) =
    df
    |> map (Frame.filterRowsBy "Color" "Red")

let data = "Entry;Color;N\n1;Red;7\n2;Blue;42\n3;Blue;21"
let bytes = System.Text.Encoding.UTF8.GetBytes data
let stream =  new MemoryStream( bytes )

Frame.ReadCsv(stream = stream,separators = ";",hasHeaders = true)
|> parse
|> go
|> iter (fun d-> d.Print())
     Color N 
1 -> Red   7 

Почему пользовательский клон option?

Fyodor Soikin 06.04.2022 01:26

Пример был упрощен. Часто у меня есть список функций, в которых я работаю со столбцами, созданными ранее в другой функции, например aggregate |> pivot |> calculateMin1 |> calculateMin2 |> select. Если я использую Option для всех из них, я не увижу ошибку, если я ошибусь в порядке.

jim108dev 07.04.2022 00:29

Используйте Result тогда?

Fyodor Soikin 07.04.2022 00:37

Предположим, я создаю столбец min1 в calculateMin1 и использую его в calculateMin2. Если все мои функции возвращают Ok frame, а я возвращаю aggregate |> pivot |> calculateMin2 |> calculateMin1 |> select. Он компилируется, и у меня есть проблема в моем производственном коде. Вы согласны?

jim108dev 07.04.2022 00:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Два предложения:

  • Пусть parse возвращает стандартное значение Option, как предлагает Федор.
  • Сократите вычисление, если проверка не пройдена. Другими словами, если parse возвращает None, вообще не вызывайте go и iter.

Если вы действительно хотите программировать с защитой после parse, и дальнейшая проверка не требуется, вам больше не нужно значение None. Таким образом, вы можете использовать упрощенный тип оболочки, чтобы всегда иметь проверенный кадр:

type ValidFrame = Valid of Frame<int,string>

let map f (Valid df) = f df |> Valid
let iter (f : _ -> unit) (Valid df) = f df
let go = map (Frame.filterRowsBy "Color" "Red")

А затем используйте его следующим образом:

Frame.ReadCsv(stream = stream,separators = ";",hasHeaders = true)
|> parse
|> Option.map (
    Valid
      >> go
      >> iter (fun df -> df.Print()))

Однако лично я считаю тип оболочки излишним, если для этого нет веской причины.

Короткое замыкание звучит интересно. Благодарю вас! Мне очень нравится тот факт, что Deedle обеспечивает некоторую простую в использовании безопасность индексов строк, и мне просто интересно, могу ли я иметь то же самое для имен столбцов. Типы оберток кажутся немного излишними, я согласен.

jim108dev 07.04.2022 00:40

Другие вопросы по теме