Как рассчитывать шаблоны в каждой строке отдельно в кадре данных в Python - PullRequest
0 голосов
/ 23 декабря 2018

Я смотрю на все возможные комбинации 0 и 1 в последовательности длиной 4. Таким образом, у меня есть 2 ^ 4 строки в кадре данных или в списке.(Я не против формата, пока каждую комбинацию можно рассматривать отдельно).В этих комбинациях я ищу конкретные перекрывающиеся паттерны.

patterns=["00","101","1100"] 

В результате в первой комбинации «0000» я хотел бы, чтобы Python сообщил мне, что он обнаружил 3 инцидента (мне все равно, какой из трех).Я нашел такие функции, как search (), но они дают только общее количество шаблонов для всех 16 комбинаций, но не для каждой в отдельности.Кроме того, я не могу вписаться в правильный стиль данных.Пробовал str.count (), но опять же, похоже, у меня не работает даже после преобразования кадра данных в строку.
Лучшее, что я мог придумать, было:

import itertools
sequ=[x for x in itertools.product(states,repeat=n)] #generates all the 
possible seq-s of the variable
from re import finditer
patterns=["00","101","1100"]
for match in finditer(patterns, sequ):
print(match.span())

Однако это толькоприблизительно работает для простых шаблонов, например, patterns=["00"]

1 Ответ

0 голосов
/ 23 декабря 2018
def main():
    n = int(input("Enter number of digits: "))
    for i in range(0, 1<<n):
        gray=i^(i>>1)
        print ("{:0{}b}".format(gray,n))

main()

#Input: 4
#Output:
#0000
#0001
#0011
#0010
#0110
#0111
#0101
#0100
#1100
#1101
#1111
#1110
#1010
#1011
#1001
#1000

Я думаю, это то, что вы ищете.
Для этого не нужно использовать фрейм данных.Это битовый переворот

РЕДАКТИРОВАТЬ:

def graylist(n):
    outlist = []
    for i in range(0, 1<<n):
        gray=i^(i>>1)
#        print ("{:0{}b}".format(gray,n))
        outlist.append('{:0{}b}'.format(gray,n))
    return outlist

alist = graylist(4)

def countingpattern(alist, string):

    count = 0
    for item in alist:
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
    return count

print (countingpattern(alist, '00')) #12
print (countingpattern(alist, '101')) #4
print (countingpattern(alist, '1100')) #1

Чтобы увидеть все шаблоны, мы можем затем поместить результаты в словарь.

def countingpatterndict(alist, string):
    adict = {}
    for item in alist:
        count = 0
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
            adict[item] = count
    return adict

print (countingpatterndict(alist, '00')) 
#'0000': 3, '0001': 2, '0011': 1, '0010': 1, ...
print (countingpatterndict(alist, '101'))
#'1110': 0, '1010': 1, '1011': 1, ...
print (countingpatterndict(alist, '111'))
#'1101': 0, '1111': 2, '1110': 1, ...

Дальнейшее редактирование:

def graylist(n):
    outlist = []
    for i in range(0, 1<<n):
        gray=i^(i>>1)
        outlist.append('{:0{}b}'.format(gray,n))
    return outlist

def countingpatterndict(alist, string):
    adict = {}
    for item in alist:
        count = 0
        for i in range(len(item)):
            if item[i:i+len(string)] == string:
                count += 1
            adict[item] = count
    return adict

alist = graylist(20)
import time
import pandas as pd
z1 = time.clock()
df = pd.DataFrame.from_dict(countingpatterndict(alist, '101'), orient='index')
z2 = time.clock() - z1
print (z2) #5.716345938402242 seconds
print (df)
df.to_csv('result.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...