2016-11-07 14 views
0

は私のような、最初の行とそれぞれの名前以下のデータ全体のサンプル名で構成されたデータが含まれているCSVファイルを読み込み、Pythonスクリプトを作成しようとしています:私は描画しようとしているデータセットからPythonでCSVファイルのデータからいくつかの累積分布関数をプロットする方法は?

sample1,sample2,sample3 
343.323,234.123,312.544 

同じ軸上の各サンプルの累積分布関数。以下のコードを使用してください:

import matplotlib.pyplot as plt 
import numpy as np 
import csv 


def isfloat(value): 
    '''make sure sample values are floats 
    (problem with different number of values per sample)''' 
    try: 
     float(value) 
     return True 
    except ValueError: 
     return False 

def createCDFs (dataset): 
    '''create a dictionary with sample name as key and data for each 
    sample as one list per key''' 
    dataset = dataset 
    num_headers = len(list(dataset)) 
    dict_CDF = {} 
    for a in dataset.keys(): 
     dict_CDF["{}".format(a)]= 1. * np.arange(len(dataset[a]))/(len(dataset[a]) - 1) 
    return dict_CDF 

def getdata(): 
    '''retrieve data from a CSV file - file must have sample names in first row 
    and data below''' 

    with open('file.csv') as csvfile: 
     reader = csv.DictReader(csvfile, delimiter = ',') 
     #create a dict that has sample names as key and associated ages as lists 
     dataset = {} 
     for row in reader: 
      for column, value in row.iteritems(): 
       if isfloat(value): 
        dataset.setdefault(column, []).append(value) 
       else: 
        break 
     return dataset 

x = getdata() 
y = createCDFs(x) 

#plot data 
for i in x.keys(): 
    ax1 = plt.subplot(1,1,1) 
    ax1.plot(x[i],y[i],label=str(i)) 


plt.legend(loc='upper left') 
plt.show() 

これは、以下の出力を与え、サンプル(図1AのSample1)の1つだけを正しく表示します。

Figure 1A. Only one CDF is displaying correctly (Sample1). B. Expected output

サンプルあたりの値の数は異なり、私は私のどこに問題がある、これがあると思います。

解決策がかなり単純であるべきだと私は考えています。助けや助言が役に立ちます。私は単にデータを正しく表示する方法を知りたいだけです。データはhereです。予想される出力を図1Bに示します。

+0

を? – user2699

+0

Excelで生成された期待出力の画像を追加しました – Ton

+0

複数のリンクがある場合は、以前の画像しか表示されませんか? – user2699

答えて

0

これは簡単な方法です。もちろん、パンダを使いたいかどうかによって変わります。私は最後に絶頂distのに

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

data_req = pd.read_table("yourfilepath", sep=",") 
#sort values per column 
sorted_values = data_req.apply(lambda x: x.sort_values()) 

#plot with matplotlib 
#note that you have to drop the Na's on columns to have appropriate 
#dimensions per variable. 

for col in sorted_values.columns: 
    y = np.linspace(0.,1., len(sorted_values[col].dropna())) 
    plt.plot(sorted_values[col].dropna(), y) 

を計算するthisアプローチを使用し、私はあなたが探していたフィギュアだ:サンプル2と3の予想累積分布関数である何

enter image description here

+0

素晴らしい!どうもありがとう。これは、データソートが機能していないことを除いて、うまく機能します。 CSVにソートしていないサンプルを追加し、あなたのコードは追加されたサンプルをソートしませんでした。しかし、元のデータを一度ソートすると機能しました。何か案は? – Ton

+0

また、 Pythonになると、私はかなり戸惑うので、実際にパンダのパッケージについて知りませんでした - それでは、ありがとう! – Ton

+0

ソート問題の解決策を見つけました。私はソートコードを次のように置き換えました。 'arr = data_req.values' ' arr.sort(軸= 0) ' ' data_req = pd.DataFrame(arr、index = data_req.index、columns = data_req.columns) ' – Ton

関連する問題