http://www.lfd.uci.edu/~gohlke/pythonlibs/


1. 접속


2. rpy2 검색해서 다운로드. 난 64비트라 가장 밑에 있는 amd64 붙은 것을 다운 받음. 


Rpy2 (unstable) provides access to the R software environment for statistical computing and graphics.
Requires R 3.2.




3. 다운로드 받은 파일을 유저 바로 아래 자기컴퓨터명 폴더 경로에 넣음. C:\Users\Kun 

-만약에 이러기 싫으면 프롬포트 창에서 cd [자기 다운로드받은 파일 경로] 로 들어간 뒤 경로로 접근하면 된다. 



4. 아나콘다 프롬포트 실행 


5. 콘솔창에 이거 입력

pip install rpy2‑2.8.6‑cp36‑cp36m‑win_amd64.whl



6. 설치 성공 (?) 역시 오류



내가 알기론 무슨 R을 환경변수에다 추가해줘야하고 엄청 복잡한 작업이 또 있었던 걸로 안다. 그런데 왜 설치가 돼는 지 모르지만 오늘 해보니 설치가 됐다.(윈 64비트 아나콘다 3.6) 하지만 오류. R_user 가 정의가 안됐다나 뭐라나.



7. 일단 여러 사이트들의 환경변수 추가 검색을 통해 추가해봄. 안된다. 그러다 스택 질문 중 마지막 답변 


https://stackoverflow.com/questions/12698877/how-to-setup-environment-variable-r-user-to-use-rpy2-in-python



8. 이런 식으로 홈과 유저 세팅을 해주고 나면 감격의 함수 출력. 



import os

os.environ['R_HOME'] = 'C://Program Files//R//R-3.4.0'

os.environ['R_USER']= 'C://Anaconda3//Lib//site-packages//rpy2'

import rpy2.robjects as robjects


r = robjects.r

x = r.rnorm(10)

print(x)










http://pystock.net/pages/viewpage.action?pageId=2162778



그냥 조대표님을 따라하자. 


혹시 32비트에서 깔아도 되는 줄 알고 32비트에서 가상환경 만들고 별별 용을 써봤는데 안된다. 아나콘다 64비트, 파이썬 3.5에서만 된다. 



수정. 

버전 업이 됐는 지는 모르지만 아니콘다 3.6 64비트 환경에서도 import가 됐다. 

rollbasic = rollapply(x$High,5,max)

rollminus4=lag(k= 4,rollapply(x$High,5,max))

roll4=lead(k=4, rollapply(x$High,5,max))


rollexample = data.frame(a = rollbasic,

                         b = rollminus4,

                         c = roll4)



> head(rollexample,10)

      a    b    c

1  6790   NA 6790

2  6790 6790 6790

3  6790 6790 6790

4  6790 6790 6790

5  6790 6790 6450

6  6450 6790 6450

7  6450 6450 6450

8  6450 6450 6450

9  6450 6450 6450

10 6450 6450 6090


> tail(rollexample,10)

       a    b    c

288 6780 6980 6750

289 6750 6780 6750

290 6750 6750 6750

291 6750 6750 6750

292 6750 6750 6850

293 6850 6750 6900

294 6900 6850 6900

295 6900 6900 6940

296 6940 6900 6940

297 6940 6940   NA




이해할 수 없는 결과. 왜 한칸 씩만 띄어진 것인가. 

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]





https://stackoverflow.com/questions/26921651/how-to-delete-the-last-row-of-data-of-a-pandas-dataframe

변수 만들어 보다가 발견한 것. 판다스는 3이면 3행까지의 sum값을 구하는 반면 




con = sqlite3.connect("C:/Users/Kun/Documents/Dashin/testsam.db")

df = pd.read_sql("SELECT * FROM A005930" , con , index_col = None)

df['rolling']=df['Volume'].rolling(3).sum()

print(df)


       rolling  

0          NaN  

1          NaN  

2     690786.0  

3     548333.0  

4     591256.0  

5     859883.0  

6     971276.0  

7     943150.0  

8     699350.0  

9     659044.0  



R은 3행까지의 합을 구해서 중간에다 집어 넣는다. 그래서 pandas와 비슷하게 만들려면 lag함수로 한칸 띄어 줘야 한다. 그런데 뭔가 이상하다. 내가 설정을 잘못쓰는 것인가? 




x$rolling = rollsum(x$Volume, k=3, fill=NA)

x$mean3 = lag(k = 1, rollsum(x$Volume, k=3,fill=NA))


           X5diff  sum_se rolling   mean3

1   -0.0393534786    1883      NA      NA

2   -0.0359661495    2286  690786      NA

3   -0.0403618650    4819  548333  690786

