Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

Witam, mam do zrobienia projekt. Dane do tego projektu (fragment tabeli poniżej):


row.names Aktywo Zero Data Godzina Cena Ilość
1 1079618 1 0 20081002 90001 52.50 4675
2 1079619 2 0 20081002 90002 52.50 152
3 1079620 3 0 20081002 90005 52.50 12
4 1079621 4 0 20081002 90006 52.45 218
5 1079622 5 0 20081002 90011 52.50 29
6 1079623 6 0 20081002 90018 52.50 50
7 1079624 7 0 20081002 90028 52.50 24
8 1079625 8 0 20081002 90056 52.40 30
9 1079626 9 0 20081002 90102 52.45 179
10 1079627 10 0 20081002 90108 52.30 100
11 1079628 11 0 20081002 90134 52.20 300
12 1079629 12 0 20081002 90139 52.20 290
13 1079630 13 0 20081002 90141 52.40 100
14 1079631 14 0 20081002 90145 52.40 90
15 1079632 15 0 20081002 90216 52.25 600

Chodzi o to, żeby cały przedział czasowy podzielić na przedziały co 5 min i z każdego takiego przedziału wypisać pierwsze notowanie jakie występuje (jak nie występuje, to wpisać -5). Przedziały czasowe są zatem postaci:
[09:00:00 , 09:04:59) , [09:05:00 , 09:09:59) aż do [15:55:00, 16:00:00]. Z każdego takiego przedziału muszę wybrać pierwszą wartość odpowiadającej mu $Ceny, czyli :

Czyli (dla przedziału co 5 min), jeżeli mam:

Godzina Cena

90612 30,21
90624 30,34
90634 34,25
90713 21,17
90959 39,14
91503 29,17

To powinnam dostać coś takiego:

