2017-12-24 19 views
0

私はpythonとmatplotlibを初めて使っています。私はmatplotlibのヒストグラムを使って各都市の旅行データをプロットしようとしています。ここで私がプロットしようとしているサンプルデータです。時間間隔を設定し、matplotlibのヒストグラムに制限を加える

データ:

 duration month hour day_of_week user_type 
0 15.433333  3 23 Thursday Subscriber 
1 3.300000  3 22 Thursday Subscriber 
2 2.066667  3 22 Thursday Subscriber 
3 19.683333  3 22 Thursday Subscriber 
4 10.933333  3 22 Thursday Subscriber 
5 19.000000  3 21 Thursday Subscriber 
6 6.966667  3 21 Thursday Subscriber 
7 17.033333  3 20 Thursday Subscriber 
8 6.116667  3 20 Thursday Subscriber 
9 6.316667  3 20 Thursday Subscriber 
10 11.300000  3 20 Thursday Subscriber 
11 8.300000  3 20 Thursday Subscriber 
12 8.283333  3 19 Thursday Subscriber 
13 36.033333  3 19 Thursday Subscriber 
14 5.833333  3 19 Thursday Subscriber 
15 5.350000  3 19 Thursday Subscriber 

コード:

def get_durations_as_list(filename): 
     with open(filename, 'r') as f_in: 
      reader = csv.reader(f_in) 
      next(reader, None) 
      for row in reader: 
       if row[4] in ['Subscriber','Registered'] and float(row[0]) < 75: 
        subscribers.append(float(row[0])) 
       elif row[4] in ['Casual','Customer'] and float(row[0]) < 75: 
        customers.append(float(row[0])) 
      return subscribers,customers 

data_files = ['./data/Washington-2016-Summary.csv','./data/Chicago-2016-Summary.csv','./data/NYC-2016-Summary.csv',] 
for file in data_files: 
    city = file.split('-')[0].split('/')[-1] 
    subscribers,customers = get_durations_as_list(file) 

plt.hist(subscribers,range=[min(subscribers),max(subscribers)],bins=5) 
plt.title('Distribution of Subscriber Trip Durations for city {}'.format(city)) 
plt.xlabel('Duration (m)') 
plt.show() 

plt.hist(customers,range=[min(subscribers),max(subscribers)],bins=5) 
plt.title('Distribution of Customers Trip Durations for city {}'.format(city)) 
plt.xlabel('Duration (m)') 
plt.show() 

今の質問は、広い5minsする時間間隔を設定し、どのように未満のみの旅行をプロットする方法であります75分。

私はドキュメントを読みましたが、複雑に見えます。いくつかのstackoverflowの質問を読んだ後、私はビンが時間間隔を設定するために使用されることがわかった。私の仮定は正しいのですか?

答えて

1

私はそれを試してみるが、ここで私の考えていることはできません。

bins引数はまた、ビンのエッジの配列であり得ます。したがって、あなたは(ここでnumpyライブラリを使用して)継続時間の最小値と最大値を取り、5のステップサイズでシーケンスを作成することができます。

import numpy as np 
sequence = np.arange(min(dat['duration']), max(dat['duration']), 5) 

(たぶん、あなたは床/整数に最小値と最大値を切り上げたいです) ここでコードは、pandasライブラリを使用してデータを読み込むという事実に依存しています。それは簡単にだけでなくpandasを使用してフィルタリングすることができます。

import pandas as pd 
dat = pd.read_csv('YOURFILE.csv') 
dat_filtered = dat[dat['duration'] < 75] 

ハッピーホリデー。

0

はい、ご使用の前提は非常に正確です。ビンパラメータをシーケンスとして使用できます。あなたの場合は、それはようになります。

b = [ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70] 

上記のリストを生成するためにnumpyを使用できます。

bins = numpy.arange(0,75,5) 

また、あなたが加入者を使用することができますし、1に設定された顧客データを以下に行く機能

def plot_duration_type(filename): 
    city = filename.split('-')[0].split('/')[-1] 
    with open(filename, 'r') as f_in: 
     reader = csv.DictReader(f_in) 
     subscriber_duration = [] 
     customer_duration = [] 
     for row in reader: 
      if float(row['duration']) < 75 and row['user_type'] == 'Subscriber': 
       subscriber_duration.append(float(row['duration'])) 
      elif float(row['duration']) < 75 and row['user_type'] == 'Customer': 
       customer_duration.append(float(row['duration'])) 
    b = [ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70] 
    plt.hist([subscriber_duration, customer_duration], bins=b, color=['orange', 'green'], 
       label=['Subscriber', 'Customer']) 
    title = "{} Distribution of Trip Durations".format(city) 
    plt.title(title) 
    plt.xlabel('Duration (m)') 
    plt.show() 

data_file = ['./data/Washington-2016-Summary.csv', './data/Chicago-2016-Summary.csv', './data/NYC-2016-Summary.csv'] 
for datafile in data_file: 
    print(plot_duration_type(datafile)) 
+0

で、これはあなたの問題を解決する場合は私に知らせてください –

関連する問題