Funkcja liniowa, trend liniowy

Dzisiaj pokażę jak zrobić w naszym programie funkcję trendu liniowego. Funkcja liniowa przydaje się do wizualnego reprezentowania trendu panującego w naszych zmiennych. Jeśli mamy wiele zmiennych i nie wiemy czy tendencja zmiennych jest spadkowa czy zwyżkowa nasz wykres nam to zilustruje i sami będziemy mogli to ocenić. Na obrazku zamieściłem wizualizacje takiego trendu w excelu:

trend_w_exceluCoś o tym trendzie można poczytać tutaj: Trend liniowy [5 stron]

Wersja excelowa: trend_liniowy

Warto zanim zaczniemy budować sql’a spróbować zrobić sobie taki trend w excelu aby sprawdzić czy wszystko rozumiemy. Tak prosto nie będzie, gdyż nie możemy dodać lokalnej bazy danych w programie visual studio 2012. Baza ta jest typu *.sdf i nie obsługuje „subselect’ów”.Potrzebujemy albo bazy typu *.mdf (baza serwera SQL) albo bazy danych typu *.mdb (baza programu access). Ja użyje bazy danych typu *.mdb. Stworze ją w programie „MDB Plus” dostępnego w dziale „Przydatne programy do vb.net”. Moja baza danych wygląda tak:

Trend_liniowy_5

Jeśli ktoś nie wie jak utworzyć bazę danych w programie MDBPlus to zapraszam do działu technicznego. Teraz tak na prawdę musimy wzór na funkcje liniową trochę przekształcić. Najważniejszym elementem jest „a” więc najpierw przekształcimy sobie właśnie to „a”.

 

Trend_liniowy_6

W SQL’u będzie to wyglądało tak:

select id,t, ilosci,
((select sum(t*ilosci) as Expr1
from trend_liniowy as trend_liniowy_1)
-
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_2)
*
(Select sum(ilosci) as Expr1
from trend_liniowy as trend_liniowy_3))
/
((select sum(t^2) as Expr1
from trend_liniowy as trend_liniowy_4)
-
2*(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_5)
*
(select sum(t) as Expr1                               
from trend_liniowy as trend_liniowy_6)
+                                              
(select max(t) as Expr1
from trend_liniowy as trend_liniowy_7)
*
(select avg(t)^2 as Expr1
from trend_liniowy as trend_liniowy_8))
as tre
from trend_liniowy
group by id,t,ilosci

Po wykonaniu zapytania otrzymamy:

Trend_liniowy_7

 

Jeśli widzieliście plik excel to tam też a wyszło równe 5,16 teraz już tylko formalność

Trend_liniowy_8

select id,t, ilosci,
(select avg(ilosci) as Expr1
from trend_liniowy as trend_liniowy_0)
-
((select sum(t*ilosci) as Expr1
from trend_liniowy as trend_liniowy_1)
-
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_2)
*
(Select sum(ilosci) as Expr1
from trend_liniowy as trend_liniowy_3))
/
((select sum(t^2) as Expr1
from trend_liniowy as trend_liniowy_4)
-
2*(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_5)
*
(select sum(t) as Expr1                               
from trend_liniowy as trend_liniowy_6)
+                                              
(select max(t) as Expr1
from trend_liniowy as trend_liniowy_7)
*
(select avg(t)^2 as Expr1
from trend_liniowy as trend_liniowy_8))
*
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_9)
as tre
from trend_liniowy
group by id,t,ilosci

Tak i tutaj wyszło b=9,54

Trend_liniowy_9

 

teraz wystarczy tylko to połączyć i otrzymujemy trend liniowy :]

select id,t, ilosci,

((select sum(t*ilosci) as Expr1
from trend_liniowy as trend_liniowy_1)
-
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_2)
*
(Select sum(ilosci) as Expr1
from trend_liniowy as trend_liniowy_3))
/
((select sum(t^2) as Expr1
from trend_liniowy as trend_liniowy_4)
-
2*(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_5)
*
(select sum(t) as Expr1
from trend_liniowy as trend_liniowy_6)
+                                              
(select max(t) as Expr1
from trend_liniowy as trend_liniowy_7)
*
(select avg(t)^2 as Expr1
from trend_liniowy as trend_liniowy_8))
*t+
(select avg(ilosci) as Expr1
from trend_liniowy as trend_liniowy_0)
-
((select sum(t*ilosci) as Expr1
from trend_liniowy as trend_liniowy_1)
-
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_2)
*
(Select sum(ilosci) as Expr1
from trend_liniowy as trend_liniowy_3))
/
((select sum(t^2) as Expr1
from trend_liniowy as trend_liniowy_4)
-
2*(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_5)
*
(select sum(t) as Expr1
from trend_liniowy as trend_liniowy_6)
+                                              
(select max(t) as Expr1
from trend_liniowy as trend_liniowy_7)
*
(select avg(t)^2 as Expr1
from trend_liniowy as trend_liniowy_8))
*
(select avg(t) as Expr1
from trend_liniowy as trend_liniowy_9)
as tre
from trend_liniowy
group by id,t,ilosci

