Вход в прологе

Не имея ваших данных, я сделал два примера DataFrames

Прежде всего вам нужно импортировать данные из Excel в pandas с помощью:

df1 = pd.read_excel('name_file.xlsx', sheet_name='year2018')

И сделать это для каждый год.

После этого вы можете использовать мой пример, чтобы получить ожидаемый результат:

# Example dataframe 1
print(df1)

   Month  Date  Year Time   mb  dir
0      1     1  2018   AM  100  265
1      1     1  2018   AM  150  265
2      1     1  2018   AM  200  270
3      1     1  2018   AM  250  270
4      1     1  2018   PM  100  265
5      1     1  2018   PM  150  265
6      1     1  2018   PM  200  265
7      1     1  2018   PM  250  265

#Example dataframe2
print(df2)

   Month  Date  Year Time   mb  dir
0      1     1  2019   AM  100  275
1      1     1  2019   AM  150  275
2      1     1  2019   AM  200  280
3      1     1  2019   AM  250  280
4      1     1  2019   PM  100  275
5      1     1  2019   PM  150  275
6      1     1  2019   PM  200  275
7      1     1  2019   PM  250  280

Мы можем использовать pandas.concat , чтобы объединить кадры данных (в вашем случае это может быть больше чем два).

df_all = pd.concat([df1, df2], ignore_index=True)
print(df_all)

    Month  Date  Year Time   mb  dir
0       1     1  2018   AM  100  265
1       1     1  2018   AM  150  265
2       1     1  2018   AM  200  270
3       1     1  2018   AM  250  270
4       1     1  2018   PM  100  265
5       1     1  2018   PM  150  265
6       1     1  2018   PM  200  265
7       1     1  2018   PM  250  265
8       1     1  2019   AM  100  275
9       1     1  2019   AM  150  275
10      1     1  2019   AM  200  280
11      1     1  2019   AM  250  280
12      1     1  2019   PM  100  275
13      1     1  2019   PM  150  275
14      1     1  2019   PM  200  275
15      1     1  2019   PM  250  280

Теперь мы можем использовать pandas.Groupby.Series.mean , чтобы получить ожидаемый результат:

print(df_all.groupby(['Month', 'Date', 'Time', 'mb']).dir.mean().reset_index())

   Month  Date Time   mb    dir
0      1     1   AM  100  270.0
1      1     1   AM  150  270.0
2      1     1   AM  200  275.0
3      1     1   AM  250  275.0
4      1     1   PM  100  270.0
5      1     1   PM  150  270.0
6      1     1   PM  200  270.0
7      1     1   PM  250  272.5

8
задан Sebastian 29 December 2012 в 22:07
поделиться

4 ответа

Для этого вида вещи я обычно создаю предикаты оболочки. Таким образом в Вашем случае...

guided:-
    print('Enter your start point'),nl,
    read(Start),
    print('Enter your destination'),nl,
    read(Dest),
    routeplan(Start, Dest, Route),
    print_route(Route).

И print_route/1 мог быть чем-то рекурсивным как это:

print_route([]).

print_route([[A,B,Method]|Tail]):-
    print_route(Tail),
    print('Go from '), print(A),
    print(' to '), print(B),
    print(' by '), print(Method), nl.

Я предположил, что 3-я переменная routeplan/3 предиката является списком списков. Также то, что это создается путем добавления к хвосту. Если это не, должно быть довольно легко адаптироваться. Спросите в комментариях.

2
ответ дан 5 December 2019 в 15:26
поделиться

Гм, если я понимаю Вас правильно, Вы просто хотите отформатировать список приятно для распечатывания, нет?

В SWI-прологе это работает:

output_string([A,B],StrIn,StrOut) :-
 concat_atom([StrIn, 'Finally, Go from ', A, ' to ', B, '.'],StrOut),
 write(StrOut).

output_string([A,B|Rest],StrIn,StrOut) :-
 concat_atom([StrIn,'Go from ', A, ' to ', B, '.\n'],StrAB),
 output_string([B|Rest],StrAB,StrOut).

затем звоните с

output_string(P,'',_).

Это, вероятно, не очень эффективно, но это делает задание.:)

4
ответ дан 5 December 2019 в 15:26
поделиться

Книгой, которая обсуждает такие вещи подробно, является Обработка естественного языка для Программистов Пролога Michael A. Covington.

В целом то, что необходимо сделать,

  1. Маркируйте вход
  2. Проанализируйте маркеры (например, с DCG) для получения входа для routeplan/3
  3. Звонить routeplan/3
  4. Генерируйте некоторый английский язык на основе вывода routeplan/3

Что-то вроде этого (работает в SWI-прологе):

% Usage example:
%
% ?- query_to_response('Route from selly_oak to aston', Response).
%
% Response = 'go from selly_oak to edgbaston then go from edgbaston
%         to aston then stop .'
%
query_to_response(Query, Response) :-
    concat_atom(QueryTokens, ' ', Query), % simple tokenizer
    query(path(From, To), QueryTokens, []),
    routeplan(From, To, Plan),
    response(Plan, EnglishTokens, []),
    concat_atom(EnglishTokens, ' ', Response).

% Query parser
query(path(From, To)) --> ['Route'], from(From), to(To).
from(From) --> [from], [From], { placename(From) }.
to(To) --> [to], [To], { placename(To) }.

% Response generator
response([_]) --> [stop], [.].
response([From, To | Tail]) -->
    goto(path(From, To)), [then], response([To | Tail]).
goto(path(From, To)) --> [go], from(From), to(To).

% Placenames
placename(selly_oak).
placename(aston).
placename(edgbaston).

% Mock routeplan/3
routeplan(selly_oak, aston, [selly_oak, edgbaston, aston]).
5
ответ дан 5 December 2019 в 15:26
поделиться

Вот несколько предикатов для чтения строк из файла/потока в строку Пролога:

%%% get_line(S, CL): CL is the string read up to the end of the line from S.
%%% If reading past end of file, returns 'end_of_file' in CL first, raises
%%% an exception second time.
%%% :- pred get_string(+stream, -list(int)).
get_line(S, CL) :-
    peek_code(S, C),
    (   C = -1
    ->  get_code(S, _),
        CL = end_of_file
    ;   get_line(S, C, CL)).

get_line(_, -1, CL) :- !, CL = [].  % leave end of file mark on stream
get_line(S, 0'\n, CL) :- !,
    get_code(S, _),
    CL = [].
get_line(S, C, [C|CL]) :-
    get_code(S, _),
    peek_code(S, NC),
    get_line(S, NC, CL).

%% read_lines(L): reads lines from current input to L.  L is a list of list
%% of character codes, newline characters are not included.
%% :- pred read_lines(-list(list(char))).
read_lines(L) :-
    current_input(In),
    get_line(In, L0),
    read_lines(In, L0, L).

%% read_lines(F, L): reads lines from F to L.  L is a list of list of character
%% codes, newline characters are not included.
%% :- pred read_lines(+atom, -list(list(char))).
read_lines(F, L) :-
    fail_on_error(open(F, read, S)),
    call_cleanup((get_line(S, L0),
              read_lines(S, L0, L)),
             close(S)).

read_lines(_, end_of_file, L) :- !, L = [].
read_lines(S, H, [H|T]) :-
    get_line(S, NH),
    read_lines(S, NH, T).

Затем смотрите на DCGs для получения информации о том, как проанализировать строку.

0
ответ дан 5 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: