2

日付、時刻、価格、雑誌、信号を含むcsvファイルがあります。62035行; ファイル内の一意の日付ごとに42回の時刻が関連付けられています。

日付ごとに、シグナル列に「S」がある場合は、「S」が発生した時点の対応する価格を追加します。以下はその試みです。

from pandas import *
from numpy import *
from io import *
from os import *
from sys import *

DF1 = read_csv('___.csv')
idf=DF1.set_index(['date','time','price'],inplace=True)
sStore=[]
for i in idf.index[i][0]:
  sStore.append([idf.index[j][2] for j in idf[j][1] if idf['signal']=='S'])
sStore.head()    
Traceback (most recent call last)
<ipython-input-7-8769220929e4> in <module>()
  1 sStore=[]
  2 
----> 3 for time in idf.index[i][0]:
  4 
  5     sStore.append([idf.index[j][2] for j in idf[j][1] if idf['signal']=='S'])

 NameError: name 'i' is not defined

ここでiインデックスが許可されていない理由がわかりません。ありがとう。

私もそれは奇妙だと思います:

idf.index.levels [0]は、ファイル内にあるが順序が正しくないため、「解析されていない」日付を表示します。それにもかかわらず、set_indexの引数としてparse_date=True。

次のようなもので問題をサイドスワイプすることを考えていたので、これを取り上げます。

for i in idf.index.levels[0]:

   sStore.append([idf.index[j][2] for j in idf.index.levels[1] if idf['signal']=='S'])

 sStore.head() 

以下のDSMのコメントに基づく2012年12月30日の私の編集:

以下にコメントするように、あなたのアイデアを使って損益を取得したいと思います。ここで、S!= Bの場合、任意の日付について、終了時刻1620を使用して差を付けます。

v=[df["signal"]=="S"]
t=[df["time"]=="1620"]
u=[df["signal"]!="S"]

df["price"][[v and (u and t)]]

つまり、「1620での価格を教えてください。(「販売信号」が出ない場合でも、S)、「余分なB」と区別できるようにします。B>Sの特別な場合に使用します。これは対称的な懸念(S> Bの場合)を無視しますが、今のところ、この論理的な問題を理解したいと思います。

トレースバックでは、この式は次のようになります。

ValueError: boolean index array should have 1 dimension

