2014-04-01 16 views
14

साथ समय श्रृंखला डेटा मैं निम्नलिखित का उपयोग कर एक पूरी तरह यादृच्छिक Dataframe बनाने कहते हैं:साजिश Seaborn

from pandas.util import testing 
from random import randrange 

def random_date(start, end): 
    delta = end - start 
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds 
    random_second = randrange(int_delta) 
    return start + timedelta(seconds=random_second) 

def rand_dataframe(): 
    df = testing.makeDataFrame() 
    df['date'] = [random_date(datetime.date(2014,3,18),datetime.date(2014,4,1)) for x in xrange(df.shape[0])] 
    df.sort(columns=['date'], inplace=True)  
    return df 

df = rand_dataframe() 

जो dataframe इस पोस्ट के नीचे दिखाया गया का परिणाम है।

enter image description here

मैं इस समस्या को कैसे संपर्क कर सकते हैं: मुझे लगता है कि मैं इन पंक्तियों के साथ कुछ पाने मेरे कॉलम तो seaborn में timeseries दृश्य सुविधाओं का उपयोग कर A, B, C और D प्लॉट करने के लिए चाहते हैं? क्या मैं this notebook पर पढ़ा से, कॉल किया जाना चाहिए:

sns.tsplot(df, time="time", unit="unit", condition="condition", value="value") 

लेकिन यह आवश्यक है कि dataframe कॉलम किसी भी तरह time, unit, condition और value एन्कोडिंग है, जो नहीं है के साथ एक अलग तरीके से प्रस्तुत किया जाता है, लगता है मेरा मामला। मैं इस प्रारूप में अपना डेटाफ्रेम (नीचे दिखाया गया) कैसे परिवर्तित कर सकता हूं? (ध्यान दें

 date   A   B   C   D 

2014-03-18 1.223777 0.356887 1.201624 1.968612 
2014-03-18 0.160730 1.888415 0.306334 0.203939 
2014-03-18 -0.203101 -0.161298 2.426540 0.056791 
2014-03-18 -1.350102 0.990093 0.495406 0.036215 
2014-03-18 -1.862960 2.673009 -0.545336 -0.925385 
2014-03-19 0.238281 0.468102 -0.150869 0.955069 
2014-03-20 1.575317 0.811892 0.198165 1.117805 
2014-03-20 0.822698 -0.398840 -1.277511 0.811691 
2014-03-20 2.143201 -0.827853 -0.989221 1.088297 
2014-03-20 0.299331 1.144311 -0.387854 0.209612 
2014-03-20 1.284111 -0.470287 -0.172949 -0.792020 
2014-03-22 1.031994 1.059394 0.037627 0.101246 
2014-03-22 0.889149 0.724618 0.459405 1.023127 
2014-03-23 -1.136320 -0.396265 -1.833737 1.478656 
2014-03-23 -0.740400 -0.644395 -1.221330 0.321805 
2014-03-23 -0.443021 -0.172013 0.020392 -2.368532 
2014-03-23 1.063545 0.039607 1.673722 1.707222 
2014-03-24 0.865192 -0.036810 -1.162648 0.947431 
2014-03-24 -1.671451 0.979238 -0.701093 -1.204192 
2014-03-26 -1.903534 -1.550349 0.267547 -0.585541 
2014-03-27 2.515671 -0.271228 -1.993744 -0.671797 
2014-03-27 1.728133 -0.423410 -0.620908 1.430503 
2014-03-28 -1.446037 -0.229452 -0.996486 0.120554 
2014-03-28 -0.664443 -0.665207 0.512771 0.066071 
2014-03-29 -1.093379 -0.936449 -0.930999 0.389743 
2014-03-29 1.205712 -0.356070 -0.595944 0.702238 
2014-03-29 -1.069506 0.358093 1.217409 -2.286798 
2014-03-29 2.441311 1.391739 -0.838139 0.226026 
2014-03-31 1.471447 -0.987615 0.201999 1.228070 
2014-03-31 -0.050524 0.539846 0.133359 -0.833252 

अंत में, मैं क्या देख रहा हूँ भूखंडों की का ओवरले (प्रति स्तंभ एक), जहां उनमें से प्रत्येक के रूप में निम्नानुसार लग रहा है की है कि विभिन्न मूल्यों:

यहाँ मेरी dataframe है

                       : सीआई alphas के विभिन्न मान) मिलता है              enter image description here

