2014-10-22 19 views
8

मैं पांडा समय-श्रृंखला के लिए बॉक्सप्लॉट कैसे बना सकता हूं जहां मेरे पास प्रत्येक दिन एक बॉक्स है? प्रति घंटा डेटा केपांडा में टाइम-सीरीज बॉक्सप्लॉट

नमूना डाटासेट जहां एक बॉक्स 24 मूल्यों से मिलकर चाहिए:

import pandas as pd 
n = 480 
ts = pd.Series(randn(n), 
       index=pd.date_range(start="2014-02-01", 
            periods=n, 
            freq="H")) 
ts.plot() 

मुझे पता है कि मैं दिन के लिए एक अतिरिक्त स्तंभ बना सकता हूँ, लेकिन मैं उचित x- अक्ष लेबलिंग करना चाहते हैं और एक्स-सीमा कार्यक्षमता (जैसे ts.plot()), इसलिए डेटाटाइम इंडेक्स के साथ काम करने में सक्षम होना बहुत अच्छा होगा।

आर/ggplot2 here के लिए एक समान सवाल है, यदि यह मेरी इच्छित चीज़ों को स्पष्ट करने में मदद करता है।

+1

इस [यहां] के लिए एक संभवतः अच्छे समाधान (है https://stackoverflow.com/questions/17194581/best-way-to-generate-day-of-week-boxplots-from-a- पांडा-टाइम्सरीज़) जो केवल पांडों का उपयोग करता है, इसका '.boxplot()' और '.pivot()' फ़ंक्शंस और Seaborn – cardamom

उत्तर

6

यदि यह आपके लिए एक विकल्प है, तो मैं Seaborn का उपयोग करने की सलाह दूंगा, जो Matplotlib के लिए एक रैपर है। आप अपने टाइमरीज़ से समूहों पर लूप करके इसे स्वयं कर सकते हैं, लेकिन यह बहुत अधिक काम है।

import pandas as pd 
import numpy as np 
import seaborn 
import matplotlib.pyplot as plt 

n = 480 
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H")) 


fig, ax = plt.subplots(figsize=(12,5)) 
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax) 

कौन देता है: enter image description here

ध्यान दें कि मैं Seaborn करने के लिए, अपने डेटा कई वर्षों यह काम नहीं होगा दिखाती है, तो day of year गुजर रहा हूँ grouper के रूप में। तो आप की तरह कुछ विचार कर सकते हैं: यदि आप एक समूहक के रूप में इस का उपयोग कर सकते

ts.index.to_series().apply(lambda x: x.strftime('%Y%m%d')) 

संपादित करें, 3-प्रति घंटा के लिए, लेकिन यह केवल काम करता है अगर कोई मिनट या कम परिभाषित कर रहे हैं। :

[(dt - datetime.timedelta(hours=int(dt.hour % 3))).strftime('%Y%m%d%H') for dt in ts.index] 
+0

की आवश्यकता नहीं है, वास्तव में मैं वास्तव में समुद्री शैवाल का उपयोग करता हूं, इसलिए यह निश्चित रूप से एक विकल्प है। धन्यवाद!/संपादित करें: मनमाने ढंग से समय के लिए इसका उपयोग करने का कोई तरीका है, उदा। 3 घंटे के बॉक्सप्लॉट, 7 दिन बॉक्सप्लॉट इत्यादि? –

+1

हां, आप Seaborns grouper को कुछ भी कर सकते हैं। चुनौती है कि समूह को श्रृंखला के सूचकांक से परिभाषित करना है। मैंने 3 घंटे की अवधि के लिए एक उदाहरण जोड़ा है। ऐसा कुछ समय के मनमाने ढंग से काम कर सकता है। दुर्भाग्य से यह बहुत पठनीय नहीं है, शायद पांडस 'टाइमग्राउपर' का उपयोग करके कुछ सरलीकरण संभव है। Seaborns grouper पर एक विशिष्ट प्रश्न खोलने से आपको उन लोगों से कुछ मदद मिल सकती है जो सेबर्न का बहुत उपयोग करते हैं, जो मैं नहीं हूं। –

5

(पर्याप्त प्रतिनिधि स्वीकार किए जाते हैं समाधान पर टिप्पणी करने से है, इसलिए बजाय एक जवाब जोड़ने।)

स्वीकार किए जाते हैं कोड दो छोटे त्रुटियाँ हैं: (1) numpy आयात और जोड़ने की जरूरत है (2) boxplot कथन में x और y पैरामीटर स्वैप करने के लिए nned। निम्नलिखित दिखाया गया साजिश पैदा करता है।

import numpy as np 
import pandas as pd 
import seaborn 
import matplotlib.pyplot as plt 

n = 480 
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H")) 

fig, ax = plt.subplots(figsize=(12,5)) 
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax) 
+0

आप सबसे अच्छे हैं! – zkytony

+0

ग्रेट। मैंने स्वीकृत उत्तर संपादित किया। –