1. Mono -> Flux 전환 / flatMapMany 예

@Test
public void flatMapMany_test001() {
// List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
  List<Integer> list = new ArrayList<>();
  for(int i = 0; i < 100000; i++)
    list.add(i);

  // Publisher가 Mono 라서 List가 길어도, 1번으로 emit 되서, subscribe하면 mono -> Flux 전환된 데이터 모두 출력된다.
  Mono.just(list)
      .flatMapMany(n -> Flux.fromIterable(n))
      .map(n -> n * 10)
      .subscribe(n -> log.info(n + ""));
}

@Test
public void flatMapMany_test002() {
  List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

  // Publisher가 Mono 라서 List가 길어도 1번으로 emit 되서, subscribe하면 mono -> Flux 전환된 데이터 모두 출력된다.
  Mono.just(list)
      .flatMapMany(n -> Flux.fromIterable(n).map(x -> x * 10))
//   .map(n -> n * 10)
      .subscribe(n -> log.info(n + ""));
}

 

2. Mono -> Flux 전환 / flatMapMany 예

@Test
	public void test_sql03() {
		String COUNT_KEY = "COUNT_KEY";
		Map<String, Integer> cntMap = new HashMap<>();
		cntMap.put(COUNT_KEY, 0);
		
		String sql3 = "SELECT ORDER_ID, CUSTOMER_ID, STATUS, NVL(SALESMAN_ID, -1) AS SALESMAN_ID, ORDER_DATE FROM ORDERS ORDER BY ORDER_ID";
		
		AtomicReference<Long> startTime = new AtomicReference<>();
		
		Mono.from(
					ConnectionFactories.get(
						ConnectionFactoryOptions.builder()
							.option(ConnectionFactoryOptions.DRIVER, "oracle")
//							.option(OracleR2dbcOptions.DESCRIPTOR, "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.29)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1) ) )")
							.option(ConnectionFactoryOptions.HOST, "127.0.0.1")
							.option(ConnectionFactoryOptions.PORT, 1521)
							.option(ConnectionFactoryOptions.DATABASE, "XEPDB1")
							.option(ConnectionFactoryOptions.USER, "ot")
							.option(ConnectionFactoryOptions.PASSWORD, "1111")
							.build()
						).create()
				)
				.doOnNext(connection -> log.debug(connection.toString()))
				.flatMapMany(connection -> 
					Mono.from(connection.createStatement(sql3).execute())
						.flatMapMany(result -> 
								result.map(row -> {
									Orders orders = new Orders(row.get("ORDER_ID", Integer.class), row.get("CUSTOMER_ID", Integer.class), row.get("STATUS", String.class), row.get("SALESMAN_ID", Integer.class), row.get("ORDER_DATE", LocalDateTime.class));
									return orders;
								}
							)
						)
					    .doFinally((st) -> {
					    	connection.close();
					    	log.debug("### connection.close()");
					    })
				).doOnSubscribe(x -> startTime.set(System.nanoTime()))
				.doOnNext(n -> {
					cntMap.put(COUNT_KEY, cntMap.get(COUNT_KEY) + 1 ); // count row
				})
				.doAfterTerminate(() -> {
					log.info("Time taken : " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get()) + " milliseconds.");
					log.debug("## count = " + cntMap.get(COUNT_KEY));					
				})
				.subscribe(n -> log.debug(n.toString()));
		
		try {
			Thread.sleep(5000L);
		} catch (InterruptedException e) {
		}
	}

 

	@Test
	public void test_sql05() {
		log.info("### test_sql04() - start");
		
		String COUNT_KEY = "COUNT_KEY";
		Map<String, Integer> cntMap = new HashMap<>();
		cntMap.put(COUNT_KEY, 0);
		
		String sql3 = "SELECT ORDER_ID, CUSTOMER_ID, STATUS, NVL(SALESMAN_ID, -1) AS SALESMAN_ID, ORDER_DATE FROM ORDERS ORDER BY ORDER_ID";
		
		AtomicReference<Long> startTime = new AtomicReference<>();
		
		ConnectionFactory confactory = connectionFactory();
		
			
		Flux<Orders> xx = Mono.from(confactory.create())
		    .flatMapMany(connection ->     // return Flux. Flux로 받으려면 Mono의 flatMapMany로 Mono로 받으면 Mono의 FlatMap 으로.
				Mono.from(connection.createStatement(sql3).execute())		
				    .flatMapMany(result -> // return Flux
							result.map(row -> {
								Orders orders = new Orders(row.get("ORDER_ID", Integer.class), row.get("CUSTOMER_ID", Integer.class), row.get("STATUS", String.class), row.get("SALESMAN_ID", Integer.class), row.get("ORDER_DATE", LocalDateTime.class));
								return orders;				    	
							})
				    )
				    .doFinally((st) -> {
				    	connection.close();
				    	log.debug("### connection.close()");
				    })
		    );
				
		xx.subscribe(n -> log.debug(n.toString()));
				
		// 한건 테스트. block 으로 뽑음.
//		Orders yyy = xx.blockFirst();
//		log.debug("### yyy = " + yyy.toString());

		try {
			Thread.sleep(15000L);
		} catch (InterruptedException e) {
		}
	}
    
      public ConnectionFactory connectionFactory() {
	    ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
	        .option(ConnectionFactoryOptions.DRIVER, "pool")
	        .option(ConnectionFactoryOptions.PROTOCOL, "oracle")
			.option(OracleR2dbcOptions.DESCRIPTOR, "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.19)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1) ) )")
			.option(ConnectionFactoryOptions.USER, "ot")
			.option(ConnectionFactoryOptions.PASSWORD, "1111")
	        .build());
	    
