내 인생의 멤피스에서 뜨겁든 아니든 (python,sqlite)

16096 단어 climatedatapython
나는이 게시물을 보았다

https://creon.substack.com/p/hot-or-not

그리고 파이썬과 sqlite를 사용하여 직접 복제하기로 결정했습니다. 저는 60년대에 태어났기 때문에 제 개인적인 진술은 제가 어렸을 때보다 지금이 더 덥다고 확신합니다.

그래서 여기로 자료를 구하러 갔습니다https://mesonet.agron.iastate.edu/request/download.phtml?network=TN_ASOS

그리고 내 근처의 TN에 대한 데이터를 다운로드했습니다. 주로 기온을 봅니다.

그로부터 sqlite 데이터베이스를 만들고 CSV를 로드했습니다.

CREATE TABLE data (
    station varchar,
    dt datetime,
    tmpf real,
    dewf real,
    relh real
)
.mode csv
.import asos.csv data


내 인생을 더 쉽게 만들기 위해 연도와 월에 대한 몇 가지 새로운 열을 만들었습니다(날짜를 나누기 위해).

그런 다음 매일 MAX 온도를 측정했습니다. 확인하려는 진술은 지금이 더 덥다고 생각하므로 MAX 온도를 사용하는 것이 좋은 것 같습니다. 매일 MAX 온도를 측정하는 또 다른 이유는 내가 사용하는 데이터가 하루에 여러 번 측정되기 때문에 하루에 MAX 온도 하나만 필요하기 때문입니다.

나는 주로 내 삶을 더 쉽게 만들기 위해 두 번째 테이블을 만들었습니다.

create table mem_daily_max as select y,m,d,max(tmpf),max(dewf),max(relh) from data where station='MEM'  group by y,m,d


그런 다음 1990년부터 매월 온도를 평균화하여 플롯했습니다. 다른 달은 여름 달이 덜 변화하는 것처럼 다른 추세를 보여줍니다. 여름의 멤피스는 항상 그래왔고 앞으로도 그럴 것입니다.

겨울 달을 보면 추세가 분명합니다.

1960년부터 현재까지의 12월 원시 데이터


그것에서 많은 것을 보는 것은 상당히 어렵습니다. 파이썬 코드는 다음과 같습니다

import sqlite3

sql ="""
SELECT y,m,d,tmpf FROM 
mem_daily_max WHERE m=12 AND y>1960 
ORDER BY y,m,d ASC
"""

db = None
cur = None
try:
    db = sqlite3.connect("data.db")
    cur = db.cursor()
    cur.execute(sql)
    data = cur.fetchall()
finally:
    if cur is not None:
        cur.close()
    if db is not None:
        db.close()

pd = []
for (y,m,d,tmpf) in data:
    print(y,m,d,tmpf)
    pd.append(tmpf)

import matplotlib.pyplot as plt
plt.plot(pd)
plt.xlabel("max temp")
plt.savefig("foo.png")


그래서 평활화하기 위해 매월 평균을 취했고 아래 차트는 12월만을 보여줍니다.

선형 회귀선이 있는 12월 평균입니다. 공기 온도가 적어도 내 평생 동안 12월에 올라가고 있다는 것은 상당히 분명합니다.



import sqlite3

sql ="""
SELECT y,m,avg(tmpf) as tmp FROM mem_daily_max 
WHERE m=12 GROUP BY y,m ORDER BY y,m asc;
"""

# just used some code I found online for this function
def estimate_coef(x, y):
    # number of observations/points
    n = np.size(x)

    # mean of x and y vector
    m_x = np.mean(x)
    m_y = np.mean(y)

    # calculating cross-deviation and deviation about x
    SS_xy = np.sum(y*x) - n*m_y*m_x
    SS_xx = np.sum(x*x) - n*m_x*m_x

    # calculating regression coefficients
    b_1 = SS_xy / SS_xx
    b_0 = m_y - b_1*m_x

    return (b_0, b_1)

# just used some code I found online for this function
def plot_regression_line(x, y, b):
    # plotting the actual points as scatter plot
    plt.scatter(x, y, color = "m",
               marker = "o", s = 30)

    # predicted response vector
    y_pred = b[0] + b[1]*x

    # plotting the regression line
    plt.plot(x, y_pred, color = "g")

    # putting labels
    plt.xlabel('x')
    plt.ylabel('y')

    # function to show plot
    plt.savefig("goo.png")

db = None
cur = None
try:
    db = sqlite3.connect("data.db")
    cur = db.cursor()
    cur.execute(sql)
    data = cur.fetchall()
finally:
    if cur is not None:
        cur.close()
    if db is not None:
        db.close()

pd = []
for (y,m,tmp,) in data:
    pd.append(tmp)

# just plot the data
import matplotlib.pyplot as plt
plt.plot(pd)
plt.xlabel("max temp")
plt.savefig("foo.png")

# now run the regression
import numpy as np
x = np.array([i for i in range(len(pd))])
y = pd

b = estimate_coef(x,y)
print("Estimated coefficients:\nb_0 = {}  \
          \nb_1 = {}".format(b[0], b[1]))
plot_regression_line(x,y,b)

좋은 웹페이지 즐겨찾기