Как взвесить доходы населения в F #? - PullRequest
0 голосов
/ 09 июня 2018

Мои данные ниже.Я использую три столбца, и я хочу иметь возможность взвешивать доход по тому, сколько людей получают этот доход.Есть несколько примеров состояния, потому что каждый доход находится в отдельной полосе.Например:

State   Income    Pop

AL      45000     8500
AL      78000     7800
AL      80000     1200
TX      500000    500
TX      100000    700
TX      40000     8000
MO      100000    7000
MO      780000    1000
MO      79000     1500   

Я хочу взвесить доход по количеству людей из населения, которое входит в группу доходов.

Так что для AL мне нужно:

45000 * 8500/(8500+7800+1200) + 
78000 * 7800/(8500+7800+1200) + 
80000 * 1200/(8500+7800+1200)    =  The Total <- this is the number I need, PER State

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Другая опция

data
|> List.groupBy (fun x -> x.State)
|> List.map
    (fun (state, grp) ->
        let n, d = 
            List.fold 
                (fun (n, d) v -> 
                    n + v.Pop *  v.Income, d + v.Pop) 
                (0.0, 0.0) grp 
        state, n / d)

Если ваши данные отсортированы по состоянию, я думаю, для производительности было бы лучше использовать некоторую функцию сворачивания "прямо сейчас" вместо вызова groupBy сначала.

0 голосов
/ 09 июня 2018

Может быть, как-то так ...

type Data = 
    {State : string
     Income : float
     Pop : float }

let data = 
    [{State="AL"; Income=45000.; Pop=8500.};
     {State="AL"; Income=78000.; Pop=7800.};
     {State="AL"; Income=80000.; Pop=1200.};
     {State="TX"; Income=500000.;Pop= 500.};
     {State="TX"; Income=100000.;Pop= 700.};
     {State="TX"; Income=40000.; Pop=8000.};
     {State="MO"; Income=100000.;Pop= 7000.};
     {State="MO"; Income=780000.;Pop= 1000.};
     {State="MO"; Income=79000.; Pop=1500.} ]

data 
|> List.map(fun r -> r.State) 
|> List.distinct
|> List.map (fun state ->
    let stateRecords = data |> List.filter (fun r -> r.State = state)
    let statePopulation= stateRecords |> List.map (fun r -> r.Pop) |> List.sum
    let avg = stateRecords |> List.map (fun r -> r.Income * r.Pop / statePopulation) |> List.sum
    (state, avg)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...