সময় সিরিজে দৈনিক ডেটা 20 বছর কীভাবে প্লট করা যায়


9

আমার কাছে নিম্নলিখিত ডেটাসেট রয়েছে: https://dl.rodbox.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
প্লটটি আসলে তেমন খারাপ নয় .... তবে কীভাবে এটি উন্নত করা যায় তার উপর নির্ভর করে আপনি কী জোর দিতে চান। আপনি কি সাপ্তাহিক ডেটা প্লট করতে চান? আপনি কি একটি মসৃণ লাইন যুক্ত করতে চান? আপনার অবশ্যই এক্স-অক্ষের লেবেলগুলি অবশ্যই পরিবর্তন করা উচিত ....
পিটার ফ্লম

হ্যাঁ আমি উদাহরণস্বরূপ এর মতো মসৃণ রেখাগুলি রাখতে চাই: dl.rodboxboxuu / 22681355 / Untitled.tiff , স্কেলটি যদি বছরের পর বছর থাকে তবে মসৃণ রেখাটি অপরিহার্য হবে। আমি টাইপটি "এল" তে পরিবর্তন করার চেষ্টা করেছি তবে এটি আসলে কিছুই করেনি।
dbr

ইন Rওয়ান ওয়ে মসৃণ লাইন যোগ করার জন্য করা হয় loess। আমি বাইরে যাচ্ছি, তবে আর এটিকে নিচু করে দেখুন এবং যদি আপনার সমস্যা হয় তবে আপনার পোস্টটি সম্পাদনা করুন এবং কেউ আপনাকে অবশ্যই সহায়তা করতে সক্ষম হবে। স্মুথ করার অন্যান্য পদ্ধতিও রয়েছে তবে আমি মনে করি লোস একটি ভাল ডিফল্ট।
পিটার ফ্লুম

উত্তর:


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

ঠিক আছে, যদি আপনার পক্ষে গড় না বাড়ানো জরুরী হয় তবে আমি সাপ্তাহিক ছুটির ফাঁকে ফাঁকে নমুনা কোড সরবরাহ করে উত্তরটি আপডেট করেছি।
দিমিত্রি ল্যাপটভ

@ ডিবিআর, যাইহোক, আপনি যদি দ্বিখণ্ডনে আর এর উপর নির্ভর করতে চান, তবে এটি অত্যন্ত সহজ হবে:plot(as.Date(oracle$Date), oracle$Open, type='l')
দিমিত্রি ল্যাপটভ

1
এবং যদি আপনি উইকএন্ডে কেবল ফাঁক চান, openValues <- c(openValues, mean(oracle$Open[i:i-1]))প্রথম পদ্ধতিতে লাইনটি প্রতিস্থাপন করুনopenValues <- c(openValues, NA)
দিমিত্রি ল্যাপটভ

9

যেহেতু সমস্যাটি অনেক পরিসংখ্যান সংক্রান্ত সফ্টওয়্যার পরিবেশে সাধারণ, তাই এটি আর-নির্দিষ্ট ফোরামে স্থানান্তরিত করার পরিবর্তে ক্রস ভ্যালিডেটে এখানে আলোচনা করুন (যেমন স্ট্যাকওভারফ্লো)।

বাস্তব সমস্যা যে 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]))

চূড়ান্ত চক্রান্ত


কোনও অর্থ ব্যক্তি নয়, তবে আমি theতু ট্রেন্ডিং ট্রিকটি পছন্দ করি।
জন রবার্টসন

@ জন মূলত রঙটি কেবল চোখের সাহায্যে যুক্ত করা হয়েছিল। তবে ফলাফলটি দেখে, আমি এটি আকর্ষণীয় মনে করি যে 2000 সালে ইন্টারনেট স্টক ব্লোআপের আগের ছয় বছরের মধ্যে পাঁচটি কমলা সপ্তাহে (প্রায় গ্রীষ্মের শেষের দিকে) সমস্ত শক্তিশালী wardর্ধ্বমুখী প্রবণতা প্রদর্শন করেছিল। পরে, সেই প্রবণতাটি নিখোঁজ হয়ে গেছে বলে মনে হয়।
whuber

আমি এটিও লক্ষ্য করেছি এবং ভাবলাম যে সম্পর্কটি যদি কোনও হয় তবে তা কী ছিল।
জন রবার্টসন

