バージョン 0.10.1 (2013年1月22日)#

これは 0.10.0 からのマイナーリリースで、新機能、機能強化、バグ修正が含まれています。特に、Jeff Reback による HDFStore の substantial な新機能が貢献されました。

inplace オプションを取る関数に関する望ましくない API の破壊は元に戻され、非推奨警告が追加されました。

APIの変更点#

  • inplace オプションを取る関数は、以前と同様に呼び出し元のオブジェクトを返します。非推奨メッセージが追加されました。

  • グループ化集計の Max/Min は、非数値データを排除しなくなりました (GH 2700)

  • 空の DataFrame をリサンプリングすると、例外を発生させる代わりに空の DataFrame が返されるようになりました (GH 2640)

  • ファイルリーダーは、明示的に指定された整数列に NA 値が見つかった場合、その列を浮動小数点数に変換する代わりに例外を発生させるようになりました (GH 2631)

  • DatetimeIndex.unique は、配列の代わりに同じ名前とタイムゾーンを持つ DatetimeIndex を返すようになりました。

  • 配列の代わりにタイムゾーンを返すようになりました (GH 2563)

新機能#

  • データベース用の MySQL サポート (Dan Allan の貢献)

HDFStore#

既存のデータファイルをアップグレードする必要がある場合があります。メインドキュメントの互換性セクションをご覧ください。

data_columns にリストを渡すことで、テーブルに対してクエリを実行したい特定の列を指定 (およびインデックス付け) できます。

In [1]: store = pd.HDFStore("store.h5")

In [2]: df = pd.DataFrame(
   ...:     np.random.randn(8, 3),
   ...:     index=pd.date_range("1/1/2000", periods=8),
   ...:     columns=["A", "B", "C"],
   ...: )
   ...: 

In [3]: df["string"] = "foo"

In [4]: df.loc[df.index[4:6], "string"] = np.nan

In [5]: df.loc[df.index[7:9], "string"] = "bar"

In [6]: df["string2"] = "cool"

In [7]: df
Out[7]: 
                   A         B         C string string2
2000-01-01  0.469112 -0.282863 -1.509059    foo    cool
2000-01-02 -1.135632  1.212112 -0.173215    foo    cool
2000-01-03  0.119209 -1.044236 -0.861849    foo    cool
2000-01-04 -2.104569 -0.494929  1.071804    foo    cool
2000-01-05  0.721555 -0.706771 -1.039575    NaN    cool
2000-01-06  0.271860 -0.424972  0.567020    NaN    cool
2000-01-07  0.276232 -1.087401 -0.673690    foo    cool
2000-01-08  0.113648 -1.478427  0.524988    bar    cool

# on-disk operations
In [8]: store.append("df", df, data_columns=["B", "C", "string", "string2"])

In [9]: store.select("df", "B>0 and string=='foo'")
Out[9]: 
                   A         B         C string string2
2000-01-02 -1.135632  1.212112 -0.173215    foo    cool

# this is in-memory version of this type of selection
In [10]: df[(df.B > 0) & (df.string == "foo")]
Out[10]: 
                   A         B         C string string2
2000-01-02 -1.135632  1.212112 -0.173215    foo    cool

インデックス可能な列またはデータ列で一意の値を取得する機能。

# note that this is deprecated as of 0.14.0
# can be replicated by: store.select_column('df','index').unique()
store.unique("df", "index")
store.unique("df", "string")

データ列に datetime64 を保存できるようになりました。

In [11]: df_mixed = df.copy()

In [12]: df_mixed["datetime64"] = pd.Timestamp("20010102")

In [13]: df_mixed.loc[df_mixed.index[3:4], ["A", "B"]] = np.nan

In [14]: store.append("df_mixed", df_mixed)

In [15]: df_mixed1 = store.select("df_mixed")

In [16]: df_mixed1
Out[16]: 
                   A         B  ...  string2                    datetime64
2000-01-01  0.469112 -0.282863  ...     cool 1970-01-01 00:00:00.978393600
2000-01-02 -1.135632  1.212112  ...     cool 1970-01-01 00:00:00.978393600
2000-01-03  0.119209 -1.044236  ...     cool 1970-01-01 00:00:00.978393600
2000-01-04       NaN       NaN  ...     cool 1970-01-01 00:00:00.978393600
2000-01-05  0.721555 -0.706771  ...     cool 1970-01-01 00:00:00.978393600
2000-01-06  0.271860 -0.424972  ...     cool 1970-01-01 00:00:00.978393600
2000-01-07  0.276232 -1.087401  ...     cool 1970-01-01 00:00:00.978393600
2000-01-08  0.113648 -1.478427  ...     cool 1970-01-01 00:00:00.978393600

[8 rows x 6 columns]

