Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧-所需索引具有重复值_Python_Dataframe_Pandas - Fatal编程技术网

Python 数据帧-所需索引具有重复值

Python 数据帧-所需索引具有重复值,python,dataframe,pandas,Python,Dataframe,Pandas,这是我第一次尝试熊猫。我认为我有一个合理的用例,但我有点结巴。我想将一个以制表符分隔的文件加载到一个数据框中,然后按符号将其分组,并使用时间戳列索引的x.axis来打印它。以下是数据的子集: 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,

这是我第一次尝试熊猫。我认为我有一个合理的用例,但我有点结巴。我想将一个以制表符分隔的文件加载到一个数据框中,然后按符号将其分组,并使用时间戳列索引的x.axis来打印它。以下是数据的子集:

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列的两件事

  • 它具有重复的值和
  • 间隔是不规则的
  • 我想我可以做这样的事

    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秒的分辨率,我仍然希望在给定的一秒钟内绘制多个事件,但也许我可以引入一个唯一的索引,然后调整价格?

    我刚刚创建了几个问题,以解决一些我认为最好的功能/便利:

    我们目前正在对时间序列功能进行改进,现在可以调整到第二个分辨率(虽然不能重复,所以需要为此编写一些函数)。我还希望以更好的方式支持重复的时间戳。但是,这实际上是面板(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
    
    注意,这创建了一个多索引。另一种方法我可以得到这个:

    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
    
    [35]中的
    :df.set_索引(['TimeStamp','Symbol']).sortlevel(0).to_面板()
    出[35]:
    尺寸:4(项目)x 11(主要)x 7(次要)
    项目:价格与数量之比
    长轴:上午9:57:52至上午9:59:14
    短轴:至XRA的燃油
    在[36]中:panel=df.set_index(['TimeStamp','Symbol']).sortlevel(0).to_panel()
    在[37]中:面板[价格]
    出[37]:
    符号燃料GBR MPET ORBC SUNH TBET XRA
    时间戳
    上午9:57:52楠3.75 1.42楠楠
    上午9:58:08楠楠3.6167
    上午9:58:20楠3.80楠
    上午9:58:24楠3.83楠楠
    上午9:58:40 3.8544楠楠
    上午9:58:47 3.8599楠楠
    上午9:59:02楠楠3.4楠楠
    上午9:59:05楠楠2.18楠楠
    上午9:59:09 3.9099楠楠4.37楠楠楠
    上午9:59:11 3.9490南
    上午9:59:14楠楠2.19楠楠
    
    然后可以根据该数据生成一些图

    请注意,这里的时间戳仍然是字符串——我想它们可以转换为Python datetime.time对象,使用起来可能更容易一些。我没有太多计划为原始时间和时间戳(日期+时间)提供大量支持,但如果有足够多的人需要它,我想我可以确信:)


    如果一秒钟内对单个符号有多个观察,则上述某些方法将不起作用。但我希望在即将发布的熊猫版本中更好地支持这一点,因此了解您的用例将对我有帮助——考虑加入邮件列表(PyStassMadies)

    谢谢。我将加入pystatsmodels——如果你正在寻找用例的绊脚石,我可能是一块肥沃的土地。如果你所说的原始时间是指可能具有采样率的整数,这里是一个向上投票。全世界的科学录音都在拼命地想把时间序列向那个方向扩展。。。