90000 -5 (bo nie ma godziny z przedziału [9:00:00, 9:04:59)
90500 30,21 (bo pierwszą godziną w przedziale [9:05:00, 9:09:59) jest 90612 a dla niej jest notowanie 30,21)
91000 -5
91500 29,17. Itd.

kolega podpowiedział mi, że dobrym pomysłem byłoby podzielenie wartości Godzina na 500 i wzięcie części całkowitej z tych danych:

90612 30,21
90624 30,34
90634 34,25
90713 21,17
90959 39,14
91503 29,17

otrzymujemy :

godziny, cena:
181 30,21
181 30,34
181 34,25
182 21,17
182 39,14
182 29,17

a poźniej "przejść" po całej tablicy i wybrać tylko po jednej wartości dal danej godziny. Byloby to dość łatwe, gdybym operowała tylko na jednym dniu... bo pewnie zastosowałabym komendę unique() , ale wiem, po dla dnia 20081002 mam serię {181,182,...320} , ale również dla następnego dnia mam taką samą serię danych. Zapewne trzeba zastosować jakąć pętlę, ale jaką i jak jej użyć do wszystkich dni? jak wstawić wartość {-5} gdy np nie będzie wartości np dla godziny 183?

Proszę o pomoc i wytłumaczenie jak "ciemnej masie", gdyż dopiero rozpoczęłam przygodę z "R" i nie jestem obeznana w komendach, a programować nigdy nie lubiłam ;/Barbara Ciepiela edytował(a) ten post dnia 24.03.12 o godzinie 22:01
Maciej B.

Maciej B. Doktorant

Temat: pomoc w projekcie w proramie "R"

Witam,

pakiet xts Ci pomoże. Kod poniżej.


library(xts)

#przykładowe dane

dane<-as.data.frame(matrix(c(20081002, 90612, 30.21 ,
20081002, 90624, 30.34,
20081002, 90634, 34.25,
20081002, 90713, 21.17,
20081002, 90959, 39.14,
20081002, 91503, 29.17),6,3,byrow=T))

### nazwy kolumn
names(dane)<-c("data","godzina","cena")

### uzupełniam zerami godzinę (do formatowania)
dane$godzina<-sprintf("%06d",dane$godzina)

### sklejam datę i godzinę
dane$DC<-paste(dane$data,dane$godzina,sep="")

### formatuję zmienna na odpowiednią datę
dane$DC<-strptime(dane$DC,format="%Y%m%d%H%M%S")

### tworzę plik dane2 (tak aby nie nadpisać wcześniejszego)
### pierwszy argument nasza zmienna dotycząca ceny, druga to sformatowana zmienna dot. czasu
dane2<-xts(dane$cena,dane$DC)

### korzystam z funkcji to.minutes5 - która odpowiada Twoim potrzebom.
### tworzy ceną otwarcia, najwyższą, najniższą oraz zamknięcia
to.minutes5(dane2)

Maciej B. edytował(a) ten post dnia 24.03.12 o godzinie 18:17
Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

Dziękuje, ale nie do końca o to mi chodziło, aczkolwiek wiele z tych rzeczy mi się teraz przydadzą.

Zrobiłam coś takiego:

dane<-as.data.frame(matrix(c(20081002, 90012, 30.21 ,0,20081002, 90424, 30.34,0,20081002, 90634, 34.25,0,20081002, 90713, 21.17,0,20081002, 90959, 39.14,0,20081002, 91503, 29.17,0),ncol=4,nrow=6,byrow=T))
names(dane)<-c("data","godzina","cena","połaczone")
dane$połaczone<-sprintf("%06d",dane$godzina)
dane$połaczone<-paste(dane$data,dane$połaczone,sep="")
dane$godzina<-dane$godzina%/%500

I otrzymałam



data godzina cena połaczone
1 20081002 180 30.21 20081002090012
2 20081002 180 30.34 20081002090424
3 20081002 181 34.25 20081002090634
4 20081002 181 21.17 20081002090713
5 20081002 181 39.14 20081002090959
6 20081002 183 29.17 20081002091503


Czyli liczby 180, 181 odpowiadają moim przedziałom
180 - [9:00:00-9:04:59)
181 - [9:05:00-9:09:59)
itd.

Gdybym miała więcej danych to ostatniemu przedziałowi, czyli godzinie [15:55:00 - 15:59:59] odpowiadałaby liczba 311. no i ewentualnie dla 16:00:00 wartość 320.

teraz interesuje mnie wybranie pojedynczej takich wartości 180, 181, idt i odpowiadajacej im daty.

Ale muszę pamiętać o tym, że ciągi 180-320 pojawiają mi się od nowa dla każdego dnia (nie w powyższym przykładzie, ale w moich właściwych danych). Potrzebuję zatem takiej pętli, która usunie mi powielenia liczb w ciągu 180- 311, ale również "oszczędzi" mi wszystkie dni tak, że moja finalna postać będzie następująca:


data godzina cena
1 20081002 180 30.21
2 20081002 181 30.34
3 20081003 180 34.25
4 20081003 181 21.17
5 20081003 182 39.14
6 20081003 183 29.17
Barbara Ciepiela edytował(a) ten post dnia 24.03.12 o godzinie 22:18
Maciej B.

Maciej B. Doktorant

Temat: pomoc w projekcie w proramie "R"

Może tak:

Funkcja ind zwraca pierwszy napotkany element a aggregate grupuje Ci według daty i godziny.


require(zoo)
ind<-function(x){
x<-as.matrix(cbind(index(x),x))
x[1,2]
}

aggregate(dane$cena,by=list(dane$data,dane$godzina),FUN=ind)



edit: dodałem, że potrzeba pakiet zoo bo nie zauważyłem tego wcześniej :)Maciej B. edytował(a) ten post dnia 25.03.12 o godzinie 23:16
Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

Ok, serdeczne dzięki za dotychczasową pomoc.
mam już coś takiego w moich danych:


1 647009 20070102 93000 88.90 2007-01-02 09:30:00
2 647019 20070102 93500 88.90 2007-01-02 09:35:00
3 647024 20070102 94000 89.50 2007-01-02 09:40:00
4 647045 20070102 94500 89.90 2007-01-02 09:45:00
5 647063 20070102 95000 90.10 2007-01-02 09:50:00
6 647087 20070102 100000 90.25 2007-01-02 10:00:00
7 647105 20070102 100500 90.75 2007-01-02 10:05:00
8 647117 20070102 101000 90.30 2007-01-02 10:10:00
9 647131 20070102 101500 90.65 2007-01-02 10:15:00
10 647142 20070102 102000 90.70 2007-01-02 10:20:00
11 647155 20070102 102500 90.80 2007-01-02 10:25:00


