टाइम सीरीज़ में 20 साल के डेली डेटा को कैसे प्लॉट किया जाए


9

मेरे पास निम्नलिखित डेटासेट हैं: https://dl.dropbox.com/u/22681355/ORACLE.csv और 'तारीख' द्वारा 'ओपन' में दैनिक बदलाव की साजिश करना चाहते हैं, इसलिए मैंने निम्नलिखित काम किया:

oracle <- read.csv(file="http://dl.dropbox.com/u/22681355/ORACLE.csv", header=TRUE)
plot(oracle$Date, oracle$Open, type="l")

और मुझे निम्नलिखित मिले:

यहाँ छवि विवरण दर्ज करें

अब यह स्पष्ट रूप से सबसे अच्छा प्लॉट नहीं है, इसलिए मैं सोच रहा हूं कि इस तरह के विस्तृत डेटा की साजिश रचने के लिए सही तरीका क्या है?


1
यह कथानक वास्तव में इतना बुरा नहीं है .... लेकिन इसे कैसे बेहतर बनाया जाए, इस पर निर्भर करता है कि आप किस चीज पर जोर देना चाहते हैं। क्या आप साप्ताहिक डेटा को बस प्लॉट करना चाहते हैं? क्या आप एक चिकनी रेखा जोड़ना चाहते हैं? आप X- अक्ष लेबल बदलने के लिए, निश्चित रूप से चाहिए ....
पीटर Flom

हाँ, मैं इस तरह की चिकनी रेखाएँ रखना चाहूँगा, उदाहरण के लिए: dl.dropbox.com/u/22681355/Untitled.tiff , यह ठीक है यदि पैमाना वर्षों में है, लेकिन चिकनी रेखा आवश्यक होगी। मैंने "l" प्रकार बदलने की कोशिश की है, लेकिन यह वास्तव में कुछ भी नहीं किया।
dbr

में Rएक तरह से चिकनी लाइनों को जोड़ने के लिए है loess। मैं अपने रास्ते पर हूं, लेकिन कोशिश करता हूं? आर में loess और, अगर आपको परेशानी है, तो अपनी पोस्ट को संपादित करें और कोई निश्चित रूप से आपकी मदद करने में सक्षम होगा। अन्य चौरसाई तरीके भी हैं, लेकिन मुझे लगता है कि लूस एक अच्छा डिफ़ॉल्ट है।
पीटर Flom

जवाबों:


8

आपके डेटा के साथ समस्या यह नहीं है कि यह बहुत विस्तृत है: आपके पास सप्ताहांत में कोई मूल्य नहीं है, यही कारण है कि इसे अंतराल के साथ प्लॉट किया गया है। इससे निपटने के दो तरीके हैं:

  1. या तो कुछ चौरसाई विधियों (साथ सप्ताहांत में अनुमानित मान अनुमान लगाने का प्रयास smooth.spline, loess, आदि)। सरल प्रक्षेप का कोड नीचे है। लेकिन इस मामले में आप डेटा के लिए कुछ "अप्राकृतिक" और कृत्रिम परिचय देंगे। इसलिए मैं दूसरा विकल्प पसंद करता हूं।
currentDate <- min(as.Date(oracle$Date))
dates <- c(currentDate)
openValues <- c(oracle$Open[5045])
i <- 5044
while (i > 0) {
  currentDate <- currentDate + 1;
  dates <- c(dates, currentDate)
  if (currentDate == as.Date(oracle$Date[i])) {
        # just copy value and move
        openValues <- c(openValues, oracle$Open[i])
        i <- i-1
      } else {
        # interpolate value
        openValues <- c(openValues, mean(oracle$Open[i:i-1]))
  }
}
plot(dates, openValues, type="l")
  1. आप दैनिक आधार से साप्ताहिक आधार पर जा सकते हैं, बस औसत (उदाहरण के लिए) पांच अनुक्रमिक बिंदु जो एक सप्ताह तक बेलॉग हैं (इस मामले में आप कुछ जानकारी "मार रहे हैं")। बस एक त्वरित उदाहरण है कि कैसे करना है
openValues = c(mean(oracle$Open[1:5]));
dates = c(as.Date(oracle$Date[1]));
for (i in seq(6,5045,5)) {
  openValues = c(openValues, mean(oracle$Open[i:i+5]));
      dates = c(dates, as.Date(oracle$Date[i]));
}
plot(dates, openValues, type="l")

आशा है कि यह मदद करेगा।


1
धन्यवाद, यह वास्तव में मददगार है। समस्या यह है कि चूंकि यह स्टॉक डेटा है, इसलिए दैनिक से साप्ताहिक आधार पर मोड़ निश्चित रूप से कुछ महत्वपूर्ण डेटा को 'मार' सकते हैं। क्या सप्ताहांत के लिए दिनों और खाली जगहों के लिए चिकनी लाइनें होने का कोई तरीका है?
dbr

