Для логики цикла, чтобы отметить тип тренда для серии точек данных, глядя на будущие значения точек - PullRequest
1 голос
/ 03 июня 2019

Я использую цикл for, который проходит через серию точек данных и выясняет, как классифицировать тренд, который показывают данные

Вот логика для отметки точек:

  • Если 6 точек подряд имеют тенденцию к уменьшению / увеличению, пометить как «Тенденция к снижению» / «Тенденция к увеличению»
  • , в противном случае, если 7 точек подряд находятся ниже / выше среднего, пометить как «Ниже среднего "/" Выше среднего "

Мы отдаем приоритет растущему / убывающему тренду выше или выше среднего

Я думаю, что логика, которую я использую, неверна, но яЯ не уверен, почему.Вот некоторая логика в предложении для серии:

"Для каждой точки, если следующие 5 точек ниже этой, а затем их предыдущий партнер, отметьте все эти точки как" Снижение тренда ". Иначе, еслиточка не отмечена трендом, посмотрите, все ли следующие 6 точек из этой точки выше или ниже среднего значения "

Вы можете скопировать и вставить это в совокупности:

package main

import (
"bufio"
"fmt"
"os"
"strings"
)

type points struct {
    quantity   float64
    lowerBound float64
    upperBound float64
    mean       float64
    pattern    string
}

func main() {

var pointsToUse = []points{
    points{quantity: 3.5, lowerBound: 1, upperBound: 4.8,, mean: 4, pattern: "Common Variation"},

    points{
        quantity:   3.4,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.2,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.19,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.17,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.14,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.12,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.09,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   4.1,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3.16,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },

    points{
        quantity:   3,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3.11,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3.12,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3.14,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3.13,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Common Variation",
    },
    points{
        quantity:   3.17,
        lowerBound: 3,
        upperBound: 4.8,
        mean:       4,
        pattern:    "Commons Variation",
    },
}

for i, point := range pointsToUse {

    if len(pointsToUse) >= 6 && len(pointsToUse)-(i+1) >= 5 {
        if point.quantity > pointsToUse[i+1].quantity && pointsToUse[i+1].quantity > pointsToUse[i+2].quantity && pointsToUse[i+2].quantity > pointsToUse[i+3].quantity && pointsToUse[i+3].quantity > pointsToUse[i+4].quantity && pointsToUse[i+4].quantity > pointsToUse[i+5].quantity {
            point.pattern = "Decreasing Trend"
            pointsToUse[i+1].pattern = "Decreasing Trend"
            pointsToUse[i+2].pattern = "Decreasing Trend"
            pointsToUse[i+3].pattern = "Decreasing Trend"
            pointsToUse[i+4].pattern = "Decreasing Trend"
            pointsToUse[i+5].pattern = "Decreasing Trend"
            continue
        } else if point.quantity < pointsToUse[i+1].quantity && pointsToUse[i+1].quantity < pointsToUse[i+2].quantity && pointsToUse[i+2].quantity < pointsToUse[i+3].quantity && pointsToUse[i+3].quantity < pointsToUse[i+4].quantity && pointsToUse[i+4].quantity < pointsToUse[i+5].quantity {
            point.pattern = "Increasing Trend"
            pointsToUse[i+1].pattern = "Increasing Trend"
            pointsToUse[i+2].pattern = "Increasing Trend"
            pointsToUse[i+3].pattern = "Increasing Trend"
            pointsToUse[i+4].pattern = "Increasing Trend"
            pointsToUse[i+5].pattern = "Increasing Trend"
            continue
        }
    }
    if (point.pattern != "Decreasing Trend" || point.pattern != "Increasing Trend") && len(pointsToUse)-(i+1) >= 6 {
        if point.quantity < pointsToUse[i].mean && pointsToUse[i+1].quantity < pointsToUse[i].mean && pointsToUse[i].quantity < pointsToUse[i].mean && pointsToUse[i+3].quantity < pointsToUse[i].mean && pointsToUse[i+4].quantity < pointsToUse[i].mean && pointsToUse[i+5].quantity < pointsToUse[i].mean && pointsToUse[i+6].quantity < pointsToUse[i].mean {
            pointsToUse[i].pattern = "Below Mean"
            pointsToUse[i+1].pattern = "Below Mean"
            pointsToUse[i+2].pattern = "Below Mean"
            pointsToUse[i+3].pattern = "Below Mean"
            pointsToUse[i+4].pattern = "Below Mean"
            pointsToUse[i+5].pattern = "Below Mean"
            pointsToUse[i+6].pattern = "Below Mean"
        } else if point.quantity > pointsToUse[i].mean && pointsToUse[i+1].quantity > pointsToUse[i].mean && pointsToUse[i].quantity > pointsToUse[i].mean && pointsToUse[i+3].quantity > pointsToUse[i].mean && pointsToUse[i+4].quantity > pointsToUse[i].mean && pointsToUse[i+5].quantity < pointsToUse[i].mean && pointsToUse[i+6].quantity < pointsToUse[i].mean {
            pointsToUse[i].pattern = "Above Mean"
            pointsToUse[i+1].pattern = "Above Mean"
            pointsToUse[i+2].pattern = "Above Mean"
            pointsToUse[i+3].pattern = "Above Mean"
            pointsToUse[i+4].pattern = "Above Mean"
            pointsToUse[i+5].pattern = "Above Mean"
            pointsToUse[i+6].pattern = "Above Mean"
        }
    }
}

fmt.Println(pointsToUse)
}