+0

आप '

हालांकि, यह है कि मुश्किल matplotlib और पांडा का एक मिश्रण है कि मैं क्या लगता है कि तुम चाहते हो जाएगा साथ आने के लिए नहीं है आपके सूचकांक में डुप्लिकेट तिथियां मिली हैं। जानबूझकर? यदि हां, तो इसका क्या महत्व है? –

+0

धन्यवाद @PaulH यह जानबूझकर है, हालांकि उन्हें एक कॉलम में ले जाया जा सकता है। मेरे पास प्रति दिन कई नमूने हैं और मैं साजिश में बैंड की मोटाई में प्रति दिन उस परिवर्तनशीलता को कैप्चर करना चाहता हूं। –

+0

तो वर्बोज़ होने के लिए, लाइन स्वयं किसी दिए गए दिनांक के लिए औसत मान से आती है और छायांकित बैंड न्यूनतम और अधिकतम से घिरा हुआ है? –

उत्तर

34

मुझे नहीं लगता कि tsplot डेटा से अपने आप के साथ काम करने जा रहा है। इनपुट डेटा के बारे में धारणाएं यह होती हैं कि आपने प्रत्येक टाइमपॉइंट पर एक ही इकाइयों का नमूना लिया है (हालांकि आप कुछ इकाइयों के लिए टाइमपॉइंट्स खो सकते हैं)।

उदाहरण के लिए, कहें कि आप एक महीने के लिए हर दिन एक ही व्यक्ति से रक्तचाप को मापते हैं, और फिर आप स्थिति के अनुसार औसत रक्तचाप को प्लॉट करना चाहते थे (जहां शायद "हालत" चर वह आहार है)। tsplot यह कॉल कर सकता है, जिसमें sns.tsplot(df, time="day", unit="person", condition="diet", value="blood_pressure")

यह परिदृश्य विभिन्न आहारों पर लोगों के बड़े समूहों से अलग है और प्रत्येक दिन यादृच्छिक रूप से प्रत्येक समूह से कुछ नमूनाकरण और उनके रक्तचाप को मापने से अलग होता है। आपके द्वारा दिए गए उदाहरण से, ऐसा लगता है कि आपके डेटा को इस तरह संरचित किया गया है।

# Read in the data from the stackoverflow question 
df = pd.read_clipboard().iloc[1:] 

# Convert it to "long-form" or "tidy" representation 
df = pd.melt(df, id_vars=["date"], var_name="condition") 

# Plot the average value by condition and date 
ax = df.groupby(["condition", "date"]).mean().unstack("condition").plot() 

# Get a reference to the x-points corresponding to the dates and the the colors 
x = np.arange(len(df.date.unique())) 
palette = sns.color_palette() 

# Calculate the 25th and 75th percentiles of the data 
# and plot a translucent band between them 
for cond, cond_df in df.groupby("condition"): 
    low = cond_df.groupby("date").value.apply(np.percentile, 25) 
    high = cond_df.groupby("date").value.apply(np.percentile, 75) 
    ax.fill_between(x, low, high, alpha=.2, color=palette.pop(0)) 

इस कोड का उत्पादन:

enter image description here

+0

धन्यवाद। आपको क्यों लगता है कि 'tsplot' काम नहीं करेगा? मैं समझ सकता हूं कि सांख्यिकीय मान्यताओं को पूरा नहीं किया जाता है, लेकिन नमूना कैसे पता चलता है कि नमूने कहाँ से आते हैं? क्या यह प्रति दिन तत्वों की निरंतर संख्या मानता है? –

+1

यही है कि 'यूनिट' पैरामीटर के लिए है - आप यह बता रहे हैं कि प्रत्येक नमूना किस इकाई से मेल खाता है, और फिर वहां उम्मीद है कि प्रत्येक इकाई को प्रत्येक टाइमपॉइंट के लिए दर्शाया जाएगा। – mwaskom

+0

कारण मैं पूछता हूं क्योंकि मैं आत्मविश्वास अंतराल के विभिन्न मूल्यों के लिए एक अलग अल्फा मूल्य का उपयोग करने के 'tsplot' की क्षमता में विशेष रूप से रूचि रखता था (मैंने अंत में इसे हाइलाइट करने के लिए ओपी अपडेट किया) –