ठीक है, अगर आपके लिए यह महत्वपूर्ण है कि आप औसत न करें, तो मैंने उत्तर को अपडेट कर दिया है, जो सप्ताहांत को प्रक्षेपित करने का नमूना कोड प्रदान करता है।
दिमित्री लापेतेव

@dbr वैसे, यदि आप प्रक्षेप में R पर निर्भर रहना चाहते हैं, तो यह बहुत आसान होगा:plot(as.Date(oracle$Date), oracle$Open, type='l')
दिमित्री लापेतेव

1
और अगर आप सप्ताहांत में बस अंतराल चाहते हैं, openValues <- c(openValues, mean(oracle$Open[i:i-1]))तो पहली विधि में लाइन को बदलेंopenValues <- c(openValues, NA)
दिमित्री लापेतेव

9

क्योंकि यह समस्या कई सांख्यिकीय सॉफ़्टवेयर वातावरणों के लिए सामान्य है, तो आइए इसे R-विशिष्ट फ़ोरम (जैसे StackOverflow) में माइग्रेट करने के बजाय क्रॉस वैलिडेट पर यहां चर्चा करें ।

असली मुद्दा यह है कि है Dateएक के रूप में व्यवहार किया जाता है कारक असतत चर --a - और लाइनों को ठीक से कनेक्ट नहीं किया जा रहा है। (और न ही बिंदुओं को क्षैतिज दिशा में बिल्कुल सटीक रूप से प्लॉट किया जा रहा है।)

प्लॉट की तुलना

दाहिने भूखंड को बनाने के लिए, Dateक्षेत्र को एक कारक से वास्तविक तिथि में बदल दिया गया था, प्रत्येक सप्ताह एक साधारण गणना (शनिवार और रविवार के बीच के सप्ताह को तोड़ते हुए) की पहचान की गई थी और सप्ताह के अंत में लूपिंग करके लाइनों को सप्ताहांत में बाधित किया गया था:

oracle$date <- as.Date(oracle$Date)
oracle$week.num <- (as.integer(oracle$date) + 3) %/% 7 
oracle$week <- as.Date(oracle$week.num * 7 - 3, as.Date("1970-01-01", "%Y-%m-%d"))

par(mfrow=c(1,2))
plot(as.factor(unclass(oracle$Date[1:120])), oracle$Open[1:120], type="l",
     main="Original Plot: Inset", xlab="Factor code")
plot(oracle$date[1:120], oracle$Open[1:120], type="n", ylab="Price", 
     main="Oracle Opening Prices")
tmp <- by(oracle[1:120,], oracle$week[1:120], function(x) lines(x$date, x$Open, lwd=2))

(प्रत्येक सप्ताह के बराबर की तारीख, उस सप्ताह का सोमवार देना, oracleडेटाफ़्रेम में भी संग्रहीत किया गया था क्योंकि यह साप्ताहिक एकत्रित डेटा की साजिश रचने के लिए उपयोगी हो सकता है।)

सभी डेटा को प्रदर्शित करने के लिए अंतिम पंक्ति का अनुकरण करके मूल इरादे को प्राप्त किया जा सकता है। मौसमी व्यवहार के बारे में कुछ जानकारी जोड़ने के लिए, निम्नलिखित कथानक प्रत्येक कैलेंडर वर्ष में सप्ताह के अनुसार रंग बदलता है:

par(mfrow=c(1,1))
colors <- terrain.colors(52)
plot(oracle$date, oracle$Open, type="n", main="Oracle Opening Prices")
tmp <- by(oracle, oracle$week, 
          function(x) lines(x$date, x$Open, col=colors[x$week.num %% 52 + 1]))

अंतिम साजिश


एक वित्त व्यक्ति नहीं, लेकिन मुझे मौसमी ट्रेंडिंग ट्रिक पसंद है।
जॉन रॉबर्टसन

@ जॉन मूल रूप से रंग सिर्फ आंख की सहायता के लिए जोड़ा गया था। लेकिन परिणाम को देखते हुए, मुझे यह दिलचस्प लगता है कि 2000 में इंटरनेट स्टॉक ब्लूपअप से पहले के छह वर्षों में, नारंगी सप्ताह (लगभग देर से गर्मियों में) ने सभी को मजबूत ऊपर की ओर प्रदर्शित किया था। बाद में, यह प्रवृत्ति गायब हो गई प्रतीत होती है।
whuber

मैंने यह भी देखा, और सोचा कि क्या रिश्ता है, यदि कोई हो, तो।
जॉन रॉबर्टसन

whuber और @John Robertson - शायद बहुत नज़दीकी से संबंधित न हों लेकिन 1998 तब भी था जब Microsoft Sql Server 7.0 / Sql Server 2000 के साथ अपने आधुनिक कोडबेस में चला गया था और 2000 तक वे Oracle: en.wikipedia.org/wiki/
रोब