tabela ciągnie się aż do roku 2008. Moim zadaniem jest porównać każdy dzień i godzinę między 9:00:00 aż do 16:00 w odstępie 5 minut. Jeśli w danym dniu zabraknie mi jednej z godzin [9:00:00 , 9:05:00, 9:10:00, ...., 15:55:00, 16:00:00] to muszę taką godzinę dopisać, a w polu Godz wstawić {-5}.
Np. w tabeli powyżej nie ma daty: 2007-01-02 09:55:00, więc muszę ją dopisać rekord do tabeli z tą datą, a w polu Godz. wstawić {-5}.
Jak to zrobić?Barbara Ciepiela edytował(a) ten post dnia 26.03.12 o godzinie 13:21
Maciej B.

Maciej B. Doktorant

Temat: pomoc w projekcie w proramie "R"

Możesz wykorzystać funkcję difftime, która liczy Ci różnicę między datami. Gdy wartości będą większe od 5 a mniejsze od powiedzmy 100 minut to wtedy wstawisz funkcją ifelse -5.
Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

Probóbowałam rozgryźć to, ale udało mi się zrobić jedynie tyle:


for(i in 1:nrow(pdane2)) print(difftime(pdane2[i+1,4],pdane2[i,4],unit="auto"))


czyli zobaczyć jaka jest różnica pomiędzy kolejnymi wierszami.
Jak teraz dać ograniczenia na tę różnicę, że gdy jest >5 minut i mniejsza od 1dnego dnia to dodamy rekord z brakującą pięciominutówką i w polu $Godzina dla tego rekordu wpiszemy -5??Barbara Ciepiela edytował(a) ten post dnia 27.03.12 o godzinie 00:25

konto usunięte

Temat: pomoc w projekcie w proramie "R"

Barbara Ciepiela:
Ok, serdeczne dzięki za dotychczasową pomoc.
mam już coś takiego w moich danych:


1 647009 20070102 93000 88.90 2007-01-02 09:30:00
2 647019 20070102 93500 88.90 2007-01-02 09:35:00
3 647024 20070102 94000 89.50 2007-01-02 09:40:00
4 647045 20070102 94500 89.90 2007-01-02 09:45:00
5 647063 20070102 95000 90.10 2007-01-02 09:50:00
6 647087 20070102 100000 90.25 2007-01-02 10:00:00
7 647105 20070102 100500 90.75 2007-01-02 10:05:00
8 647117 20070102 101000 90.30 2007-01-02 10:10:00
9 647131 20070102 101500 90.65 2007-01-02 10:15:00
10 647142 20070102 102000 90.70 2007-01-02 10:20:00
11 647155 20070102 102500 90.80 2007-01-02 10:25:00

Np. w tabeli powyżej nie ma daty: 2007-01-02 09:55:00, więc muszę ją dopisać rekord do tabeli z tą datą, a w polu Godz. wstawić {-5}.
Jak to zrobić?

Ja bym to zrobił tak: wygenerował wszystkie możliwe daty:


wszystkie_daty=seq(as.POSIXct("2007-01-02 00:00:00"),as.POSIXct("2008-12-31 23:59:00"),by=300)


i połączył za pomocą polecenia merge z opcją fill="-5", z tabelą powyżej, po polu z datą i godziną. Możliwe, że trzeba będzie zmienić typ określający pola.
Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

Średnio rozumiem , gdyż komenda:

wszystkie_daty=seq(as.POSIXct("2007-01-02 00:00:00"),as.POSIXct("2008-12-31 23:59:00"),by=300)


zwraca mi coś takiego:

structure(c(1167692400, 1167692700, 1167693000, 1167693300, 1167693600,
1167693900, 1167694200, 1167694500, 1167694800, 1167695100, 1167695400,
1167695700, 1167696000, 1167696300, 1167696600, 1167696900, 1167697200,
1167697500, 1167697800, 1167698100, 1167698400, 1167698700, 1167699000,
1167699300, 1167699600, 1167699900, 1167700200, 1167700500, 1167700800,
1167701100, 1167701400, 1167701700, 1167702000, 1167702300, 1167702600,.....
Barbara Ciepiela edytował(a) ten post dnia 27.03.12 o godzinie 01:17
Barbara C.

Barbara C. Specjalista ds.
Kontroli Rachunkowej
Ksiąg

Temat: pomoc w projekcie w proramie "R"

tzn. ta funkcja wyświetla mi daty z danego przedziału, ale tylko przy użyciu "print", sama w sobie jest wektorem o współrzędnych takiej postaci jak wypisałam powyżej. Jak to zmienić?Barbara Ciepiela edytował(a) ten post dnia 27.03.12 o godzinie 17:40

Następna dyskusja:

pomoc w projekcie w prorami...




Wyślij zaproszenie do