Pandas DataFrame - желаемый индекс имеет повторяющиеся значения - PullRequest
6 голосов
/ 04 марта 2012

Я впервые пробую Панд. Я думаю, что у меня есть разумный вариант использования, но я спотыкаюсь. Я хочу загрузить файл с разделителями табуляции в Pandas Dataframe, затем сгруппировать его по Symbol и нанести его на график с индексом x.axis, указанным в столбце TimeStamp. Вот подмножество данных:

Symbol,Price,M1,M2,Volume,TimeStamp
TBET,2.19,3,8.05,1124179,9:59:14 AM
FUEL,3.949,9,1.15,109674,9:59:11 AM
SUNH,4.37,6,0.09,24394,9:59:09 AM
FUEL,3.9099,8,1.11,105265,9:59:09 AM
TBET,2.18,2,8.03,1121629,9:59:05 AM
ORBC,3.4,2,0.22,10509,9:59:02 AM
FUEL,3.8599,7,1.07,102116,9:58:47 AM
FUEL,3.8544,6,1.05,100116,9:58:40 AM
GBR,3.83,4,0.46,64251,9:58:24 AM
GBR,3.8,3,0.45,63211,9:58:20 AM
XRA,3.6167,3,0.12,42310,9:58:08 AM
GBR,3.75,2,0.34,47521,9:57:52 AM
MPET,1.42,3,0.26,44600,9:57:52 AM

Обратите внимание на две вещи в столбце TimeStamp;

  1. имеет повторяющиеся значения и
  2. интервалы нерегулярные.

Я думал, что смогу сделать что-то подобное ...

from pandas import *
import pylab as plt

df = read_csv('data.txt',index_col=5)
df.sort(ascending=False)

df.plot()
plt.show()

Но метод read_csv вызывает исключение "Пробные столбцы 1-X в качестве индекса, но найденные дубликаты". Есть ли опция, которая позволит мне указать столбец индекса с повторяющимися значениями?

Мне также было бы интересно выровнять свои нерегулярные интервалы меток времени с разрешением в одну секунду, я все же хотел бы построить несколько событий для данной секунды, но, возможно, я мог бы ввести уникальный индекс, а затем выровнять мои цены по нему? *

1 Ответ

5 голосов
/ 04 марта 2012

Я только что создал несколько вопросов, чтобы решить некоторые функции / удобства, которые, на мой взгляд, было бы неплохо иметь: GH-856 , GH-857 , GH-858

В настоящее время мы работаем над обновлением возможностей временных рядов, и теперь возможно выполнить выравнивание по второму разрешению (хотя и не с дубликатами, поэтому для этого потребуется написать некоторые функции).Я также хочу лучше поддерживать дублированные метки времени.Тем не менее, это действительно данные панели (3D), поэтому вы можете изменить один из следующих способов:

In [29]: df.pivot('Symbol', 'TimeStamp').stack()
Out[29]: 
                   M1    M2   Price   Volume
Symbol TimeStamp                            
FUEL   9:58:40 AM   6  1.05  3.8544   100116
       9:58:47 AM   7  1.07  3.8599   102116
       9:59:09 AM   8  1.11  3.9099   105265
       9:59:11 AM   9  1.15  3.9490   109674
GBR    9:57:52 AM   2  0.34  3.7500    47521
       9:58:20 AM   3  0.45  3.8000    63211
       9:58:24 AM   4  0.46  3.8300    64251
MPET   9:57:52 AM   3  0.26  1.4200    44600
ORBC   9:59:02 AM   2  0.22  3.4000    10509
SUNH   9:59:09 AM   6  0.09  4.3700    24394
TBET   9:59:05 AM   2  8.03  2.1800  1121629
       9:59:14 AM   3  8.05  2.1900  1124179
XRA    9:58:08 AM   3  0.12  3.6167    42310

обратите внимание, что это создало MultiIndex.Другой способ, которым я мог бы получить это:

In [32]: df.set_index(['Symbol', 'TimeStamp'])
Out[32]: 
                    Price  M1    M2   Volume
