6

私はパンダを使って財務記録を分析しています。

DataFrame次のようなcsvファイルからのを持っています:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 800 entries, 2010-10-27 00:00:00 to 2011-07-12 00:00:00
Data columns:
debit                      800  non-null values
transaction_type           799  non-null values
transaction_date_raw       800  non-null values
credit                     800  non-null values
transaction_description    800  non-null values
account_number             800  non-null values
sort_code                  800  non-null values
balance                    800  non-null values
dtypes: float64(3), int64(1), object(4)

取引金額に基づいてサブセットを選択しています:

c1 = df['credit'].map(lambda x: x > 1000)
milestones = df[c1].sort()

マイルストーン間の日付に基づいて、元のdfのスライスを作成します。

delta = dt.timedelta(days=1)
for i in range(len(milestones.index)-1):
        start = milestones.index[i].date()
        end = milestones.index[i+1].date() - delta
        rng = date_range(start, end)

これにより、マイルストーン間の日付で新しいシリーズが生成されます。

<class 'pandas.tseries.index.DatetimeIndex'>
[2010-11-29 00:00:00, ..., 2010-12-30 00:00:00]
Length: 32, Freq: D, Timezone: None

これらの新しいシリーズ(rng)を使用してdfをスライスするためにいくつかのアプローチに従いましたが、失敗しました:

df.ix[start:end] or
df.ix[rng]

これにより発生します:IndexError:無効なスライス

df.reindex(rng) or df.reindex(index=rng)

発生:例外:一意に評価されたインデックスオブジェクトでのみ有効なインデックスの再作成

x = [v for v in rng if v in df.index]
df[x]
df.ix[x]
df.index[x]

これにより無効なスライスも発生し、次のようになります。

df.truncate(start, end)

私はパンダに不慣れで、Oreillyからの本の初期リリースをフォローしていて、本当に楽しんでいます。任意のポインタをいただければ幸いです。

4

2 に答える 2

1

一意でないインデックスの処理でいくつかの既知のバグに遭遇したようです。

https://github.com/pydata/pandas/issues/1201/

https://github.com/pydata/pandas/issues/1587/

バグ修正リリースがまもなく公開されるので、1 週間ほどで pandas の Web サイトまたは PyPI を確認してください。

ありがとう

于 2012-07-09T20:12:49.260 に答える
1

上記の問題のいくつかを回避することができました.Chang Sheが言及したバグが解決されるまでの「解決策」は次のとおりです.

以前と同じように、元の TimeSeries インデックス付き DataFrame から始めます。df を並べ替えます。これにより、レコードが日付順に並べ替えられます (TimeSeries インデックスを使用)。

df = df.sort()

ソートしたら、df.indexを数値インデックスに置き換えます

df.index = range(len(df))

その後、以前と同じようにマイルストーンを抽出しますが、これらには正の int であるインデックスが含まれるようになり、そのインデックスのリストが作成されます。

milestones_list = milestones_df.index.tolist()

次のような数値インデックスを使用して、元の df からマイルストーン間のデータを抽出します。

datasets = {}
    for milestone in milestones_list:
        milestone_index = milestones_list.index(milestone)
        print "milestone {0} index {1}".format(milestone, milestone_index)
        if milestone_index < len(milestones_list) -1:
            x = df[milestones_df.index[milestone_index]:milestones_df.index[milestone_index+1]]
        else:
            x = df[milestones_df.index[milestone_index]:df.index.max()]

        n = str(int(x.index.min())) +'-'+  str(int(x.index.max()))
        datasets[n] = x

これにより、それらが表すインデックス間隔として名前が付けられた各マイルストーン時間間隔の DataFrames を含む dict が作成されます。

print datasets.keys()
['592-650', '448-527', '382-447', '264-318', '319-381', '118-198', '528-591', '728-798', '54-117', '199-263', '651-727']

確かに理想的な解決策ではありませんが、同様の問題を抱えている人に役立つことを願っています.

于 2012-07-10T15:28:07.467 に答える