In [17]: df_mixed1.dtypes.value_counts()
Out[17]: 
float64           3
object            2
datetime64[ns]    1
Name: count, dtype: int64

columns キーワードを select に渡して、返される列のリストをフィルターできます。これは、Term('columns',list_of_columns_to_filter) を渡すことと同等です。

In [18]: store.select("df", columns=["A", "B"])
Out[18]: 
                   A         B
2000-01-01  0.469112 -0.282863
2000-01-02 -1.135632  1.212112
2000-01-03  0.119209 -1.044236
2000-01-04 -2.104569 -0.494929
2000-01-05  0.721555 -0.706771
2000-01-06  0.271860 -0.424972
2000-01-07  0.276232 -1.087401
2000-01-08  0.113648 -1.478427

HDFStore は、テーブルを追加する際に MultiIndex データフレームをシリアライズするようになりました。

In [19]: index = pd.MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
   ....:                               ['one', 'two', 'three']],
   ....:                       labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3, 3],
   ....:                               [0, 1, 2, 0, 1, 1, 2, 0, 1, 2]],
   ....:                       names=['foo', 'bar'])
   ....:

In [20]: df = pd.DataFrame(np.random.randn(10, 3), index=index,
   ....:                   columns=['A', 'B', 'C'])
   ....:

In [21]: df
Out[21]:
                  A         B         C
foo bar
foo one   -0.116619  0.295575 -1.047704
    two    1.640556  1.905836  2.772115
    three  0.088787 -1.144197 -0.633372
bar one    0.925372 -0.006438 -0.820408
    two   -0.600874 -1.039266  0.824758
baz two   -0.824095 -0.337730 -0.927764
    three -0.840123  0.248505 -0.109250
qux one    0.431977 -0.460710  0.336505
    two   -3.207595 -1.535854  0.409769
    three -0.673145 -0.741113 -0.110891

In [22]: store.append('mi', df)

In [23]: store.select('mi')
Out[23]:
                  A         B         C
foo bar
foo one   -0.116619  0.295575 -1.047704
    two    1.640556  1.905836  2.772115
    three  0.088787 -1.144197 -0.633372
bar one    0.925372 -0.006438 -0.820408
    two   -0.600874 -1.039266  0.824758
baz two   -0.824095 -0.337730 -0.927764
    three -0.840123  0.248505 -0.109250
qux one    0.431977 -0.460710  0.336505
    two   -3.207595 -1.535854  0.409769
    three -0.673145 -0.741113 -0.110891

# the levels are automatically included as data columns
In [24]: store.select('mi', "foo='bar'")
Out[24]:
                A         B         C
foo bar
bar one  0.925372 -0.006438 -0.820408
    two -0.600874 -1.039266  0.824758

append_to_multiple を介した複数テーブルの作成と select_as_multiple を介した選択により、セレクターテーブルで where を使用して、複数テーブルから作成/選択し、結合された結果を返すことができます。

In [19]: df_mt = pd.DataFrame(
   ....:     np.random.randn(8, 6),
   ....:     index=pd.date_range("1/1/2000", periods=8),
   ....:     columns=["A", "B", "C", "D", "E", "F"],
   ....: )
   ....: 

In [20]: df_mt["foo"] = "bar"

# you can also create the tables individually
In [21]: store.append_to_multiple(
   ....:     {"df1_mt": ["A", "B"], "df2_mt": None}, df_mt, selector="df1_mt"
   ....: )
   ....: 

In [22]: store
Out[22]: 
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5

# individual tables were created
In [23]: store.select("df1_mt")
Out[23]: 
                   A         B
2000-01-01  0.404705  0.577046
2000-01-02 -1.344312  0.844885
2000-01-03  0.357021 -0.674600
2000-01-04  0.276662 -0.472035
2000-01-05  0.895717  0.805244
2000-01-06 -1.170299 -0.226169
2000-01-07 -0.076467 -1.187678
2000-01-08  1.024180  0.569605

In [24]: store.select("df2_mt")
Out[24]: 
                   C         D         E         F  foo
2000-01-01 -1.715002 -1.039268 -0.370647 -1.157892  bar
2000-01-02  1.075770 -0.109050  1.643563 -1.469388  bar
2000-01-03 -1.776904 -0.968914 -1.294524  0.413738  bar
2000-01-04 -0.013960 -0.362543 -0.006154 -0.923061  bar
2000-01-05 -1.206412  2.565646  1.431256  1.340309  bar
2000-01-06  0.410835  0.813850  0.132003 -0.827317  bar
2000-01-07  1.130127 -1.436737 -1.413681  1.607920  bar
2000-01-08  0.875906 -2.211372  0.974466 -2.006747  bar

# as a multiple
In [25]: store.select_as_multiple(
   ....:     ["df1_mt", "df2_mt"], where=["A>0", "B>0"], selector="df1_mt"
   ....: )
   ....: 
