バージョン 0.8.0 (2012年6月29日)#

これは0.7.3からのメジャーリリースであり、時系列処理インフラストラクチャへの広範な作業と、ライブラリ全体の多数の新機能が含まれています。20を超える異なる作者からの700以上のコミットが含まれています。ほとんどのpandas 0.7.3以前のユーザーはアップグレードで問題が発生することはないはずですが、NumPyのdatetime64 dtypeへの移行により、いくつかのバグや非互換性が潜んでいる可能性があります。必要であれば、残存する非互換性は0.8.1リリースでできるだけ早く修正されます。完全なリストについては、完全なリリースノートまたはGitHubのissueトラッカーを参照してください。

非一意なインデックスのサポート#

すべてのオブジェクトが非一意なインデックスで動作できるようになりました。データアライメント/結合操作はSQL結合セマンティクスに従って動作します(適用される場合は、多対多結合でのインデックス重複を含む)。

NumPy datetime64 dtypeと1.6の依存関係#

時系列データはNumPyのdatetime64 dtypeを使用して表現されるようになりました。したがって、pandas 0.8.0は少なくともNumPy 1.6を必要とします。いくつかの重要なユーザー向けAPI変更を含むNumPyの開発バージョン(1.7+)でも動作がテストされ、検証されています。NumPy 1.6にはナノ秒分解能データに関するいくつかのバグがあるため、NumPy 1.6のdatetime64 API関数(限られていますが)は避け、pandasが提供するインターフェースのみを使用してこのデータと対話することをお勧めします。

pandas 0.7以前のレガシーコードベースを0.8.0に移行するユーザーのための潜在的な問題リストを記載した「ポーティング」ガイドは、0.8.0セクションの最後に記載されています。

レガシーNumPy < 1.6ユーザー向けの0.7.xシリーズのバグ修正は、発生に応じて提供されます。0.7.xではバグ修正以上の開発は行われません。

時系列の変更と改善#

このリリースにより、レガシーのscikits.timeseriesユーザーはコードをpandasを使用するようにポーティングできるはずです。

pandas時系列APIの概要については、ドキュメントを参照してください。

  • 新しいdatetime64表現は、結合操作とデータアライメントを高速化し、メモリ使用量を削減し、datetime.datetimeと比較してシリアライゼーション/デシリアライゼーションのパフォーマンスを大幅に向上させます。

  • 高周波数から低周波数、低周波数から高周波数への変換のための高性能で柔軟なresampleメソッド。補間、ユーザー定義の集約関数、および間隔と結果のラベル付けの定義方法を制御する機能をサポートしています。一連の高性能Cython/Cベースのリサンプリング関数(Open-High-Low-Closeを含む)も実装されています。

  • 周波数エイリアスの刷新と「15min」や「1h30min」のような周波数ショートカットのサポート。

  • 新しいDatetimeIndexクラスは、固定周波数と不規則時系列の両方をサポートします。現在非推奨のDateRangeクラスを置き換えます。

  • 新しいPeriodIndexおよびPeriodクラスは、時間範囲を表し、12 会計四半期周波数 <timeseries.quarterly>を含むカレンダーロジックを実行します。これはscikits.timeseriesコードベースの要素の部分的なポーティングであり、大幅な機能強化です。PeriodIndexとDatetimeIndex間の変換をサポートします。

  • 新しいTimestampデータ型はdatetime.datetimeのサブクラスであり、ナノ秒分解能のデータを扱うことを可能にしながら、同じインターフェースを提供します。また、簡単なタイムゾーン変換も提供します。

  • タイムゾーンのサポートを強化。TimeSeriesとDataFrameにtz_converttz_localizeメソッドを追加。すべてのタイムスタンプはUTCとして保存されます。タイムゾーンが設定されたDatetimeIndexオブジェクトからのタイムスタンプは、ローカル時間にローカライズされます。したがって、タイムゾーン変換は本質的に無料です。ユーザーはpytzライブラリについてほとんど知る必要がなくなり、文字列としてのタイムゾーン名のみが必要となります。タイムゾーン対応のタイムスタンプは、UTCタイムスタンプが一致する場合にのみ等しいと見なされます。異なるタイムゾーンを持つタイムゾーン対応の時系列間の操作は、UTCインデックスの時系列を結果として生成します。

  • 時系列の文字列インデックス作成の利便性/ショートカット:年、年と月をスライスしたり、文字列で値をインデックス付けしたりできます。

  • 時系列のプロットを強化。scikits.timeseriesのmatplotlibベースのプロットコードを適応。

  • 新しいdate_rangebdate_range、およびperiod_range ファクトリ関数

  • 堅牢な周波数推論関数infer_freqと、DatetimeIndexのinferred_freqプロパティ。DatetimeIndexの構築時に周波数を推論するオプション付き。

  • to_datetime関数は、文字列の配列を効率的に解析してDatetimeIndexに変換します。DatetimeIndexは、文字列の配列またはリストをdatetime64に解析します。

  • SeriesおよびDataFrame列におけるdatetime64-dtypeデータの最適化されたサポート

  • タイムスタンプ配列のNAを表す新しいNaT(Not-a-Time)型

  • タイムスタンプ配列の「as of」値を検索するためのSeries.asofの最適化

  • Milli、Micro、Nanoのdate offsetオブジェクト

  • datetime.timeオブジェクトを使用して時系列をインデックス付けし、特定の時刻TimeSeries.at_time)または2つの時刻の間TimeSeries.between_time)のすべてのデータを選択できます。

  • 素朴なシフトを使用したリード/ラグではなく、インデックスの周波数(もしあれば)を使用してリード/ラグを行うtshiftメソッドを追加

