Python for循环输出到数据帧

2024-09-29 19:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,在新冠病毒19的封锁期间开始学习编程。 我认为这将是一个很好的数据集来练习,因此我构建了一个程序,根据输入参数绘制数据图。我已经构建了一个for循环,循环遍历数据,为每个指定的国家绘制一条线,然后执行线性回归,输出给定日期的预测值。输出print语句可以很好地满足我所需要的数据,但我想将其转换为一个名为prediction的数据帧。我很难做到这一点,并尝试了numpy阵列以及使用熊猫。 我能够输出到数组或数据帧中,但它只会输入循环迭代中最后一个条目的数据。我读过其他有类似问题的帖子,但我无法准确地阅读他们的代码,从而为我的代码画出类似的解决方案。 任何帮助都将不胜感激

prediction = pd.DataFrame()

countries = [country for country in covid4]

for country in covid4:
    plt.plot(covid4.index, covid4[country], marker = ',', linestyle = '-', linewidth = 2)

    slope, intercept, rval, pval, stder = linregress(covid4.index, covid4[country])
    y2 = (slope * days_from_covid_start) + intercept
    print(country, y2, (rval**2), pval, stder)

    #prediction = pd.DataFrame({'country': country, 'predicted': y2, 'rval': (rval**2), 'pval': pval, 'stder': stder}, index = [len(country)])
    prediction.append(pd.DataFrame([country,y2, (rval**2), pval, stder], index=[0]), ignore_index=True)
print output = US 5179943.844549271 0.9006676283944509 2.6485459147090845e-114 621.5097854328127
Brazil 2936531.6824269355 0.7832301173896118 2.574767200468765e-76 594.2400982216876
India 2073088.1203383887 0.6345313255372067 7.298314985773991e-51 624.2194955678399
Russia 978300.4286278635 0.9142926929617138 1.7522978381731647e-121 108.50766510347822
Peru 505978.0715319741 0.858987519325372 2.99136171150524e-97 76.57252904070529
Colombia 356724.59233558143 0.6333783192991587 1.0395048549255093e-50 107.7550260556157
South Africa 472308.1410419348 0.6966400875418044 6.071717833597016e-60 122.57207991971943
Mexico 466476.80000000005 0.8003861479274035 2.486332913502741e-80 89.06795808066232
Spain 406391.36529570003 0.9113259379908633 7.934640637615308e-120 39.7913275775704
Argentina 231457.53997115127 0.6268247164508722 7.600868471677846e-50 70.99075237604976
Chile 400397.3610073682 0.8667991679346673 5.033317538752307e-100 58.15733490786391
Iran 361576.26469403406 0.964179243093371 6.270093847731166e-164 23.965905293313885
United Kingdom 396538.81819552195 0.9237619398832538 3.5207778505031074e-127 36.6462363789314
France 307895.94598781073 0.9160909120260833 1.628524516693465e-122 29.273492653868225
Bangladesh 258210.0824529258 0.8134667793006155 1.245704530630672e-83 47.16886076960728
Saudi Arabia 301026.7291359661 0.8720838496759029 5.387824647150151e-102 42.7760188991517

***edit covid4包含每个国家的列和日期索引,行表示该日期每个国家的案例

对于上下文,完整代码如下所示

#specifies countries that have above 'n' number
n = 300000

#search for a specific country's COVID data from the date specified.
country_to_find = ['']
value = 'cases'
today = '7/30/20'
#specifies how many days from covid first onset to map linear regression model for country to find
days_from_covid_start = 230


import matplotlib.pyplot as plt 
import pandas as pd
import numpy as np
from datetime import date
import seaborn as sns
from scipy.stats import linregress

sns.set()

df = pd.read_csv('https://data.humdata.org/hxlproxy/api/data-preview.csv?url=https%3A%2F%2Fraw.githubusercontent.com%2FCSSEGISandData%2FCOVID-19%2Fmaster%2Fcsse_covid_19_data%2Fcsse_covid_19_time_series%2Ftime_series_covid19_confirmed_global.csv&filename=time_series_covid19_confirmed_global.csv')
covid = df.groupby('Country/Region', as_index = False).sum()

date_i = covid[(today)]
G = str(date_i.sum())
covid = covid.sort_values((today), ascending=False)

covid.drop(columns=['Lat', 'Long'], inplace=True)
sig_cases = covid[date_i <= n].index
covid.drop(sig_cases, inplace=True)
plt.figure(figsize=(14,7.2))
sns.barplot(y = covid['Country/Region'], x = date_i, data = covid, )


covid = covid.sort_values((today), ascending=True)
x_values = range(len(covid['Country/Region']))
countries = covid['Country/Region'].map(str)


print(date_i)
#matplotlib graph, shows the same data as previous seaborn plot

'''cases = covid[(today)]
plt.figure(figsize=(14,7.2))
plt.ylabel('Countries')
plt.xlabel('Total Recorded')
plt.title('Covid Cases By Country', size = 10)
group = covid.groupby('Country/Region').sum()
plt.yticks(x_values, countries, rotation= 0, size = 10)
plt.barh(x_values, cases,  color='Red')
plt.grid()'''



