1

私はこの素晴らしいツールの学習を始めています。いくつかの時系列をロードし、それらを「マスター」日付ベクトルに合わせるという単純なタスクに行き詰まっています。

例: 私は csv ファイルを持っています: Data.csv の最初の行には、"Date1, Rate1, Date2, Rate2"Date1 が Rate1 の日付で、Date2 が Rate2 の日付であるヘッダーが含まれています。

この場合、Rate2 にはより多くの観測値があり (開始日は Date1 と同じですが、終了日は Date1 の終了日よりも離れており、欠損値が少ない)、Date2 に従ってすべてのインデックスを作成する必要があります。

次の DataFrame を取得するための推奨される方法は何ですか? (または同様のことを達成する)

index(Date2) Rate1 Rate2
11/12/06     1.5   1.8
12/12/06     NaN   1.9
13/12/06     1.6   1.9
etc
etc
11/10/06     NaN   1.2
12/10/06     NaN   1.1
13/10/06     NaN   1.3

公式の pandas.pdf と Google の例に従おうとしましたが、役に立ちませんでした。(私はMcKinney氏のパンダブックのプレエディションも購入しましたが、パンダに関する章はまだ準備ができていません:( )

これの素敵なレシピはありますか?

どうもありがとうございました

編集:シリーズを2つの.CSVファイルに分割するという答えについて:しかし、非常に多くの時系列がある場合、たとえば

Date1 Rate1 Date2 Rate2 ... DateN RateN

そして、私が知っているのは、欠損値を含むシリーズからの例外を除いて、日付はほぼ同じでなければならないということです(日付またはレートのエントリがない場合)(ちなみに、これは金融経済学の時系列の例です)

このデータセットを読み込んで、すべてのシリーズを個別の .CSV に分割する方法をお勧めしますか?

EDIT2 archlightは完全に正しいです。「csv_read」を実行するだけで問題が発生します。

基本的に、私の質問は次のように要約されます。各シリーズに日付列とシリーズ自体の列がある、整列されていない複数の時系列を結合する方法 (Excel からエクスポートされた .CSV ファイル)

再度、感謝します

4

2 に答える 2

2

データを複数のファイルに分割する必要はないと思います。ファイルをロードして、read_csv各日付/レートのペアを個別の時系列に変換するのはどうですか? したがって、コードは次のようになります。

data = read_csv('foo.csv')

ts1 = Series(data['rate1'], index=data['date1'])
ts2 = Series(data['rate2'], index=data['date2'])

ここで、結合して DataFrame 内のデータを整列させるには、次のことができます。

frame = DataFrame({'rate1': ts1, 'rate2': ts2})

これにより、日付の和集合が形成され、ts1すべてts2のデータが整列されます (適切な場所に NA 値を挿入します)。

または、N 個の時系列がある場合は、次のようにすることができます。

all_series = {}
for i in range(N):
   all_series['rate%d' % i] = Series(data['rate%d' % i], index=data['date%d' % i])

frame = DataFrame(all_series)

これは私の経験では非常に一般的なパターンです

于 2012-06-05T15:00:27.223 に答える
1

Date1がDate2のサブセットであり、Date2に空の値が含まれていないことが確実な場合は、次のようにすることができます。

df = read_csv('foo.csv', index_col=2, parse_dates=True)
df = df[["rate1", "rate2"]]

ただし、Date2にDate1にない日付がある場合は、複雑になります。日付とレートのペアを、日付を共通のヘッダーとして別のファイルに入れることをお勧めします

df1 = read_csv('foo1.csv', index_col=0, parse_dates=True)
df2 = read_csv('foo2.csv', index_col=0, parse_dates=True)
df1.join(df2, how="outer")

編集: この方法は見栄えがよくありません。したがって、日時のNaNについては、次のように実行できます。

dateindex2 = map(lambda x: datetime(int("20"+x.split("/")[2]), int(x.split("/")[0]), int(x.split("/")[1])), filter(notnull, df['Date2'].values))
ts2 = Series(df["Rate2"].dropna(), index=dateindex2)
#same for ts1
df2 = DataFrame({"rate1":ts1, "rate2":ts2})

重要なのは、日付は存在するがレートは存在しないなどのケースがあることを確認する必要があるということです。dropna()はレコードをシフトし、インデックスと一致しないため

于 2012-06-05T04:47:09.123 に答える