2016-12-05 9 views
-1

Я начинаю с Python. Я анализирую шины для каждой остановки вдоль маршрута автобуса. Для каждой остановки у меня есть список проходов. Количество проходов может быть различным для каждой остановки. Чтобы визуализировать данные, я хочу построить ящики на одной странице, чтобы вы могли наблюдать, как происходит маршрутизация шины по маршруту. Для этого я разработал код, который считывает данные шины из CSV-файла в словарь остановки с именем в качестве ключа и значениями в качестве объекта (я отслеживаю некоторые другие аспекты остановки, но не включены здесь для краткости). Беда, которую я испытываю, связана с коробкой. Я думал, что панды предоставят некоторую легкость для этого. Но у меня было много проблем с попыткой настроить фреймворк данных, потому что в моем словаре есть объекты. У вас могут быть другие идеи. Я упростил свой код до минимума, чтобы вы все еще могли следить за тем, что я сделал. В качестве побочного примечания я пытался научиться использовать классы, пока я работал над этим анализом. Вот почему вы видите кучу классов в моем коде. В моем полном коде, я имею дело с дублирующими транспортными средствами и выбросами в их собственных методах.Создание фрейма данных в пандах с одним столбцом индекса и вторым столбцом в виде списка различных размеров, создающих проблемы с boxplot

stops={} 
stopNamesA=[] 
headwaysA=[] 

class Data: 
    def __init__(self): 
     self.depart = 0 
     self.vehicle = 0 

class Stop: 
    def __init__(self): 
     self.vehicles = [] 
     self.departs = [] 
     self.headways=[] 
     self.stopName ="" 
def AddData(self, line): 
     fields = line.split(",") 
     self.stopName = fields[3] 
     self.vehicles.append(fields[0]) 
     x = fields[4] 
     self.departs.append(datetime.datetime.strptime(x[:-1], "%m/%d/%y %I:%M:%S %p")) 
    def CalcHeadway(self): 
     for i in range(len(self.departs)-1): 
     dt = self.departs[i] 
     dt2 = self.departs[i+1] 
     self.headways.append(datetime.timedelta.total_seconds(dt2 - dt)) 

with open('data.csv','r') as f: 
    for line in f: 
     fields = line.split(",") 
     sid = str(fields[3]) 
     if (fields[1] == 'X2' and fields[2] == 'WEST'): 
      if sid in stops.keys(): 
       s = stops[sid] 
      else: 
       s = Stop() 
       stops[sid] = s 
      s.AddData(line) 

for key, value in stops.items(): 
    value.CalcHeadway() 

Данные выглядит следующим образом (я снова усекается другие части):

5401 X2 WEST H ST NW + 7TH ST NW 10/3/16 7:58:48 AM 
2835 X2 WEST H ST NW + 7TH ST NW 10/3/16 8:16:49 AM 
2460 X2 WEST H ST NW + 7TH ST NW 10/3/16 8:20:12 AM 
2460 X2 WEST H ST NW + 7TH ST NW 10/3/16 8:20:38 AM 
2460 X2 WEST H ST NW + 7TH ST NW 10/3/16 8:20:57 AM 
5404 X2 WEST I ST + 14TH ST 10/3/16 8:01:55 AM 
2835 X2 WEST I ST + 14TH ST 10/3/16 8:24:01 AM 
2853 X2 WEST I ST + 14TH ST 10/3/16 9:27:07 AM 
5404 X2 WEST I ST + 14TH ST 10/3/16 9:45:43 AM 
2835 X2 WEST I ST + 14TH ST 10/3/16 9:57:31 AM 
2831 X2 WEST MINNESOTA AVE NE + BENNING RD NE 10/3/16 8:02:41 AM 
2821 X2 WEST MINNESOTA AVE NE + BENNING RD NE 10/3/16 8:17:42 AM 
5420 X2 WEST MINNESOTA AVE NE + BENNING RD NE 10/3/16 8:34:43 AM 
2853 X2 WEST MINNESOTA AVE NE + BENNING RD NE 10/3/16 8:44:14 AM 
5401 X2 WEST MINNESOTA AVE NE + BENNING RD NE 10/3/16 9:02:20 AM 

ответ

0

Во-первых, как следует из ошибки, 'Series' object has no attribute 'boxplot'. Вы можете нарисовать коробку от Series по Series.plot.box().
Однако, поскольку вы хотите отображать несколько ящиков, имеет смысл использовать dataframe. Так что вам нужно DataFrame, чтобы построить ваш boxplot.

Если я правильно понимаю ваши потребности, вам понадобится DataFrame с 26 столбцами, по одной колонке на каждую остановку.

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame() 
df["I ST + 14TH ST"] = [1107.0, 1359.0, 1859.0, 1190.0, 1071.0, 904.0] 
df["BENNING RD NE + 19TH ST NE"] = [1132.0, 1503.0, 1448.0, 1344.0, 958.0, 771.0] 
#...... 
df["H ST NW + 5TH ST NW"] = [1182.0, 1315.0, 1691.0, 1193.0, 956.0, 729.0] 

df.boxplot(rot=45) 

plt.tight_layout() 
plt.show() 

enter image description here


кажется, что для того, чтобы получить рабочую dataframe из словаря в stops, можно сделать.

stops_for_drawing = {} 
for key, val in stops.iteritems(): 
    stops_for_drawing.update({key: val.headways}) 
df = pd.DataFrame(stops_for_drawing) 
+0

@ ImportOffBeingErnestdf Большое спасибо за ваш ответ. Я попробовал приведенный ниже код на основе того, что вы предложили. Я получаю сообщение об ошибке IndexError: index out вне диапазона, когда я создаю график. = Pd.DataFrame (index = stopNamesA) для имени, прогона в zip (stopNamesA, headwaysA): df ['name'] = headway df .boxplot() –

+0

@JohnV Что именно вы хотите сказать мне с этим фрагментом кода? Это полностью отличается от того, что я предложил в своем ответе. Это также совершенно неправильно. – ImportanceOfBeingErnest

+0

Я пытаюсь создать цикл for вместо ввода каждого df [name] = ... как я думаю, вы сделали в своем ответе. Ваш график - именно то, что я хочу, но у меня есть тысячи остановок. –

 Смежные вопросы

  • Нет связанных вопросов^_^