Вывод, который мне нужно показать, таков:

3.50 | Decreasing Trend
3.40 | Decreasing Trend
3.20 | Decreasing Trend
3.19 | Decreasing Trend
3.17 | Decreasing Trend
3.14 | Decreasing Trend
3.12 | Decreasing Trend
3.09 | Decreasing Trend
4.1 | Common Variation
3.16 | Below Mean
3.00 | Below Mean
3.00 | Below Mean
3.11 | Below Mean
3.12 | Below Mean
3.14 | Below Mean
3.13 | Below Mean
3.17 | Below Mean

Может кто-нибудь определить, где я ошибаюсь?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

эта строка: if (point.pattern != "Decreasing Trend" || point.pattern != "Increasing Trend") && len(pointsToUse)-(i+1) >= 6 {

равно: if true && len(pointsToUse)-(i+1) >= 6 {

дополнительно, вам нужно использовать pointsToUse[i].pattern = "Decreasing Trend" вместо point.pattern = "Decreasing Trend", потому что point - это значение вашего цикла ине назначается в вашем срезе.

Почему for _,a := range b ссылается на копию, проверьте Измените значения во время итерации в Golang (вопрос stackoverflow)

1 голос
/ 03 июня 2019

Спасибо icza и sHartmann за то, что они указали мне правильное направление:

Полный цикл здесь:

    for i, point := range pointsToUse {

        if len(pointsToUse)-(i+1) >= 5 {
            if point.quantity > pointsToUse[i+1].quantity && pointsToUse[i+1].quantity > pointsToUse[i+2].quantity && pointsToUse[i+2].quantity > pointsToUse[i+3].quantity && pointsToUse[i+3].quantity > pointsToUse[i+4].quantity && pointsToUse[i+4].quantity > pointsToUse[i+5].quantity {
                pointsToUse[i].pattern = "Decreasing Trend"
                pointsToUse[i+1].pattern = "Decreasing Trend"
                pointsToUse[i+2].pattern = "Decreasing Trend"
                pointsToUse[i+3].pattern = "Decreasing Trend"
                pointsToUse[i+4].pattern = "Decreasing Trend"
                pointsToUse[i+5].pattern = "Decreasing Trend"
                continue
            } else if point.quantity < pointsToUse[i+1].quantity && pointsToUse[i+1].quantity < pointsToUse[i+2].quantity && pointsToUse[i+2].quantity < pointsToUse[i+3].quantity && pointsToUse[i+3].quantity < pointsToUse[i+4].quantity && pointsToUse[i+4].quantity < pointsToUse[i+5].quantity {
                pointsToUse[i].pattern = "Increasing Trend"
                pointsToUse[i+1].pattern = "Increasing Trend"
                pointsToUse[i+2].pattern = "Increasing Trend"
                pointsToUse[i+3].pattern = "Increasing Trend"
                pointsToUse[i+4].pattern = "Increasing Trend"
                pointsToUse[i+5].pattern = "Increasing Trend"
                continue
            }
        }

        if pointsToUse[i].pattern == "Decreasing Trend" || pointsToUse[i].pattern == "Increasing Trend" {
            continue
        } else if len(pointsToUse)-(i+1) >= 6 {
            if point.quantity < pointsToUse[i].mean && pointsToUse[i+1].quantity < pointsToUse[i].mean && pointsToUse[i].quantity < pointsToUse[i].mean && pointsToUse[i+3].quantity < pointsToUse[i].mean && pointsToUse[i+4].quantity < pointsToUse[i].mean && pointsToUse[i+5].quantity < pointsToUse[i].mean && pointsToUse[i+6].quantity < pointsToUse[i].mean {
                pointsToUse[i].pattern = "Below Mean"
                pointsToUse[i+1].pattern = "Below Mean"
                pointsToUse[i+2].pattern = "Below Mean"
                pointsToUse[i+3].pattern = "Below Mean"
                pointsToUse[i+4].pattern = "Below Mean"
                pointsToUse[i+5].pattern = "Below Mean"
                pointsToUse[i+6].pattern = "Below Mean"
            } else if point.quantity > pointsToUse[i].mean && pointsToUse[i+1].quantity > pointsToUse[i].mean && pointsToUse[i].quantity > pointsToUse[i].mean && pointsToUse[i+3].quantity > pointsToUse[i].mean && pointsToUse[i+4].quantity > pointsToUse[i].mean && pointsToUse[i+5].quantity < pointsToUse[i].mean && pointsToUse[i+6].quantity < pointsToUse[i].mean {
                pointsToUse[i].pattern = "Above Mean"
                pointsToUse[i+1].pattern = "Above Mean"
                pointsToUse[i+2].pattern = "Above Mean"
                pointsToUse[i+3].pattern = "Above Mean"
                pointsToUse[i+4].pattern = "Above Mean"
                pointsToUse[i+5].pattern = "Above Mean"
                pointsToUse[i+6].pattern = "Above Mean"
            }
        }
}

Одним из ключевых изменений, которые мне пришлось сделать, было внесениеОператор else для категоризации «Ниже / Выше», который следует из этого оператора, останавливает это приращение в цикле:

        if pointsToUse[i].pattern == "Decreasing Trend" || pointsToUse[i].pattern == "Increasing Trend" {
        continue
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...