Python 用于数据帧的Cythonizing字符串数组比较函数

Python 用于数据帧的Cythonizing字符串数组比较函数,python,optimization,pandas,cython,Python,Optimization,Pandas,Cython,我刚刚开始学习Cython,希望您能给我一些指导,告诉我如何进行这个过程。我已经在代码中发现了一个速度瓶颈,并希望优化特定操作的性能 我有一个熊猫数据框交易,看起来像这样: Codes Price Size Time 2015-02-24 15:30:01-05:00 R6,IS 11.6100 100 2015-02-24 15:30:01-05:00 R6,IS 11.6100 100 2015-

我刚刚开始学习Cython,希望您能给我一些指导,告诉我如何进行这个过程。我已经在代码中发现了一个速度瓶颈,并希望优化特定操作的性能

我有一个熊猫数据框
交易
,看起来像这样:

                              Codes    Price  Size
Time
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00            11.6100   375
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
...                             ...      ...   ...
2015-02-24 15:59:55-05:00     R6,IS  11.5850   100
2015-02-24 15:59:55-05:00     R6,IS  11.5800   200
2015-02-24 15:59:55-05:00         T  11.5850   100
2015-02-24 15:59:56-05:00     R6,IS  11.5800   175
2015-02-24 15:59:56-05:00     R6,IS  11.5800   225

[5187 rows x 3 columns]
def isinCodes(codes_array1, codes_array2):

    for x in codes_array1:
        for y in codes_array2:
            if x == y: return True

    return False
我有一个名为
codes
numpy
数组:

array(['4', 'AP', 'CM', 'BP', 'FA', 'FI', 'NC', 'ND', 'NI', 'NO', 'PT',
       'PV', 'PX', 'SD', 'WO'],
      dtype='|S2')
我需要过滤
交易
,这样如果
代码
中的任何值包含在
交易['code']
中,则该行将被排除。目前我正在这样做:

ix = trades.Codes.str.split(',').apply(lambda cs: not any(c in excludes for c in cs))
trades = trades[ix]
但是,这太慢了,我需要加快速度。我想使用cython(如前所述,或者,看起来cython是更好的选择)

我基本上需要这样一个函数:

                              Codes    Price  Size
Time
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
2015-02-24 15:30:01-05:00            11.6100   375
2015-02-24 15:30:01-05:00     R6,IS  11.6100   100
...                             ...      ...   ...
2015-02-24 15:59:55-05:00     R6,IS  11.5850   100
2015-02-24 15:59:55-05:00     R6,IS  11.5800   200
2015-02-24 15:59:55-05:00         T  11.5850   100
2015-02-24 15:59:56-05:00     R6,IS  11.5800   175
2015-02-24 15:59:56-05:00     R6,IS  11.5800   225

[5187 rows x 3 columns]
def isinCodes(codes_array1, codes_array2):

    for x in codes_array1:
        for y in codes_array2:
            if x == y: return True

    return False

进行Cythonization时需要使用哪些类型?

这很容易矢量化

构建一个框架,我以100000*为例,1M行

In [76]: df2.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000000 entries, 0 to 9
Data columns (total 4 columns):
date      1000000 non-null datetime64[ns]
code      900000 non-null object
price     1000000 non-null float64
volume    1000000 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(1), object(1)
memory usage: 38.1+ MB

In [77]: df2.head()   
Out[77]: 
                 date   code  price  volume
0 2015-02-24 20:30:01  R6,IS  11.61     100
1 2015-02-24 20:30:01  R6,IS  11.61     100
2 2015-02-24 20:30:01  R6,IS  11.61     100
3 2015-02-24 20:30:01    NaN  11.61     375
4 2015-02-24 20:30:01  R6,IS  11.61     100
我在isin的末尾加了“T”

In [81]: isin                     
Out[81]: 
['4',
 'AP',
 'CM',
 'BP',
 'FA',
 'FI',
 'NC',
 'ND',
 'NI',
 'NO',
 'PT',
 'PV',
 'PX',
 'SD',
 'WO',
 'T']
结果

In [82]: df2[(result.A.isin(isin) | result.A.isin(isin))].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100000 entries, 7 to 7
Data columns (total 4 columns):
date      100000 non-null datetime64[ns]
code      100000 non-null object
price     100000 non-null float64
volume    100000 non-null int64
dtypes: datetime64[ns](1), float64(1), int64(1), object(1)
memory usage: 3.8+ MB

In [83]: df2[(result.A.isin(isin) | result.A.isin(isin))].head()
Out[83]: 
                 date code   price  volume
7 2015-02-24 20:59:55    T  11.585     100
7 2015-02-24 20:59:55    T  11.585     100
7 2015-02-24 20:59:55    T  11.585     100
7 2015-02-24 20:59:55    T  11.585     100
7 2015-02-24 20:59:55    T  11.585     100

为什么不使用set.intersection?你的算法是二次的,cython不会有多大帮助