হুইবার এবং @ জন রবার্টসন - খুব ঘনিষ্ঠ সম্পর্কযুক্ত হতে পারে না তবে ১৯৯৯ সালে যখন মাইক্রোসফ্ট তাদের আধুনিক কোডবাসে সিকিএল সার্ভার .0.০ / এসকিএল সার্ভার ২০০০ এ সরিয়েছিল এবং ২০০০-এর মধ্যে তারা ওরাকলে আরও দৃ stronger় প্রতিযোগিতা সরবরাহ করেছিল: en.wikedia.org/wiki/ মাইক্রোসফ্ট_সকিউএল_সার্ভার # জেনেসিস
রব

1
@ আর আমি "তারিখ" লিখতাম would যদি এটি আপেক্ষিক তারিখ হয়, তবে - স্থান অনুমতি দেওয়া - আমি "জানুয়ারী 1, 1990 থেকে কিছু বছর" লিখতে চাই would এই উদাহরণে আমি আশা করি এটি স্পষ্ট যে শুধুমাত্র বহুবচন "বছর" করবে। বিটিডাব্লু, সাধারণত আমি সময় সম্পর্কিত ডেটাগুলি আপেক্ষিক তারিখগুলি ব্যবহার করে (সংখ্যার স্থায়িত্বের জন্য, পরিসংখ্যানের সংক্ষিপ্তসারগুলি পড়ার স্বাচ্ছন্দ্যের জন্য) ব্যবহার করে বিশ্লেষণ করি তবে তাদের আবার গ্রাফিকাল ডিসপ্লেগুলির জন্য প্রকৃত তারিখগুলিতে রূপান্তর করব (কারণ প্রদর্শনগুলি পরিমাপের অর্থপূর্ণ, ব্যাখ্যাযোগ্য একক ব্যবহার করা উচিত) ।
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

আমি মনে করি আর ধরে নিয়েছে যে যদি তারিখগুলি থাকে তবে সেগুলি ব্যবহারের জন্য রয়েছে, তাই আপনি যা চান না তাদের অপসারণ করা উচিত। সর্বোপরি, এটি কঠোর নয়, উপরের কোডটি বেশিরভাগই অতিমাত্রায় প্রচলিত, গুরুত্বপূর্ণ বিটটি অপসারণ এবং এটির জন্য কেবল একটি লাইন প্রয়োজন, যেমন মাইডিডিএফ <- মাইডিএফ [! (সপ্তাহের দিনগুলি (as.Date (mydf $ mydate))% c এ% ('শনিবার', 'রবিবার')),]
স্লোলায়ার্নার

কিন্তু তার ইতিমধ্যে ডেটাসেটে সরিয়ে শনিবার এবং রবিবার জন্য তারিখগুলি অন্তর্ভুক্ত করা হয় না
dbr

আহ। আপনার প্রশ্নটি আমি পুরোপুরি ভুল বুঝেছি। আপনি যদি কেবল ডেটা মসৃণ করতে চান তবে আমি সম্মত হই, লোসের মতো কিছু হ'ল উপায়, তবে এটি ডেটা পরিবর্তন করবে। অথবা, আপনি প্লটের একটি খুব, খুব বড় চিত্র তৈরি করতে পারেন যা বিশদটি দেখায়। উদাহরণস্বরূপ 20,000 পিক্সেল প্রশস্ত বা কিছু।
স্লোলায়ার্নার

এবং কীভাবে দিমিত্রি এর সমাধান ব্যবহার করার পরিবর্তে আগের এবং পরবর্তী মানটির পরিবর্তনের পরিবর্তে 0 এর গুণককে বোঝাচ্ছেন?
dbr

0

আপনার প্লটের চেহারা সম্পর্কে, আমি ধারণা করি যে এক্স-অক্ষের অধীনে একাধিক লেবেল যুক্ত করা এটি দৃশ্যত উন্নত করবে। প্রস্তাবিত প্লটের চেহারাটি আপনি এখানে দেখতে পারেন http://imgur.com/ZTNPniA

আমি এই জাতীয় প্লট কীভাবে তৈরি করব জানি না, এটি কেবল একটি ধারণা (যা আমি আর-তে উপলব্ধি করতে দেখিনি)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.