Out[25]: 
                   A         B         C         D         E         F  foo
2000-01-01  0.404705  0.577046 -1.715002 -1.039268 -0.370647 -1.157892  bar
2000-01-05  0.895717  0.805244 -1.206412  2.565646  1.431256  1.340309  bar
2000-01-08  1.024180  0.569605  0.875906 -2.211372  0.974466 -2.006747  bar

拡張機能

  • HDFStore は、ネイティブの PyTables テーブル形式のテーブルを読み取れるようになりました。

  • nan_rep = 'my_nan_rep' を append に渡すことで、ディスク上のデフォルトの nan 表現 (これは np.nan との間で変換されます) を変更できます。これはデフォルトで nan になります。

  • indexappend に渡すことができます。これはデフォルトで True です。これにより、テーブルのインデックス可能な列データ列に自動的にインデックスが作成されます。

  • chunksize=an integerappend に渡すことで、書き込みチャンクサイズを変更できます (デフォルトは 50000)。これにより、書き込み時のメモリ使用量が大幅に削減されます。

  • expectedrows=an integer を最初の append に渡すことで、PyTables が期待する合計行数を設定できます。これにより、読み書きパフォーマンスが最適化されます。

  • Select は、選択空間を制限するために startstop を渡すことをサポートするようになりました。

  • ファイルパーサーの ISO8601 (例: yyyy-mm-dd) 日付解析が大幅に改善されました (GH 2698)

  • DataFrame.merge で、64ビット整数では大きすぎる組み合わせサイズを処理できるようになりました (GH 2690)

  • Series に単項否定 (-series) および反転 (~series) 演算子が追加されました (GH 2686)

  • DataFrame.plot に、x軸を対数スケールに変更する logx パラメータが追加されました (GH 2327)

  • Series の算術演算子が定数および ndarray 入力を処理できるようになりました (GH 2574)

  • ExcelFile に、ファイルタイプを指定するための kind 引数が追加されました (GH 2613)

  • Series.str メソッドの高速な実装 (GH 2602)

バグ修正

  • HDFStore テーブルは、float32 型を正しく保存できるようになりました (ただし、float64 と混在させることはできません)

  • リクエストセグメント指定時の Google Analytics プレフィックスを修正 (GH 2713)。

  • Google Analytics トークンストアをリセットする機能が追加され、ユーザーは不適切に設定されたクライアントシークレットから回復できるようになりました (GH 2687)。

  • MultiIndex を渡したときにセグメンテーション違反を引き起こす groupby のバグを修正 (GH 2706)

  • datetime64 値を持つ Series を to_datetime に渡すと、誤った出力値になるバグを修正 (GH 2699)

  • HDFStore 式でパターンが有効な正規表現でない場合の pattern in HDFStore のバグを修正 (GH 2694)

  • ブール型データの集計時に発生するパフォーマンスの問題を修正 (GH 2692)

  • ブール型マスクキーと新しい値の Series が与えられた場合、Series.__setitem__ は入力値を元の Series にアラインするようになりました (GH 2686)

  • 非常に多くの組み合わせ値を持つ MultiIndex レベルをソートする際にカウントソートを実行することで引き起こされる MemoryError を修正 (GH 2684)

  • インデックスが固定オフセットタイムゾーンを持つ DatetimeIndex である場合にプロットが失敗するバグを修正 (GH 2683)

  • オフセットが5営業日を超え、開始日が週末である場合の営業日減算ロジックを修正 (GH 2680)

  • Cファイルパーサーが、ファイルがデータよりも多くの列を持つ場合の動作を修正 (GH 2668)

  • 暗黙の列と指定された usecols 値が存在する場合に、列とデータがずれるファイルリーダーのバグを修正。

  • 数値または datetime インデックスを持つ DataFrame は、プロット前にソートされるようになりました (GH 2609)

  • columns、index、しかし空の records が渡された場合の DataFrame.from_records エラーを修正 (GH 2633)

  • dtype が datetime64 である場合の Series 操作に関するいくつかのバグを修正 (GH 2689GH 2629GH 2626)

完全なリストについては、GitHub の完全なリリースノートまたはイシュートラッカーを参照してください。

貢献者#

このリリースには合計17人がパッチを貢献しました。「+」が付いている名前の人は、今回初めてパッチを貢献しました。

  • Andy Hayden +

  • Anton I. Sipos +

  • Chang She

  • クリストファー・ウィーラン

  • Damien Garaud +

  • Dan Allan +

  • Dieter Vandenbussche

  • Garrett Drapala +

  • Jay Parlar +

  • Thouis (Ray) Jones +

  • Vincent Arel-Bundock +

  • Wes McKinney

  • elpres

  • herrfz +

  • jreback

  • svaksha +

  • y-p