|
5 | 5 | import warnings
|
6 | 6 | from datetime import timedelta
|
7 | 7 | from distutils.version import LooseVersion
|
| 8 | +import operator |
8 | 9 | import sys
|
9 | 10 | import pytest
|
10 | 11 |
|
|
13 | 14 | from numpy.random import randn
|
14 | 15 | import numpy as np
|
15 | 16 |
|
16 |
| -from pandas.compat import lrange, product |
| 17 | +from pandas.compat import lrange, product, PY35 |
17 | 18 | from pandas import (compat, isna, notna, DataFrame, Series,
|
18 | 19 | MultiIndex, date_range, Timestamp, Categorical,
|
19 | 20 | _np_version_under1p15)
|
@@ -2091,7 +2092,6 @@ def test_clip_with_na_args(self):
|
2091 | 2092 | self.frame)
|
2092 | 2093 |
|
2093 | 2094 | # Matrix-like
|
2094 |
| - |
2095 | 2095 | def test_dot(self):
|
2096 | 2096 | a = DataFrame(np.random.randn(3, 4), index=['a', 'b', 'c'],
|
2097 | 2097 | columns=['p', 'q', 'r', 's'])
|
@@ -2144,6 +2144,63 @@ def test_dot(self):
|
2144 | 2144 | with tm.assert_raises_regex(ValueError, 'aligned'):
|
2145 | 2145 | df.dot(df2)
|
2146 | 2146 |
|
| 2147 | + @pytest.mark.skipif(not PY35, |
| 2148 | + reason='matmul supported for Python>=3.5') |
| 2149 | + def test_matmul(self): |
| 2150 | + # matmul test is for GH #10259 |
| 2151 | + a = DataFrame(np.random.randn(3, 4), index=['a', 'b', 'c'], |
| 2152 | + columns=['p', 'q', 'r', 's']) |
| 2153 | + b = DataFrame(np.random.randn(4, 2), index=['p', 'q', 'r', 's'], |
| 2154 | + columns=['one', 'two']) |
| 2155 | + |
| 2156 | + # DataFrame @ DataFrame |
| 2157 | + result = operator.matmul(a, b) |
| 2158 | + expected = DataFrame(np.dot(a.values, b.values), |
| 2159 | + index=['a', 'b', 'c'], |
| 2160 | + columns=['one', 'two']) |
| 2161 | + tm.assert_frame_equal(result, expected) |
| 2162 | + |
| 2163 | + # DataFrame @ Series |
| 2164 | + result = operator.matmul(a, b.one) |
| 2165 | + expected = Series(np.dot(a.values, b.one.values), |
| 2166 | + index=['a', 'b', 'c']) |
| 2167 | + tm.assert_series_equal(result, expected) |
| 2168 | + |
| 2169 | + # np.array @ DataFrame |
| 2170 | + result = operator.matmul(a.values, b) |
| 2171 | + expected = np.dot(a.values, b.values) |
| 2172 | + tm.assert_almost_equal(result, expected) |
| 2173 | + |
| 2174 | + # nested list @ DataFrame (__rmatmul__) |
| 2175 | + result = operator.matmul(a.values.tolist(), b) |
| 2176 | + expected = DataFrame(np.dot(a.values, b.values), |
| 2177 | + index=['a', 'b', 'c'], |
| 2178 | + columns=['one', 'two']) |
| 2179 | + tm.assert_almost_equal(result.values, expected.values) |
| 2180 | + |
| 2181 | + # mixed dtype DataFrame @ DataFrame |
| 2182 | + a['q'] = a.q.round().astype(int) |
| 2183 | + result = operator.matmul(a, b) |
| 2184 | + expected = DataFrame(np.dot(a.values, b.values), |
| 2185 | + index=['a', 'b', 'c'], |
| 2186 | + columns=['one', 'two']) |
| 2187 | + tm.assert_frame_equal(result, expected) |
| 2188 | + |
| 2189 | + # different dtypes DataFrame @ DataFrame |
| 2190 | + a = a.astype(int) |
| 2191 | + result = operator.matmul(a, b) |
| 2192 | + expected = DataFrame(np.dot(a.values, b.values), |
| 2193 | + index=['a', 'b', 'c'], |
| 2194 | + columns=['one', 'two']) |
| 2195 | + tm.assert_frame_equal(result, expected) |
| 2196 | + |
| 2197 | + # unaligned |
| 2198 | + df = DataFrame(randn(3, 4), index=[1, 2, 3], columns=lrange(4)) |
| 2199 | + df2 = DataFrame(randn(5, 3), index=lrange(5), columns=[1, 2, 3]) |
| 2200 | + |
| 2201 | + with tm.assert_raises_regex(ValueError, 'aligned'): |
| 2202 | + operator.matmul(df, df2) |
| 2203 | + |
2147 | 2204 |
|
2148 | 2205 | @pytest.fixture
|
2149 | 2206 | def df_duplicates():
|
|
0 commit comments