Symbol TimeStamp                            
TBET   9:59:14 AM  2.1900   3  8.05  1124179
FUEL   9:59:11 AM  3.9490   9  1.15   109674
SUNH   9:59:09 AM  4.3700   6  0.09    24394
FUEL   9:59:09 AM  3.9099   8  1.11   105265
TBET   9:59:05 AM  2.1800   2  8.03  1121629
ORBC   9:59:02 AM  3.4000   2  0.22    10509
FUEL   9:58:47 AM  3.8599   7  1.07   102116
       9:58:40 AM  3.8544   6  1.05   100116
GBR    9:58:24 AM  3.8300   4  0.46    64251
       9:58:20 AM  3.8000   3  0.45    63211
XRA    9:58:08 AM  3.6167   3  0.12    42310
GBR    9:57:52 AM  3.7500   2  0.34    47521
MPET   9:57:52 AM  1.4200   3  0.26    44600

In [33]: df.set_index(['Symbol', 'TimeStamp']).sortlevel(0)
Out[33]: 
                    Price  M1    M2   Volume
Symbol TimeStamp                            
FUEL   9:58:40 AM  3.8544   6  1.05   100116
       9:58:47 AM  3.8599   7  1.07   102116
       9:59:09 AM  3.9099   8  1.11   105265
       9:59:11 AM  3.9490   9  1.15   109674
GBR    9:57:52 AM  3.7500   2  0.34    47521
       9:58:20 AM  3.8000   3  0.45    63211
       9:58:24 AM  3.8300   4  0.46    64251
MPET   9:57:52 AM  1.4200   3  0.26    44600
ORBC   9:59:02 AM  3.4000   2  0.22    10509
SUNH   9:59:09 AM  4.3700   6  0.09    24394
TBET   9:59:05 AM  2.1800   2  8.03  1121629
       9:59:14 AM  2.1900   3  8.05  1124179
XRA    9:58:08 AM  3.6167   3  0.12    42310

вы можете получить эти данные в истинном формате панели, например, так:

In [35]: df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel()
Out[35]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 11 (major) x 7 (minor)
Items: Price to Volume
Major axis: 9:57:52 AM to 9:59:14 AM
Minor axis: FUEL to XRA

In [36]: panel = df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel()

In [37]: panel['Price']
Out[37]: 
Symbol        FUEL   GBR  MPET  ORBC  SUNH  TBET     XRA
TimeStamp                                               
9:57:52 AM     NaN  3.75  1.42   NaN   NaN   NaN     NaN
9:58:08 AM     NaN   NaN   NaN   NaN   NaN   NaN  3.6167
9:58:20 AM     NaN  3.80   NaN   NaN   NaN   NaN     NaN
9:58:24 AM     NaN  3.83   NaN   NaN   NaN   NaN     NaN
9:58:40 AM  3.8544   NaN   NaN   NaN   NaN   NaN     NaN
9:58:47 AM  3.8599   NaN   NaN   NaN   NaN   NaN     NaN
9:59:02 AM     NaN   NaN   NaN   3.4   NaN   NaN     NaN
9:59:05 AM     NaN   NaN   NaN   NaN   NaN  2.18     NaN
9:59:09 AM  3.9099   NaN   NaN   NaN  4.37   NaN     NaN
9:59:11 AM  3.9490   NaN   NaN   NaN   NaN   NaN     NaN
9:59:14 AM     NaN   NaN   NaN   NaN   NaN  2.19     NaN

вы можете затем сгенерировать некоторые графики из этих данных.

обратите внимание, что временные метки все еще в виде строк - я думаю, они могут быть преобразованы в объекты Python datetime.time, и с ними будет немного проще работать.У меня не так много планов, чтобы обеспечить большую поддержку для сырых времен и временных меток (дата + время), но если это понадобится достаточному количеству людей, я думаю, я могу быть уверен:)

Если у вас есть несколько наблюдений засекунда для одного символа, тогда некоторые из вышеупомянутых методов не будут работать.Но я хочу встроить лучшую поддержку для этого в следующих выпусках панд, так что знание ваших вариантов использования будет мне полезно - подумайте о присоединении к списку рассылки (pystatsmodels)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...