correct find_best_time_interval function. Create Readme

This commit is contained in:
Danila Gamkov 2025-04-25 12:33:44 +03:00
parent c2f6253575
commit 31cb99ec0c
4 changed files with 107 additions and 25 deletions

68
README.markdown Normal file
View File

@ -0,0 +1,68 @@
# asotr_flight
The asotr_flight python scripts is designed to analyze ASOTR flight data
## Contents
- **Setup**
- **Using**
- Plot ASOTR data in specified date borders (for MVN reports)
- **Contacts**
**Note**: \<PATH_TO_ASOTR_FLIGHT\> - path where is asotr_flight scripts is cloned from heagit
**Note**: \<PATH_TO_ASOTR_CSV\> - path where is asotr_csv program is cloned from heagit
## Setup
1. Install python 3.10 or newest.
2. Clone the repo to your computer:
```
git clone http://heagit.cosmos.ru/gamkov/asotr_flight.git
```
3. Enter the repo:
```
cd <PATH_TO_ASOTR_FLIGHT>
```
## Using
### Plot ASOTR data in specified date borders (for MVN reports)
1. Donwload data from science data server to directory \<PATH_TO_ASOTR_DATA\>.
If you don't have MVN data, you might download it from server with science SRG data (IP: 193.232.11.95).
For questions about downloading science data contact Shtykovsky A. (a.shtykovsky@cosmos.ru) or Chelovekov I. (chelovekov@cosmos.ru)
2. Parse all raw data from ASOTR into csv files and plot all csv data:
```
cd <PATH_TO_ASOTR_CSV>
./asotr_all_unzip_auto.sh <PATH_TO_ASOTR_DATA>/
```
csv data will be in directory:
```
<PATH_TO_ASOTR_CSV>/data/
```
3. plot ASOTR data in specified data borders
You might plot data by using shell-script (for MVN reports), for example:
```
cd <PATH_TO_ASOTR_FLIGHT>
./plot_flight_borders.sh <PATH_TO_ASOTR_CSV>/ 10.03.2025 23.04.2025 14 0
```
where:
10.03.2025 - start date
23.04.2025 - end date
14 - font size for plot
0 - display commands flag (not display)
Or you might plot data by using python script directly, for example:
```
cd <PATH_TO_ASOTR_FLIGHT>
python3 plot_flight_borders.py -s <PATH_TO_ASOTR_CSV> -c 100000 -a 01 -b 10.03.2025 -e 15.03.2025 -f 14 -d 0 -p 0
```
Graphs with data are in the directory:
```
<PATH_TO_ASOTR_FLIGHT>/reports
```
## Contatcs
For questions about the program, please contact Danila Gamkov, email: danila_gamkov@cosmos.ru

View File

@ -146,12 +146,12 @@ def find_best_time_idx(time_arr, user_time, accuracy='minutes') -> int:
elif accuracy == 'seconds':
delta = timedelta(seconds=30)
low = 0
high = len(time_arr) - 1
mid = len(time_arr) // 2
low = time_arr.idxmin()
high = time_arr.idxmax()
mid = time_arr.idxmin() + (time_arr.idxmax() - time_arr.idxmin()) // 2
if mid not in time_arr.index:
# print(f'mid not in time_arr: {mid}')
# print(f'mid not in time_arr: {mid}, {time_arr.index}, {time_arr.idxmin()}')
return -1
a = time_arr[mid]
@ -160,7 +160,7 @@ def find_best_time_idx(time_arr, user_time, accuracy='minutes') -> int:
low = mid + 1
else:
high = mid - 1
mid = (low + high) // 2
mid = low + (high - low) // 2
# print(f'mid: (low + high)/2: {mid}')
if mid not in time_arr.index:
@ -186,8 +186,14 @@ def find_best_time_idx(time_arr, user_time, accuracy='minutes') -> int:
# print(f'{time_arr[j]} > {tstamp}: {j}')
return j
if mid <= low + 1 or mid >= high - 1:
return -1
return mid
class TimeIndexNotFound(Exception):
pass
def find_time_idx(data_list, keys_list, timestamp, accuracy):
out_dict = dict.fromkeys(keys_list, -1)

View File

@ -16,7 +16,7 @@ def convert_to_str(lst):
res += f"_{idx + 1}"
return res
def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0, show_flag=False):
def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0, show_flag=True):
print_width = 20
print_height = 12
width = 1
@ -74,7 +74,8 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
plt.tight_layout()
fig.savefig(pict_name)
plt.show()
if show_flag == True:
plt.show()
elif plot_windows == 2:
@ -85,22 +86,29 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
if cmd == '1':
fname = './flight_cmd_human.txt'
try:
cmd_human = pd.read_csv('./flight_cmd_human.txt',
cmd_human = pd.read_csv('./data/cmd_human.csv',
delimiter=';', names=['timestamp', 'cmd'])
except Exception as e:
print(f'Error parsing file: {e}')
return
max_temp = max(data_dict['temp'].iloc[:,1])
min_temp = min(data_dict['temp'].iloc[:,1])
# print(cmd_human)
step = 0
for i, row in cmd_human.iterrows():
if i > 20:
row_time = row['timestamp'][0:len(row['timestamp']) - 4]
idx = asotr.find_best_time_idx(data_dict['time_temp'],
row_time, accuracy='minutes')
if idx != -1:
ax1.axvline(x = data_dict['time_temp'][idx], color='r',
linestyle='-.')
ax1.text(data_dict['time_temp'][idx], 30, row['cmd'],
rotation=45, va='bottom', fontsize=font)
row_time = row['timestamp'][0:len(row['timestamp']) - 4]
# print(row_time)
idx = asotr.find_best_time_idx(data_dict['time_temp'],
row_time, accuracy='minutes')
# print(idx)
if idx != -1:
ax1.axvline(x = data_dict['time_temp'][idx], color='r',
linestyle='-.')
ax1.text(data_dict['time_temp'][idx], max_temp - step, row['cmd'],
rotation=45, va='bottom', fontsize=font)
step += (max_temp - min_temp)/20
if plot_task["temp"] == 1:
for i in range(len(channels)):
@ -176,6 +184,6 @@ if __name__ == '__main__':
argparser.add_argument('-p', '--plot', required=False,
help='display data in plot flag (0/1)')
args = argparser.parse_args()
plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end,
args.font, args.cmd, args.plot)

View File

@ -12,19 +12,19 @@ from datetime import timedelta
path = '/home/danila/Danila/work/MVN/Soft/asotr_csv/data/'
channel = 'ch1'
asotr_kit = '01'
start_date = '23.04.2025 00:00:00'
start_date = '22.04.2025 00:00:00'
end_date = '23.04.2025 01:20:00'
forecast_days = 20
# end_date = '26.03.2025 01:20:00'
timeformat = '%d.%m.%Y %H:%M:%S'
delta_date = datetime.strptime(start_date, timeformat) + timedelta(days=forecast_days)
end_date = delta_date.strftime(timeformat)
num_peaks_forecast = forecast_days * 20
# start_date = '06.01.2025 22:40:00'
# end_date = '21.01.2025 01:20:00'
shift = True
raw_data, data_dict = asotr.get_data(path, asotr_kit, start_date, end_date, 'minutes')
try:
raw_data, data_dict = asotr.get_data(path, asotr_kit, start_date, end_date, 'minutes')
except Exception as e:
sys.exit()
data1 = data_dict['temp'][channel]
time1 = data_dict['time_temp']