//	    Mono<Connection> con1 = (Mono<Connection>) connectionFactory.create();
//	    Flux<Connection> con2 = (Flux<Connection>) connectionFactory.create();
	    
	    int initialSize = 1;
	    int maxSize = 5;
	    ConnectionPoolConfiguration configuration = ConnectionPoolConfiguration.builder(connectionFactory)
	        .maxIdleTime(Duration.ofMinutes(30))
	        .initialSize(initialSize)
	        .maxSize(maxSize)
	        .maxCreateConnectionTime(Duration.ofSeconds(1))
//	        .maxAcquireTime(Duration.ofSeconds(1))
//	        .validationQuery("SELECT 1 FROM DUAL")
//	        .maxValidationTime(Duration.ofSeconds(2))
	        .build();
	    		    
	    return new ConnectionPool(configuration);
	  }
728x90

'Programming Language > Reactive Programing' 카테고리의 다른 글

Reactor Hooks 관련 글 모음  (0) 2023.10.06

 

JSON (JavaScript Object Notation)은 가벼운 데이터 교환 형식입니다. 
JavaScript 프로그래밍 언어 표준 ECMA-262 3판 - 1999년 12월의 하위 집합을 기반으로 합니다. 
JSON은 완전히 언어 독립적인 텍스트 형식이지만 C를 비롯한 C 계열 언어의 프로그래머에게 친숙한 규칙을 사용합니다. 
이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다.

JSON은 두 가지 구조를 기반으로 합니다.

1. 이름/값 쌍의 모음. 다양한 언어에서 이것은 객체 , 레코드, 구조체, 사전, 해시 테이블, 키 목록 또는 연관 배열 로 실현됩니다 .
 - {} : 객체로 이름/값 의 정렬되지 않은 집합

 

2. 정렬된 값 목록. 대부분의 언어에서 이는 배열 , 벡터, 목록 또는 시퀀스로 실현됩니다.
 - [] : 배열로 정렬 된 값 모음. 배열에 객체를 다양하게 담을 수 있기 때문에, 처음 의도와 달리 순수한 정렬된 값 목록으로는 사용되지 않음.

 

9.양식

1) whitespace 는 공백("", " "), 캐리지리턴, 폼피드, 탭가 있음.

2) 제어문자

\b 백스페이스

\f 폼 피드

\n 개행

\r 캐리지 리턴

\t 탭

\" 따옴표

\/ 슬래시

\\ 역슬래시

\uHHHH  16진수 네자리로되어 있는 유니코드 문자

 

관련사이트

https://www.json.org/

https://ko.wikipedia.org/wiki/JSON

 {
    "키1": "가나다",
    "키2": 999,
    "배열1": ["A", "B"],
    "객체1": {"키1": 0, "키2": "문자1", "키3": "문자2"},
 }

end.

728x90

 

 

출력 시 기본 터미널 크기(80byte)에 맞추기 위해서 데이터 프레임이 잘려서 나눠 출력되는데,

터미널 사이즈를 조정해서 출력한다.

from shutil import get_terminal_size

# 터미널 크기에 맞게 출력함
pd.set_option('display.width', get_terminal_size()[0])
print(df)

