Не имея ваших данных, я сделал два примера 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
Для этого вида вещи я обычно создаю предикаты оболочки. Таким образом в Вашем случае...
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 предиката является списком списков. Также то, что это создается путем добавления к хвосту. Если это не, должно быть довольно легко адаптироваться. Спросите в комментариях.
Гм, если я понимаю Вас правильно, Вы просто хотите отформатировать список приятно для распечатывания, нет?
В 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,'',_).
Это, вероятно, не очень эффективно, но это делает задание.:)
Книгой, которая обсуждает такие вещи подробно, является Обработка естественного языка для Программистов Пролога Michael A. Covington.
В целом то, что необходимо сделать,
routeplan/3
routeplan/3
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]).
Вот несколько предикатов для чтения строк из файла/потока в строку Пролога:
%%% 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 для получения информации о том, как проанализировать строку.