1
@ और मैं "दिनांक" लिखूंगा। यदि यह सापेक्ष तिथियां हैं, तो - अंतरिक्ष की अनुमति - मैं कुछ साल "1 जनवरी, 1990 से लिखूंगा।" उस उदाहरण में मुझे आशा है कि यह स्पष्ट है कि केवल बहुवचन "वर्ष" ही करेगा। BTW, आमतौर पर मैं सापेक्ष तिथियों (संख्यात्मक स्थिरता के लिए, सांख्यिकीय सारांश पढ़ने में आसानी आदि) का उपयोग करके समय से संबंधित डेटा का विश्लेषण करेगा, लेकिन उन्हें ग्राफिकल डिस्प्ले के लिए वास्तविक तारीखों में बदल देगा (क्योंकि डिस्प्ले को माप की सार्थक, व्याख्यात्मक इकाइयों का उपयोग करना चाहिए) ।
whuber

1

मैं सप्ताहांत में हस्तक्षेप नहीं करूंगा। शनिवार को बहुत कम स्टॉक एक्सचेंज ट्रेड करते हैं और कोई भी जिसे मैं रविवार को जानता हूं। आप डेटा के लिए एक अनुमान लगा रहे हैं जो कभी अस्तित्व में नहीं था इसलिए डेटा सेट से सिर्फ शनिवार और रविवार को क्यों न निकालें? मैं नीचे जैसा कुछ करूंगा:

require(ggplot2)
require(scales)
require(gridExtra)
require(lubridate)
require(reshape)

set.seed(12345)

# Create data frame from random data
daysback <- 1000 # number of days, only a few for this example
startdate <- as.Date(format(now()), format = "%Y-%m-%d") - days(daysback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "day", length.out = daysback),
                   open = runif(daysback, min = 600, max = 800))

# Now that we have a data frame, remove the weekend days
mydf <- mydf[!(weekdays(as.Date(mydf$mydate)) %in% c('Saturday','Sunday')),] # remove weekend days
    # Calculate change, except for the first date
    mydf$diff <- c(NA, diff(mydf$open))
    # Remove first row with no 'diff' value
    firstdate <- head(mydf$mydate, 1)
mydf <- mydf[mydf$mydate > firstdate, ]

p <- ggplot(mydf, aes(x = mydate, y = diff)) +
    geom_bar(data = mydf, stat = "identity", fill = "red")

print(p)

हाँ, यह वही है जो मैं प्राप्त करना चाहूंगा। लेकिन वहाँ लाइनों के बीच खाली स्थान छोड़कर यह 'सप्ताहांत' छोड़ कर एक आसान तरीका नहीं है?
dbr

मुझे लगता है कि आर मानते हैं कि अगर तारीखें हैं, तो वे उपयोग किए जाने वाले हैं, इसलिए आपको उन लोगों को हटा देना चाहिए जिन्हें आप नहीं चाहते हैं। आखिरकार, यह मुश्किल नहीं है, ऊपर का कोड ज्यादातर अति-उपयोगी है, महत्वपूर्ण बिट को हटाना है और इसके लिए केवल एक लाइन की आवश्यकता है, यानी mydf <- mydf [! (कार्यदिवस (as.Date $ mydate))% c में%! ('शनिवार', 'रविवार')),]
धीरे

लेकिन इसके पहले से ही डेटासेट में हटा दिया गया है, शनिवार और रविवार की
तारीखें

आह। मुझे आपके सवाल का पूरी तरह से अंदाजा हो सकता है। यदि आप केवल डेटा को सुचारू करना चाहते हैं तो मैं सहमत हूं, कुछ ऐसा है जैसे कि जाने का रास्ता है, लेकिन यह डेटा को बदल देगा। या, आप प्लॉट की एक बहुत, बहुत बड़ी छवि बना सकते हैं जो विवरण दिखाता है। उदाहरण के लिए, 20,000 पिक्सल चौड़ा या कुछ और।
SlowLearner

और दिमित्री के समाधान का उपयोग करने के बारे में कैसे, लेकिन इसके बजाय पिछले और अगले मूल्य का मतलब केवल 0 को लागू करना है?
dbr

0

आपके कथानक के लुक के बारे में, मुझे लगता है कि एक्स-एक्सिस के तहत कई लेबलों को जोड़ने से नेत्रहीन रूप से इसमें सुधार होगा। सुझाए गए प्लॉट का लुक आप यहां देख सकते हैं http://imgur.com/ZTNPniA

मुझे नहीं पता कि इस तरह के कथानक कैसे बनते हैं, यह सिर्फ एक विचार है (जिसे मैंने आर में महसूस नहीं किया है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.