その他の新機能#

  • 新しいcutおよびqcut関数(Rのcut関数のように)は、値を値ベース(cut)または分位数ベース(qcut)のビンに分類することで、連続変数からカテゴリ変数を計算します。

  • FactorCategoricalに名称変更し、いくつかの使いやすさ機能を追加。

  • fillna/reindexにlimit引数を追加

  • GroupByでのより柔軟な複数関数適用、および特定の順序で指定された名前で結果を得るためにリスト(名前、関数)タプルを渡せるように。

  • 値を効率的に置換するための柔軟なreplaceメソッドを追加

  • 時系列データの読み込みと複数列の日付への変換のためのread_csv/read_tableを強化

  • パーサー関数(read_csvなど)にcommentsオプションを追加

  • 国際的なDD/MM/YYYY日付を解析するためのパーサー関数にdayfirstオプションを追加

  • 引用符などを制御するために、ユーザーがCSVリーダーのダイアレクトを指定できるように。

  • read_csvで千単位の区切り文字を処理し、整数解析を改善。

  • 一度に複数のレベルのアンスタックを有効にする。pivot_tableのバグ(空の列が導入される)を軽減。

  • インデックス作成にklibベースのハッシュテーブルに移行。Pythonのdictよりも優れたパフォーマンスと少ないメモリ使用量。

  • first、last、min、max、prodの最適化されたGroupBy関数を追加。

  • 新しいordered_merge関数

  • DataFrame、Seriesに柔軟な比較インスタンスメソッド eq, ne, lt, gt などを追加。

  • scatter_matrixプロット機能を改善し、対角線にヒストグラムまたはカーネル密度推定を追加。

  • 密度プロットに「kde」プロットオプションを追加。

  • rpy2を介したDataFrameからR data.frameへの変換のサポート。

  • SeriesとDataFrameにおける複素数のサポートを改善。

  • すべてのデータ構造にpct_changeメソッドを追加。

  • DataFrameコンソール出力にmax_colwidth設定オプションを追加。

  • インデックス値を使用してSeries値を補間

  • GroupByから複数の列を選択可能。

  • Series/DataFrameにupdateメソッドを追加し、値をインプレースで更新。

  • DataFrameにanyおよびallメソッドを追加。

新しいプロットメソッド#

import pandas as pd

fx = pd.read_pickle("data/fx_prices")
import matplotlib.pyplot as plt

Series.plotsecondary_yオプションをサポートするようになりました。

plt.figure()

fx["FR"].plot(style="g")

fx["IT"].plot(style="k--", secondary_y=True)

2012年のGSOC参加者であるVytautas Jancauskasが多くの新しいプロットタイプを追加しました。例えば、'kde'は新しいオプションです。

s = pd.Series(
    np.concatenate((np.random.randn(1000), np.random.randn(1000) * 0.5 + 3))
)
plt.figure()
s.hist(density=True, alpha=0.2)
s.plot(kind="kde")

詳細については、プロットのページを参照してください。

その他の API の変更#

  • 時系列関数におけるoffsettime_rule、およびtimeRule引数名の非推奨。pandas 0.9または1.0まで警告が表示されます。

pandas <= 0.7.3ユーザー向けの潜在的なポーティング問題#

pandas 0.8.0であなたに影響を与える可能性のある主要な変更は、時系列インデックスがPythonの組み込みdatetime.datetimeオブジェクトのdtype=object配列ではなく、NumPyのdatetime64データ型を使用するようになったことです。DateRangeDatetimeIndexに置き換えられましたが、それ以外は同じように動作しました。しかし、以前datetime.datetime値を含んでいたDateRangeまたはIndexオブジェクトをプレーンなNumPy配列に変換するコードがある場合、NumPyに制御を渡しているため、スカラー値を使用するコードにバグが潜んでいる可能性があります。

In [1]: import datetime

In [2]: rng = pd.date_range("1/1/2000", periods=10)

In [3]: rng[5]
Out[3]: Timestamp('2000-01-06 00:00:00')

In [4]: isinstance(rng[5], datetime.datetime)
Out[4]: True

In [5]: rng_asarray = np.asarray(rng)

In [6]: scalar_val = rng_asarray[5]

In [7]: type(scalar_val)
Out[7]: numpy.datetime64

pandasのTimestampオブジェクトは、ナノ秒をサポートするdatetime.datetimeのサブクラスです(nanosecondフィールドは0から999までのナノ秒値を格納します)。以前datetime.datetime値を使用していたコードには直接置き換えることができます。したがって、DatetimeIndexを通常のNumPy配列にキャストしないことをお勧めします。