covid.sort_values((today), ascending = False, inplace = True)

covid_transposed = covid.transpose()

covid_transposed.columns = covid_transposed.iloc[0]
covid_transposed2 = covid_transposed[1:]

covid_transposed2.to_csv('covid_transposed_new_index.csv', index = False)
covid_transposed2.to_csv('covid_transposed_new.csv')


covid5 = pd.read_csv('covid_transposed_new.csv')
covid5.rename( columns={'Unnamed: 0':'Date'}, inplace=True)
sns.set_style("ticks")
plt.subplot()
plt.figure(figsize=(14,7.2))

for country in covid5:
    if country in country_to_find:
        plt.plot(covid5.index, covid5[country], marker = ',', linestyle = '-', linewidth = 2)
        slope, intercept, rval, pval, stder = linregress(covid5.index, covid5[country])
        y = (slope * days_from_covid_start) + intercept
        print(y, rval **2 , pval, stder)

plt.xticks(covid5.index[::30], covid5.Date[::30])
plt.legend(country_to_find, loc=2, prop={'size': 15})
plt.xticks(rotation=32, size = 15)
plt.yticks(size = 15)
plt.title('Covid ' +str(value)+ ' per selected country', size=20)
plt.ylabel('Num ' +str(value), size=20)
plt.xlabel('Date', size=20)
plt.grid(True)

covid4 = pd.read_csv('covid_transposed_new_index.csv')

plt.figure(figsize=(14,7.2))

plt.subplot()
prediction = pd.DataFrame()

countries = [country for country in covid4]

for country in covid4:
    plt.plot(covid4.index, covid4[country], marker = ',', linestyle = '-', linewidth = 2)
    slope, intercept, rval, pval, stder = linregress(covid4.index, covid4[country])
    y2 = (slope * days_from_covid_start) + intercept
    prediction.append(pd.DataFrame(np.array([[country], [y2], [(rval**2)], [pval], [stder]])))
    print(country, y2, (rval**2), pval, stder)
    

plt.xticks(covid4.index[::30])
plt.legend(countries, loc=2, prop={'size': 9})
plt.xticks(rotation=32, size = 15)
plt.yticks(size = 15)
plt.title('Covid ' +str(value)+ ' per selected country', size=20)
plt.ylabel('Num ' +str(value), size=20)
plt.xlabel('Days from first COVID-19 identification', size=20)
plt.grid(True)

sns.set_style("darkgrid")


plt.show()

print(str('Total cases as of date ' + str(today) + ' is ')+ G)
print(prediction)

ps我知道回归模型不起作用哈哈


Tags: csvfromforsizeindexpltcountrypd
2条回答
    1. covid4中提取所有必要的数据

  • 和你做的一样countries = [country for country in covid4]

  • 对于其他数据,请执行以下操作:

  • y2 = [y2 for y2 in covid4]

  • rval = [rval for rval in covid4]

  • pval = [pval for pval in covid4]

  • stder = [stder for stder in covid4]

    1. 创建一个字典来存储提取的数据

* `data = {'country': country, 'y2': y2, 'rval': rval, 'pval': pval, 'stder': stder}`
  • 如果上述方法不起作用,则使用数组[]添加数据

  • 例如:data = {'country': [country], ... }

    1. 现在您可以创建DataFrame

* `df = pd.DataFrame(data, columns=['country', 'y2', 'rval', 'pval', 'stder'])`

DataFrame.append()附加到指定的dataframe然后返回一个新对象

Documentation

可以使用所需的列创建初始对象,然后在附加到dataframe时确保为其指定新对象

prediction = pd.DataFrame(columns=['country', 'y2', 'rval', 'pval', 'stder'])

for country in covid4:
    plt.plot(covid4.index, covid4[country], marker = ',', linestyle = '-', linewidth = 2)
    slope, intercept, rval, pval, stder = linregress(covid4.index, covid4[country])
    y2 = (slope * days_from_covid_start) + intercept
    prediction = prediction.append(pd.DataFrame(data={'country': country, 'y2': y2, 'rval': (rval**2), 'pval': pval, 'stder': stder}, index = [0]), ignore_index = True)
    print(country, y2, (rval**2), pval, stder)

这将输出如下结果

          country            y2      rval           pval       stder
0              US  5.179944e+06  0.900668  2.648546e-114  621.509785
1          Brazil  2.936532e+06  0.783230   2.574767e-76  594.240098
2           India  2.073088e+06  0.634531   7.298315e-51  624.219496
3          Russia  9.783004e+05  0.914293  1.752298e-121  108.507665
4    South Africa  4.723081e+05  0.696640   6.071718e-60  122.572080
5          Mexico  4.664768e+05  0.800386   2.486333e-80   89.067958
6            Peru  5.059781e+05  0.858988   2.991362e-97   76.572529
7           Chile  4.003974e+05  0.866799  5.033318e-100   58.157335
8  United Kingdom  3.965388e+05  0.923762  3.520778e-127   36.646236
9            Iran  3.615763e+05  0.964179  6.270094e-164   23.965905

相关问题 更多 >

    热门问题