4   -0.0330520394     413  591256  548333

5   -0.0589459085   -1344  859883  591256

6    0.0021126761  102116  971276  859883

7   -0.0021111893   -1756  943150  971276

8   -0.0251017639   13037  699350  943150

9   -0.0172771251    3339  659044  699350



>>> import pandas as pd


>>> from pandas import Series,DataFrame


>>> import numpy as np


>>> raw_data = {'col0':[1,4,5,1,3,3,1,5,8,9,1,2]}


>>> df = DataFrame(raw_data)


>>> df

col0 0 1 1 4 2 5 3 1 4 3 5 3 6 1 7 5 8 8 9 9 10 1 11 2

>>> df['col_roll_count3'] = df['col0'].gt(3).rolling(3).sum() #문제의 함수 gt



>>> df

col0 col_roll_count3 0 1 NaN 1 4 NaN 2 5 2.0 3 1 2.0 4 3 1.0 5 3 0.0 6 1 0.0 7 5 1.0 8 8 2.0 9 9 3.0 10 1 2.0 11 2 1.0




pandas.DataFrame.gt

DataFrame.gt(other, axis='columns', level=None)[source]

Wrapper for flexible comparison methods gt



뭐 이렇게 써 있는데 무슨 소린 지 모르겠다. 하나하나 해본 결과 그것보다 큰 것이면 TRUE, 아니면 FALSE를 호출하는 함수같다. 


가령


>>> df['col0'].gt(3)

0 False 1 True 2 True 3 False 4 False 5 False 6 False 7 True 8 True 9 True 10 False 11 False Name: col0, dtype: bool


3이상인 것은 true, 아닌 것은 false로


df['col0'].gt(3).rolling(3).sum()

>>> df['col0'].gt(3).rolling(3).sum()

0 NaN 1 NaN 2 2.0 3 2.0 4 1.0 5 0.0 6 0.0 7 1.0 8 2.0 9 3.0 10 2.0 11 1.0 Name: col0, dtype: float64

>>>

여기다 rolling을 해서 3개씩으로 묶어주고 sum을 해주면 3개마다 3이상인 것을 세준다.


>>> df['col0'].gt(4).rolling(3).sum()

0 NaN 1 NaN 2 1.0 3 1.0 4 1.0 5 0.0 6 0.0 7 1.0 8 2.0 9 3.0 10 2.0 11 1.0 Name: col0, dtype: float64

이러면 4이상 인것을 3개마다 몇개인 지 세서 합한 뒤 돌려준다. 





SQLite DISTINCT keyword is used in conjunction with SELECT statement to eliminate all the duplicate records and fetching only the unique records.


출처: https://www.tutorialspoint.com/sqlite/sqlite_distinct_keyword.htm


유일한 값을 부를 때 쓰는 건가 보다. 


select.쓰면 중복값이 들어간다. James가 세 개 들어가 있다.


sqlite> SELECT name FROM COMPANY;

This will produce the following result.

NAME
----------
Paul
Allen
Teddy
Mark
David
Kim
James
Paul
James
James



DISTINCT를 쓰면 중복이 없는 하나의 값만 나온다. 



sqlite> SELECT DISTINCT name FROM COMPANY;

This will produce the following result, where there is no duplicate entry.

NAME
----------
Paul
Allen
Teddy
Mark
David
Kim
James




조건이 있는 것들 COUNT






For example, if you have the following table called suppliers:

employee_idlast_namefirst_namefavorite_website
1SmithJaneTechOnTheNet.com
2AndersonDaveCheckYourMath.com
3JohnsonSarah<Null>


출처: https://www.techonthenet.com/sqlite/functions/count.php


SELECT count(favorite_website) 
FROM employees;

Result: 2


좋아하는 웹사이트 개수를센다. 근무자컬럼으로부터 

2개 



4만달러보다 급여 많은 걸 센다. 


For example, you might wish to know how many employees have a salary above $40,000 / year.

SELECT count(*) AS "Number of employees"
FROM employees
WHERE salary > 40000;


조건문 두개 . 나이는 25살보다 같거나 많고 급여는 6만5000보다 높은 것 센다. 


sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0



raw_data ={'col0':[1,4,5,1,3,3,1,5,8,9,1,2]}

df = DataFrame(raw_data)

df['col_roll_count3'] = df['col0'].gt(3).rolling(3).sum()



간단한 것 같지만 더럽게 어려웠던 문제. 스택님들은 역시 멋지다. 


https://stackoverflow.com/questions/45250108/to-count-every-3-rows-to-fit-the-condition-by-pandas-rolling/45250456#45250456



이런 방법도 있구나. 


https://chrisalbon.com/python/pandas_create_column_with_loop.html

+ Recent posts