df ["time']を呼び出すために、ここではset_indexを設定しないことに注意してください。ユニオン演算子|を試してみると、次のようになります。

TypeError: unsupported operand type(s) for |: 'list' and 'list'

マックスフェローのアプローチを見て

@マックスフェロー

ポイントは、一日の終わりにポジションをクローズすることです。したがって、蓄積されたすべてのB、Sを「アンロード」に近い価格でキャプチャする必要があります。しかし、お互いを相殺しませんでした。私が言うなら:

filterFunc1 = lambda row: row["signal"] == "S" and ([row["signal"] != "S"][row["price"]=="1620"])
filterFunc2 =lambda row: ([row["price"]=="1620"][row["signal"] != "S"])

filterFunc=filterFunc1 and filterFunc2

filteredData = itertools.ifilter(filterFunc, reader)

トレースバック時:

IndexError: list index out of range
4

4 に答える 4

2

@Max Fellowsの便利なサンプルデータを使用して、でそれを見ることができますpandas。[ところで、あなたは常に短く、自己完結型の正しい例を提供するように努めるべきです(詳細はここを参照)。そうすれば、あなたを助けようとしている人々が時間をかけて考え出す必要がなくなります。]

まず、import pandas as pd。それで:

In [23]: df = pd.read_csv("sample.csv", names="date time price mag signal".split())

In [24]: df.set_index(["date", "time"], inplace=True)

それは私に

In [25]: df
Out[25]: 
                 price      mag signal
date       time                       
12/28/2012 1:30     10      foo      S
           2:15     11      bar      N
           3:00     12      baz      S
           4:45     13   fibble      N
           5:30     14  whatsit      S
           6:15     15     bobs      N
           7:00     16  widgets      S
           7:45     17  weevils      N
           8:30     18   badger      S
           9:15     19    moose      S
11/29/2012 1:30     10      foo      N
           2:15     11      bar      N
           3:00     12      baz      S
           4:45     13   fibble      N
           5:30     14  whatsit      N
           6:15     15     bobs      N
           7:00     16  widgets      S
           7:45     17  weevils      N
           8:30     18   badger      N
           9:15     19    moose      N
[etc.]

どの行にシグナルがあるかをS簡単に確認できます。

In [26]: df["signal"] == "S"
Out[26]: 
date        time
12/28/2012  1:30     True
            2:15    False
            3:00     True
            4:45    False
            5:30     True
            6:15    False
[etc..]

これを使用して選択することもできます:

In [27]: df["price"][df["signal"] == "S"]
Out[27]: 
date        time
12/28/2012  1:30    10
            3:00    12
            5:30    14
            7:00    16
            8:30    18
            9:15    19
11/29/2012  3:00    12
            7:00    16
12/29/2012  3:00    12
            7:00    16
8/9/2008    3:00    12
            7:00    16
Name: price

これは、DataFrameすべての日付、時刻、および価格でSです。そして、単にリストが必要な場合:

In [28]: list(df["price"][df["signal"] == "S"])
Out[28]: [10.0, 12.0, 14.0, 16.0, 18.0, 19.0, 12.0, 16.0, 12.0, 16.0, 12.0, 16.0]

更新

v=[df["signal"]=="S"]を含むvPythonを作成します。それはあなたが望むものではありません。 私にもあまり意味がありません-:そして相互に排他的であるため、あなたと彼らが一緒になった場合、あなたは何も得られません。これらの論理ベクトル演算では、andの代わりにandを使用できます。参照データを再度使用する:listSeriesdf["price"][[v and (u and t)]]vu&|andor

In [85]: import pandas as pd

In [86]: df = pd.read_csv("sample.csv", names="date time price mag signal".split())

In [87]: v=df["signal"]=="S"

In [88]: t=df["time"]=="4:45"

In [89]: u=df["signal"]!="S"

In [90]: df[t]
Out[90]: 
          date  time  price     mag signal
3   12/28/2012  4:45     13  fibble      N
13  11/29/2012  4:45     13  fibble      N
23  12/29/2012  4:45     13  fibble      N
33    8/9/2008  4:45     13  fibble      N

In [91]: df["price"][t]
Out[91]: 
3     13
13    13
23    13
33    13
Name: price

In [92]: df["price"][v | (u & t)]
Out[92]: 
0     10
2     12
3     13
4     14
6     16
8     18
9     19
12    12
13    13
16    16
22    12
23    13
26    16
32    12
33    13
36    16
Name: price

[注:この質問は長すぎて曲がりくねっています。pandasコンソールのドキュメントにある例を参考にして、その感触をつかむことをお勧めします。]

于 2012-12-30T00:18:13.190 に答える
2

これは、編集に基づいて達成しようとしていることだと思います。CSVファイルのすべての日付について、「S」の信号で各アイテムの価格のリストとともに日付をグループ化します。

質問にサンプルデータが含まれていなかったので、説明した形式と一致することを期待してテストデータを作成しました。

12/28/2012,1:30,10.00,"foo","S"
12/28/2012,2:15,11.00,"bar","N"
12/28/2012,3:00,12.00,"baz","S"
12/28/2012,4:45,13.00,"fibble","N"
12/28/2012,5:30,14.00,"whatsit","S"
12/28/2012,6:15,15.00,"bobs","N"
12/28/2012,7:00,16.00,"widgets","S"
12/28/2012,7:45,17.00,"weevils","N"
12/28/2012,8:30,18.00,"badger","S"
12/28/2012,9:15,19.00,"moose","S"
11/29/2012,1:30,10.00,"foo","N"
11/29/2012,2:15,11.00,"bar","N"
11/29/2012,3:00,12.00,"baz","S"
11/29/2012,4:45,13.00,"fibble","N"
11/29/2012,5:30,14.00,"whatsit","N"
11/29/2012,6:15,15.00,"bobs","N"
11/29/2012,7:00,16.00,"widgets","S"
11/29/2012,7:45,17.00,"weevils","N"
11/29/2012,8:30,18.00,"badger","N"
11/29/2012,9:15,19.00,"moose","N"
12/29/2012,1:30,10.00,"foo","N"
12/29/2012,2:15,11.00,"bar","N"
12/29/2012,3:00,12.00,"baz","S"
12/29/2012,4:45,13.00,"fibble","N"
12/29/2012,5:30,14.00,"whatsit","N"
12/29/2012,6:15,15.00,"bobs","N"
12/29/2012,7:00,16.00,"widgets","S"
12/29/2012,7:45,17.00,"weevils","N"
12/29/2012,8:30,18.00,"badger","N"
12/29/2012,9:15,19.00,"moose","N"
8/9/2008,1:30,10.00,"foo","N"
8/9/2008,2:15,11.00,"bar","N"
8/9/2008,3:00,12.00,"baz","S"
8/9/2008,4:45,13.00,"fibble","N"
8/9/2008,5:30,14.00,"whatsit","N"
8/9/2008,6:15,15.00,"bobs","N"
8/9/2008,7:00,16.00,"widgets","S"
8/9/2008,7:45,17.00,"weevils","N"
8/9/2008,8:30,18.00,"badger","N"
8/9/2008,9:15,19.00,"moose","N"

そして、Python 2.7と組み込みライブラリを使用して、希望どおりにグループ化する方法を次に示します。

import csv
import itertools
import time
from collections import OrderedDict

with open("sample.csv", "r") as file:
    reader = csv.DictReader(file,
                            fieldnames=["date", "time", "price", "mag", "signal"])

    # Reduce the size of the data set by filtering out the non-"S" rows.
    filterFunc = lambda row: row["signal"] == "S"
    filteredData = itertools.ifilter(filterFunc, reader)

    # Sort by date so we can use the groupby function.
    dateKeyFunc = lambda row: time.strptime(row["date"], r"%m/%d/%Y")
    sortedData = sorted(filteredData, key=dateKeyFunc)

    # Group by date: create a new dictionary of date to a list of prices.
    datePrices = OrderedDict((date, [row["price"] for row in rows])
                             for date, rows
                             in itertools.groupby(sortedData, dateKeyFunc))

for date, prices in datePrices.iteritems():
    print "{0}: {1}".format(time.strftime(r"%m/%d/%Y", date),
                            ", ".join(str(price) for price in prices))

>>> 08/09/2008: 12.00, 16.00
>>> 11/29/2012: 12.00, 16.00
>>> 12/28/2012: 10.00, 12.00, 14.00, 16.00, 18.00, 19.00
>>> 12/29/2012: 12.00, 16.00

他のライブラリを使用してCSVの読み取りを行っている可能性があるため、型変換はあなた次第ですが、それでうまくいけば開始できます。インポートに関する@DSMのコメントに注意してください*。

于 2012-12-28T23:17:11.187 に答える
2

次のようなことを試してください:

for i in range(len(idf.index)):
  value = idf.index[i][0]

jインデックス変数を使用した反復についても同じことが言えます。指摘されているように、反復される式で反復インデックスを参照することはできません。さらに、非常に具体的な反復 (マトリックス内の列をトラバースする) を実行する必要があり、Python の既定の反復子は機能しません。そのため、ここではカスタム インデックス処理が必要です。

于 2012-12-28T20:36:10.430 に答える
1

iエラーメッセージが示すように、まだ定義されていないためです。

この行で:

for i in idf.index[i][0]:

式から返されたリストによって生成されたすべての値を反復するように Python インタープリターに指示してidf.index[i][0]いますが、まだ定義していませんi(ただし、リスト内の各項目を変数iにも設定しようとしています)。

Pythonfor ... in ...ループが機能する方法は、最も右のコンポーネントを取得しnext、反復子からアイテムを要求することです。次に、呼び出しによって生成された値を、左側にある変数名に割り当てます。

于 2012-12-28T20:34:05.210 に答える