Trend_liniowy_10

Trend_liniowy_11

Dla porównania Dane z Excela i dane z MdbPlus. Więc Querry mamy z głowy teraz dla tych którzy nie wiedzą jak wykorzystać to w praktyce zrobimy sobie program, podczepimy bazę damych *.mdb i wyświetlimy te dane w oknie wykresu.

 

Teraz tworzymy nowy projekt i będziemy montować naszą bazę danych. Gdy przygotujemy już pusty projekt, kopiujemy naszą bazę danych do folderu projektu dokładnie tutaj:

Trend_liniowy_4

 

Wracamy do naszego projektu. Musimy dodać moduł robimy to tak:

Trend_liniowy_2

 

A po dodaniu po prawej stronie powinien pojawić nam się nowy element modułu:

Trend_liniowy_3

 

Teraz tworzymy publiczne połączenie do naszej bazy danych. Wygląda ono tak:

Imports System.Data
Imports System.Data.Odbc
Module Module1
    Public con As New OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};DBQ=|DataDirectory|\trend_liniowy.mdb;")
End Module

Gdzie w DBQ wpisujemy lokalizacje naszej bazy danych i jej nazwę. |DataDirectory| oznacza, że plik znajduje się w folderze z aplikacją. Przechodzimy do naszej formy głównej i tworzymy połączenie:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Con.open()
    End Sub
End Class

Odpalamy nasz program. Jeśli wszystko jest dobrze powinna pojawić nam się czysta forma. Jeśli wystąpi błąd należy sprawdzić parametry połączenia. Teraz dodajemy do naszej formy wykres („Chart”). Znajdziemy go w „Przyborniku”, przenosimy na naszą formę.

Trend_liniowy_12

Po prawej stronie znajdujemy we właściwościach naszego wykresu opcje „Series”.

Trend_liniowy_13

Dodajemy jeszcze jedną serie danych:

Trend_liniowy_14

zmieniamy jej typ na „line” jeśli pierwsza seria jest typu „column” warto jej również zmienić typ na „line”. Warto tutaj poeksperymentować z „Seies”, „Legends” i „ChartAreas” aby nasz wykres nabrał trochę zarówno czytelności jak i wyglądu. Po kilku zmianach mój wykres wygląda tak:

Trend_liniowy_15

 

Wracamy do naszego kodu i wypełniamy nasz wykres danymi z tabeli. Kod do tego służący wygląda tak:

Imports System.Data.Odbc
Imports System.Windows.Forms.DataVisualization.Charting


Public Class Form1
    Dim cmd As New OdbcCommand
    Dim dat As OdbcDataReader

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        con.Open()
        Dim querry As String
        querry = "select id,t, ilosci, round(((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1)-(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2)*(Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3))/((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4)-2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5)*(select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6)+(select max(t) as Expr1 from trend_liniowy as trend_liniowy_7)*(select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8))*t+(select avg(ilosci) as Expr1 from trend_liniowy as trend_liniowy_0)-((select sum(t*ilosci) as Expr1 from trend_liniowy as trend_liniowy_1)-(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_2)*(Select sum(ilosci) as Expr1 from trend_liniowy as trend_liniowy_3))/((select sum(t^2) as Expr1 from trend_liniowy as trend_liniowy_4)-2*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_5)*(select sum(t) as Expr1 from trend_liniowy as trend_liniowy_6)+(select max(t) as Expr1 from trend_liniowy as trend_liniowy_7)*(select avg(t)^2 as Expr1 from trend_liniowy as trend_liniowy_8))*(select avg(t) as Expr1 from trend_liniowy as trend_liniowy_9),2) as tre from trend_liniowy group by id,t,ilosci"
        Try
            cmd = New OdbcCommand(querry, con)
            dat = cmd.ExecuteReader

            Dim ds As New DataSet
            Dim oData As New OdbcDataAdapter(querry, con)
            oData.Fill(ds, "Table1")
            Chart1.DataSource = ds.Tables("Table1")

            Dim Series1 As Series = Chart1.Series("Series1")
            Dim Series2 As Series = Chart1.Series("Series2")

            Series1.Name = "Sprzedaż"
            Chart1.Series(Series1.Name).XValueMember = "t"
            Chart1.Series(Series1.Name).YValueMembers = "ilosci"

            Series2.Name = "Trend liniowy"
            Chart1.Series(Series2.Name).XValueMember = "t"
            Chart1.Series(Series2.Name).YValueMembers = "tre"

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            con.Close()
        End Try
    End Sub
End Class

To by było na tyle. Jeśli ktoś ma jakieś pytania proszę je zostawić w komentarzach albo pisać na maila.

cały program do pobrania:  trend_liniowy

 

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/funkcja-liniowa-trend-liniowy/

Dodaj komentarz

Twój adres email nie będzie publikowany.