バージョン 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になります。indexをappendに渡すことができます。これはデフォルトでTrueです。これにより、テーブルのインデックス可能な列とデータ列に自動的にインデックスが作成されます。chunksize=an integerをappendに渡すことで、書き込みチャンクサイズを変更できます (デフォルトは 50000)。これにより、書き込み時のメモリ使用量が大幅に削減されます。expectedrows=an integerを最初のappendに渡すことで、PyTablesが期待する合計行数を設定できます。これにより、読み書きパフォーマンスが最適化されます。Selectは、選択空間を制限するためにstartとstopを渡すことをサポートするようになりました。ファイルパーサーの 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 2689、GH 2629、GH 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