76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
import csv
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
def remove_empty_years(emissions):
|
|
empty_emissions = []
|
|
for (year, emission) in emissions:
|
|
if emission == None:
|
|
empty_emissions.append((year, emission))
|
|
|
|
for empty_entry in empty_emissions:
|
|
emissions.remove(empty_entry)
|
|
|
|
def get_country_emissions(country: str):
|
|
emissions_path = "API_EN.ATM.GHGT.KT.CE_DS2_en_csv_v2_5995567.csv"
|
|
|
|
with open(emissions_path, "r", newline="", encoding="utf-8") as f:
|
|
# Skip first 4 lines
|
|
for _ in range(4):
|
|
f.readline()
|
|
|
|
reader = csv.reader(f, delimiter=",", quotechar='"')
|
|
header_row = next(reader)
|
|
years = list(int(header) for header in header_row[4:] if header != '')
|
|
|
|
for row in reader:
|
|
if row[0] == country:
|
|
emissions_str = row[4:4+len(years)]
|
|
emissions = list(float(emission) if emission != "" else None for emission in emissions_str)
|
|
emission_points = list(zip(years, emissions))
|
|
remove_empty_years(emission_points)
|
|
|
|
years = list(row[0] for row in emission_points)
|
|
emissions = list(row[1] for row in emission_points)
|
|
return years, emissions
|
|
|
|
def approximate(X, Y, degree, scalar = 1):
|
|
degree += 1
|
|
|
|
G = np.zeros((len(X), degree), dtype=float)
|
|
for i in range(degree):
|
|
G[:, i] = np.power(X, i)
|
|
|
|
coefficients = np.linalg.solve(
|
|
np.dot(np.transpose(G), G),
|
|
np.dot(np.transpose(G), Y)
|
|
)
|
|
|
|
approx_x = np.linspace(X[0], X[-1], len(X) * scalar);
|
|
approx_y = np.zeros(approx_x.size, dtype=float)
|
|
for i in range(degree):
|
|
approx_y += np.power(approx_x, i) * coefficients[i];
|
|
|
|
return approx_x, approx_y
|
|
|
|
def main(country, degrees, scale):
|
|
years, emissions = get_country_emissions(country)
|
|
|
|
X = np.array(years, dtype=float)
|
|
Y = np.array(emissions)
|
|
|
|
for degree in degrees:
|
|
approx_x, approx_y = approximate(X, Y, degree, scale)
|
|
plt.plot(approx_x, approx_y, 'b')
|
|
|
|
for i in range(len(X)):
|
|
plt.plot(X[i], Y[i], 'ro')
|
|
|
|
plt.title(f"{degree} laipsnio")
|
|
plt.show()
|
|
|
|
main(
|
|
country = "Zambia",
|
|
degrees = [1, 2, 3, 5],
|
|
scale = 10
|
|
) |