datetime.datetimeオブジェクトの配列を必要とするコードがある場合、いくつかのオプションがあります。まず、DatetimeIndexastype(object)メソッドはTimestampオブジェクトの配列を生成します。

In [8]: stamp_array = rng.astype(object)

In [9]: stamp_array
Out[9]: 
Index([2000-01-01 00:00:00, 2000-01-02 00:00:00, 2000-01-03 00:00:00,
       2000-01-04 00:00:00, 2000-01-05 00:00:00, 2000-01-06 00:00:00,
       2000-01-07 00:00:00, 2000-01-08 00:00:00, 2000-01-09 00:00:00,
       2000-01-10 00:00:00],
      dtype='object')

In [10]: stamp_array[5]
Out[10]: Timestamp('2000-01-06 00:00:00')

適切なdatetime.datetimeオブジェクトの配列を取得するには、to_pydatetimeメソッドを使用します。

In [11]: dt_array = rng.to_pydatetime()

In [12]: dt_array
Out[12]: 
array([datetime.datetime(2000, 1, 1, 0, 0),
       datetime.datetime(2000, 1, 2, 0, 0),
       datetime.datetime(2000, 1, 3, 0, 0),
       datetime.datetime(2000, 1, 4, 0, 0),
       datetime.datetime(2000, 1, 5, 0, 0),
       datetime.datetime(2000, 1, 6, 0, 0),
       datetime.datetime(2000, 1, 7, 0, 0),
       datetime.datetime(2000, 1, 8, 0, 0),
       datetime.datetime(2000, 1, 9, 0, 0),
       datetime.datetime(2000, 1, 10, 0, 0)], dtype=object)

In [13]: dt_array[5]
Out[13]: datetime.datetime(2000, 1, 6, 0, 0)

matplotlibはdatetime.datetimeは処理できますが、Timestampオブジェクトは処理できません。TimeSeries.plotを使用して時系列をプロットすることをお勧めしますが、to_pydatetimeを使用するか、Timestampタイプ用のコンバーターを登録することができます。詳細については、matplotlibドキュメントを参照してください。

警告

NumPy 1.6のナノ秒datetime64単位には、ユーザー向けAPIにバグがあります。特に、配列の文字列バージョンはゴミ値を表示し、dtype=objectへの変換も同様に壊れています。

In [14]: rng = pd.date_range("1/1/2000", periods=10)

In [15]: rng
Out[15]: 
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
               '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08',
               '2000-01-09', '2000-01-10'],
              dtype='datetime64[ns]', freq='D')

In [16]: np.asarray(rng)
Out[16]: 
array(['2000-01-01T00:00:00.000000000', '2000-01-02T00:00:00.000000000',
       '2000-01-03T00:00:00.000000000', '2000-01-04T00:00:00.000000000',
       '2000-01-05T00:00:00.000000000', '2000-01-06T00:00:00.000000000',
       '2000-01-07T00:00:00.000000000', '2000-01-08T00:00:00.000000000',
       '2000-01-09T00:00:00.000000000', '2000-01-10T00:00:00.000000000'],
      dtype='datetime64[ns]')

In [17]: converted = np.asarray(rng, dtype=object)

In [18]: converted[5]
Out[18]: Timestamp('2000-01-06 00:00:00')

私を信じてください:慌てないでください。NumPy 1.6を使用し、datetime64値とのインタラクションをpandasのAPIに制限すれば、問題ありません。データ型(内部的には64ビット整数)には何も問題ありません。重要なデータ処理はすべてpandasで行われ、厳密にテストされています。NumPy 1.6でdatetime64配列を直接操作しないことを強くお勧めし、pandas APIのみを使用してください。

非一意インデックスのサポート: 後者の場合、インデックスが一意ではないために失敗したtry:... catch:ブロック内にコードがあるかもしれません。多くの場合、これはもう失敗しません(appendのような一部のメソッドは、無効にしない限り一意性をチェックします)。しかし、すべてが失われたわけではありません。index.is_uniqueを調べて、それがFalseであれば明示的に例外を発生させるか、別のコードブランチに進むことができます。

貢献者#

このリリースには合計27人がパッチを寄稿しました。名前に「+」が付いている人は初めてパッチを寄稿した人です。

  • Adam Klein

  • Chang She

  • David Zaslavsky +

  • Eric Chlebek +

  • Jacques Kvam

  • Kamil Kisiel

  • Kelsey Jordahl +

  • Kieran O’Mahony +

  • Lorenzo Bolla +

  • Luca Beltrame

  • Marc Abramowitz +

  • Mark Wiebe +

  • Paddy Mullen +

  • Peng Yu +

  • Roy Hyunjin Han +

  • RuiDC +

  • Senthil Palanisami +

  • スキッパー・シーボールド

  • Stefan van der Walt +

  • Takafumi Arakaki +

  • Thomas Kluyver

  • Vytautas Jancauskas +

  • Wes McKinney

  • Wouter Overmeire

  • ヤロスラフ・ハルチェンコ

  • thuske +

  • timmie +