# 최대 1000 사이즈로 출력함
pd.set_option('display.width', 1000)
print(df)
728x90

'Programming Language > Python' 카테고리의 다른 글

python 문제 해결 목록  (0) 2024.04.29
python DB 연결  (0) 2024.04.29
Python 모듈 실행시 ModuleNotFoundError 처리  (0) 2022.03.25
[Python] pandas - DataFrame Text 출력  (0) 2022.03.19
[Python] 클래스  (0) 2022.03.14

상관계수(r)와 유의확율(p-value)

1. Correlation (상관관계)
  - 상관관계는 두 변수간의 관계의 강도와 방향을 설명하는 척도입니다. 변수가 얼마나 밀접하게 관련되어 있는지 연구하는 데 사용되는 방법을 Correlation Analysis(상관분석)라 합니다.
   그러나, 상관관계가 인과 관계를 의미하지는 않습니다. 한 변수의 변경이 다른 변수의 변경과 연관되어 있다는 사실이 실제로 다른 변수가 변경되는 것을 의미하지는 않습니다. (인관관계는 선형회귀분석으로)

2. 상관계수(r)와 상관 관계 해석
2.1 상관계수 r : 두 연속 변수 간의 연관 정도에 대한 수치.
  - 계수값은 항상 -1과 1사이이며, 변수간의 선형 관계의 강도와 방향을 모두 측정함.
 1) Strength(힘): 계수의 절대 값이 클수록 관계가 강해집니다.
   - 0에서 +1, -1 사이의 값은 약함, 보통 및 강함 관계의 척도를 나타냅니다. 마찬가지로 R은 -1 또는 1 에 가까울 수록 관계의 강도가 증가합니다.
 2) Direction(방향): 계수 기호(더하기, 빼기)는 관계의 방향을 나타냅니다.
    - 양의 계수는 직접적인 상관 관계를 나타내며 한 변수가 증가하면 다른 변수도 증가합니다.
    - 음의 계수는 역 상관을 나타내며, 그래프에서 하향 기울기를 생성합니다. 한 변수가 증가면 다른 변수는 감소하는 경향이 있습니다.
     . 계수 1은 완전환 양의 관계를 의미합니다. 한 변수가 증가하면 다른 변수는 비례 적으로 증가합니다.
     . 계수 -1은 완벽한 음의 관계를 의미합2니다. 한 변수가 증가하면 다른 변수는 비례적으로 감사합니다.
     . 계수 0은 두 변수간에 관계가 없음을 의미합니다. 데이터 포인트는 그래프 전체에 흩어져 있습니다.

3. 관련수식
3.1 R : 상관계수
3.2 R Square(R제곱값: R^2) : 결정계수
   - 이 값은 추세선이 데이터에 얼마나 잘 대응하는 지 나타내며, R^2가 1에 가까울수록 적합도가 더 좋습니다.
3.3 P-Value
  - 유의확률. 귀무가설이 맞다고 가정할 때 얻은 결과보다 극단적인 결과가 실제로 관측될 확률이다. p-value가 작을 수록 그 정도가 약하다고 보며, 특정 값(대게 0.05나 0.01)보다 작을 경우 귀무가설을 기각하는 것이나 여기에는 여러가지 문제들이 있다.
  - p-value는 보통 검정통계량(t)과 자유도(df) 로 계산됨. (엑셀에서 TDIS(t, df, false(양측검증)) 함수)
  - 검정통계량(t)은 상관계수에서 아래 식을 통해서 계산할 수 있음.
  - 자유도는 표본쌍(n) - 2로 계산
  ps1. 결정계수 = 상관계수^2
  ps2. 상관계수 = SQRT(결정계수) = 결정계수^0.5=√ℛ
  ps3. 차트에 추세선 추가하고, 상단에 추세선 수식 표시. (예: y= 0.003x + 11.11 (추세선 선형 방정식 y=ax + b))

3.4 선형방정식
  : 차트에서 추세선을 그리기위한 계산식. X의 min/max로 추세선을 추가하고, 산술식을 표기한다.
 1) 선형방정식
  Y = {0}X (+or-) {1}
    - {0} : slope
    - {1}: yintercept

 

end.

728x90

'Programming Language > 알고리즘' 카테고리의 다른 글

[주식] RSI (Relative Strength Index)  (0) 2022.03.06
[주식] 이동평균 계산  (0) 2022.03.06

+ Recent posts