{ "info": { "author": "Shafique Jamal", "author_email": "shafique.jamal@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# EasyFrames\n\n\n## Loading datasets\n\nThis package makes it easier to perform some basic operations using a Pandas dataframe. For example, suppose you have the following datasets:\n\n```\n age educ fridge has_car hh house_rooms id male prov weighthh\n0 44 pri yes 1 1 3 1 1 BC 2\n1 43 bach yes 1 1 3 2 0 BC 2\n2 13 pri yes 1 1 3 3 1 BC 2\n3 70 hi no 1 2 2 1 1 Alberta 3\n4 23 bach yes 0 3 1 1 1 BC 2\n5 20 sec yes 0 3 1 2 0 BC 2\n6 37 hi no 1 4 3 1 1 Alberta 3\n7 35 hi no 1 4 3 2 0 Alberta 3\n8 8 pri no 1 4 3 3 0 Alberta 3\n9 15 pri no 1 4 3 4 0 Alberta 3 \n``` \n```\n has_fence hh\n0 1 2\n1 0 4\n2 1 5\n3 1 6\n4 0 7\n```\n```\n empl hh id\n0 ue 1 1\n1 ft 1 2\n2 pt 1 4\n3 pt 2 1\n4 ft 5 1\n5 pt 5 2\n6 se 4 1\n7 ft 4 2\n8 se 4 5\n```\n\nIf you have these datasets already in Stata .dta files, then using easyframes you can load them in like this:\n```\nmyhhkit = hhkit('mydataset.dta', encoding=\"latin-1\")\n```\nTo make this demonstration easy to follow, I will instead load the data from the following Pandas Series from Dicts:\n```\ndf_master = pd.DataFrame(\n\t{'educ': {0: 'pri', 1: 'bach', 2: 'pri', 3: 'hi', 4: 'bach', 5: 'sec', \n\t\t6: 'hi', 7: 'hi', 8: 'pri', 9: 'pri'}, \n\t 'hh': {0: 1, 1: 1, 2: 1, 3: 2, 4: 3, 5: 3, 6: 4, 7: 4, 8: 4, 9: 4}, \n\t 'id': {0: 1, 1: 2, 2: 3, 3: 1, 4: 1, 5: 2, 6: 1, 7: 2, 8: 3, 9: 4}, \n\t 'has_car': {0: 1, 1: 1, 2: 1, 3: 1, 4: 0, 5: 0, 6: 1, 7: 1, 8: 1, 9: 1}, \n\t 'weighthh': {0: 2, 1: 2, 2: 2, 3: 3, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 3}, \n\t 'house_rooms': {0: 3, 1: 3, 2: 3, 3: 2, 4: 1, 5: 1, 6: 3, 7: 3, 8: 3, 9: 3}, \n\t 'prov': {0: 'BC', 1: 'BC', 2: 'BC', 3: 'Alberta', 4: 'BC', 5: 'BC', 6: 'Alberta', \n\t \t7: 'Alberta', 8: 'Alberta', 9: 'Alberta'}, \n\t 'age': {0: 44, 1: 43, 2: 13, 3: 70, 4: 23, 5: 20, 6: 37, 7: 35, 8: 8, 9: 15}, \n\t 'fridge': {0: 'yes', 1: 'yes', 2: 'yes', 3: 'no', 4: 'yes', 5: 'yes', 6: 'no', \n\t \t7: 'no', 8: 'no', 9: 'no'}, \n\t 'male': {0: 1, 1: 0, 2: 1, 3: 1, 4: 1, 5: 0, 6: 1, 7: 0, 8: 0, 9: 0}})\ndf_using_hh = pd.DataFrame(\n\t{'hh': {0: 2, 1: 4, 2: 5, 3: 6, 4: 7}, \n\t 'has_fence': {0: 1, 1: 0, 2: 1, 3: 1, 4: 0}\n\t})\ndf_using_ind = pd.DataFrame(\n\t{'empl': {0: 'ue', 1: 'ft', 2: 'pt', 3: 'pt', 4: 'ft', 5: 'pt', \n\t\t6: 'se', 7: 'ft', 8: 'se'}, \n\t 'hh': {0: 1, 1: 1, 2: 1, 3: 2, 4: 5, 5: 5, 6: 4, 7: 4, 8: 4}, \n\t 'id': {0: 1, 1: 2, 2: 4, 3: 1, 4: 1, 5: 2, 6: 1, 7: 2, 8: 5}\n })\n```\nHere is how you can load the above into easyframes:\n```\nhhkm = hhkit(df_master) \nhhkh = hhkit(df_using_hh) \nhhki = hhkit(df_using_ind) \n\nprint(hhkm.df)\nprint(hhkh.df)\nprint(hhki.df)\n```\nYou can replace the existing dataframe in the hhkit object by passing in a dict or a Pandas DataFrame to the `from_dict` method (even though the method is named `from_dict`, it will still accept a DataFrame object):\n```\nmyhhkit.from_dict(df_master) # If the object already exists, you can replace the existing dataframe. You \n\t\t\t\t\t\t\t # \tcan pass a data frame or a dict to the from_dict() method.\n```\n## Egen commands\n\nIf you are using Stata, and you want to add a column with the household size, the command is simple:\n\n`egen hhsize = count(id), by(hh)`\n\nIf you are using Pandas and have the dataset loaded as df, and you are NOT using easyframes, then you might have to do something like:\n\n```\nresult = df[include].groupby('hh')['hh'].agg(['count'])\nresult.rename(columns={'count':'hh size'}, inplace=True)\nmerged = pd.merge(df, result, left_on='hh', right_index=True, how='left')\n```\n\nUsing the easyframes package, the command would be:\n\n```\nfrom easyframes.easyframes import hhkit\n\nhhkm.egen(operation='count', groupby='hh', col='hh', column_label='hhsize')\nprint(hhkm.df)\n```\n\nand Bob's your uncle:\n\n```\n age educ fridge has_car hh house_rooms id male prov weighthh hhsize\n0 44 pri yes 1 1 3 1 1 BC 2 3\n1 43 bach yes 1 1 3 2 0 BC 2 3\n2 13 pri yes 1 1 3 3 1 BC 2 3\n3 70 hi no 1 2 2 1 1 Alberta 3 1\n4 23 bach yes 0 3 1 1 1 BC 2 2\n5 20 sec yes 0 3 1 2 0 BC 2 2\n6 37 hi no 1 4 3 1 1 Alberta 3 4\n7 35 hi no 1 4 3 2 0 Alberta 3 4\n8 8 pri no 1 4 3 3 0 Alberta 3 4\n9 15 pri no 1 4 3 4 0 Alberta 3 4\n```\n\nOk, so it doesn't save much typing or space, but suppose you also want to calculate the average age in the household. Here you would simply add the following command\n```\nhhkm.egen(operation='mean', groupby='hh', col='age', column_label='mean age in hh')\n```\nand here is the result:\n```\n age educ fridge has_car hh house_rooms id male prov weighthh hhsize mean age in hh\n0 44 pri yes 1 1 3 1 1 BC 2 3 33.333333\n1 43 bach yes 1 1 3 2 0 BC 2 3 33.333333\n2 13 pri yes 1 1 3 3 1 BC 2 3 33.333333\n3 70 hi no 1 2 2 1 1 Alberta 3 1 70.000000\n4 23 bach yes 0 3 1 1 1 BC 2 2 21.500000\n5 20 sec yes 0 3 1 2 0 BC 2 2 21.500000\n6 37 hi no 1 4 3 1 1 Alberta 3 4 23.750000\n7 35 hi no 1 4 3 2 0 Alberta 3 4 23.750000\n8 8 pri no 1 4 3 3 0 Alberta 3 4 23.750000\n9 15 pri no 1 4 3 4 0 Alberta 3 4 23.750000\n```\nYou can also include or exclude certain rows. For example, suppose we want to include in household size only members over the age of 22:\n```\nhhkm.egen(operation='count', groupby='hh', col='hh', column_label='hhs_o22', include=hhkm.df['age']>22,\n\t\t\tvarlabel=\"hhsize including only members over 22 years of age\")\nprint(hhkm.df)\n```\nThe result:\n```\n age educ fridge has_car hh house_rooms id male prov weighthh hhsize mean age in hh hhs_o22\n0 44 pri yes 1 1 3 1 1 BC 2 3 33.333333 2\n1 43 bach yes 1 1 3 2 0 BC 2 3 33.333333 2\n2 13 pri yes 1 1 3 3 1 BC 2 3 33.333333 2\n3 70 hi no 1 2 2 1 1 Alberta 3 1 70.000000 1\n4 23 bach yes 0 3 1 1 1 BC 2 2 21.500000 1\n5 20 sec yes 0 3 1 2 0 BC 2 2 21.500000 1\n6 37 hi no 1 4 3 1 1 Alberta 3 4 23.750000 2\n7 35 hi no 1 4 3 2 0 Alberta 3 4 23.750000 2\n8 8 pri no 1 4 3 3 0 Alberta 3 4 23.750000 2\n9 15 pri no 1 4 3 4 0 Alberta 3 4 23.750000 2\n```\nYou can also exclude members over 22 years of age (just presenting the command, not running it for this demo):\n```\nhhkm.egen(operation='count', groupby='hh', col='hh', column_label='hhs_o22', exclude=hhkm.df['age']>22,\n\t\t\tvarlabel=\"hhsize including only members over 22 years of age\")\n```\nYou'll noticed that I added a variable label. Variable labels are discussed below. If you don't specify the column label, then a default is constructed.\n\nAlso, there is an option to sepcify what to replace NaNs with. Egen will fill with NaNs observations where the `col` or `groupby` variables contain NaNs (which can happen after `merge`s, for example.) You can specify `replacenanwith` to replace these NaNs with something else, e.g. `replacenanwith = 0`:\n\n```\nhhkm.egen(operation='count', groupby='hh', col='hh', column_label='hhs_o22', exclude=hhkm.df['age']>22,\n\t\t\tvarlabel=\"hhsize including only members over 22 years of age, replacenanwith = 0\" )\n```\n\n## Variable labels\nVariable labels are supported too. \n\n```\nhhkm.set_variable_labels({'hh':'Household ID','id':'Member ID'})\nhhkm.sdesc()\n```\n```\n-------------------------------------------------------------------------------------\nobs: 10\nvars: 13\n-------------------------------------------------------------------------------------\nVariable Data Type Variable Label \n-------------------------------------------------------------------------------------\n'age' int64 \n'educ' object \n'fridge' object \n'has_car' int64 \n'hh' int64 Household ID \n'house_rooms' int64 \n'id' int64 Member ID \n'male' int64 \n'prov' object \n'weighthh' int64 \n'hhsize' int64 \n'mean age in hh' float64 \n'hhs_o22' int64 hhsize including only members over 22 years of age \n```\n## Stata-like Merging\n\nThere is also a Stata-like merge method, which creates a merge variable for you in the dataset (and copies over the variable labels):\n```\nhhkm.statamerge(hhkh, on=['hh'], mergevarname='_merge_hh')\nprint(hhkm.df)\nhhkm.sdesc()\n```\n```\n age educ fridge has_car hh house_rooms id male prov weighthh hhsize mean age in hh hhs_o22 has_fence _merge_hh\n0 44 pri yes 1 1 3 1 1 BC 2 3 33.333333 2 NaN 1\n1 43 bach yes 1 1 3 2 0 BC 2 3 33.333333 2 NaN 1\n2 13 pri yes 1 1 3 3 1 BC 2 3 33.333333 2 NaN 1\n3 70 hi no 1 2 2 1 1 Alberta 3 1 70.000000 1 1 3\n4 23 bach yes 0 3 1 1 1 BC 2 2 21.500000 1 NaN 1\n5 20 sec yes 0 3 1 2 0 BC 2 2 21.500000 1 NaN 1\n6 37 hi no 1 4 3 1 1 Alberta 3 4 23.750000 2 0 3\n7 35 hi no 1 4 3 2 0 Alberta 3 4 23.750000 2 0 3\n8 8 pri no 1 4 3 3 0 Alberta 3 4 23.750000 2 0 3\n9 15 pri no 1 4 3 4 0 Alberta 3 4 23.750000 2 0 3\n10 NaN NaN NaN NaN 5 NaN NaN NaN NaN NaN NaN NaN NaN 1 2\n11 NaN NaN NaN NaN 6 NaN NaN NaN NaN NaN NaN NaN NaN 1 2\n12 NaN NaN NaN NaN 7 NaN NaN NaN NaN NaN NaN NaN NaN 0 2\n-------------------------------------------------------------------------------------\nobs: 13\nvars: 15\n-------------------------------------------------------------------------------------\nVariable Data Type Variable Label \n-------------------------------------------------------------------------------------\n'age' float64 \n'educ' object \n'fridge' object \n'has_car' float64 \n'hh' float64 Household ID \n'house_rooms' float64 \n'id' float64 Member ID \n'male' float64 \n'prov' object \n'weighthh' float64 \n'hhsize' float64 \n'mean age in hh' float64 \n'hhs_o22' float64 hhsize including only members over 22 years of age \n'has_fence' float64 \n'_merge_hh' int64 \n```\nHere is another merge, this one replacing the labels in the original/left/master dataset when the same variable appears in both datasets. I will merge an individual-level dataset with the previously merged dataset:\n```\nhhki.set_variable_labels({'hh':'--> Household ID', 'empl':'Employment status'})\nhhkm.statamerge(hhki, on=['hh','id'], mergevarname='_merge_ind')\nprint(hhkm.df)\nhhkm.sdesc()\n```\n```\n age educ fridge has_car hh house_rooms id male prov weighthh has_fence _merge_hh empl _merge_ind\n0 44 secondary yes 1 1 3 1 1 BC 2 NaN 1 not employed 3\n1 43 bachelor yes 1 1 3 2 0 BC 2 NaN 1 full-time 3\n2 13 primary yes 1 1 3 3 1 BC 2 NaN 1 NaN 1\n3 70 higher no 1 2 2 1 1 Alberta 3 1 3 part-time 3\n4 23 bachelor yes 0 3 1 1 1 BC 2 NaN 1 NaN 1\n5 20 secondary yes 0 3 1 2 0 BC 2 NaN 1 NaN 1\n6 37 higher no 1 4 3 1 1 Alberta 3 0 3 self-employed 3\n7 35 higher no 1 4 3 2 0 Alberta 3 0 3 full-time 3\n8 8 primary no 1 4 3 3 0 Alberta 3 0 3 NaN 1\n9 15 primary no 1 4 3 4 0 Alberta 3 0 3 NaN 1\n10 NaN NaN NaN NaN 5 NaN NaN NaN NaN NaN 1 2 NaN 1\n11 NaN NaN NaN NaN 6 NaN NaN NaN NaN NaN 1 2 NaN 1\n12 NaN NaN NaN NaN 7 NaN NaN NaN NaN NaN 0 2 NaN 1\n13 NaN NaN NaN NaN 1 NaN 4 NaN NaN NaN NaN NaN part-time 2\n14 NaN NaN NaN NaN 5 NaN 1 NaN NaN NaN NaN NaN full-time 2\n15 NaN NaN NaN NaN 5 NaN 2 NaN NaN NaN NaN NaN part-time 2\n16 NaN NaN NaN NaN 4 NaN 5 NaN NaN NaN NaN NaN self-employed 2\n------------------------------------------------------------------------\nobs: 17\nvars: 14\n------------------------------------------------------------------------\nVariable Data Type Variable Label \n------------------------------------------------------------------------\n'age' float64 \n'educ' object \n'fridge' object \n'has_car' float64 \n'hh' float64 --> Household ID \n'house_rooms' float64 \n'id' float64 Member ID \n'male' float64 \n'prov' object \n'weighthh' float64 \n'has_fence' float64 This dwelling has a fence \n'_merge_hh' float64 \n'empl' object Employment status \n'_merge_ind' int64 \n```\nThe `statamerge` method will not overwrite variables if you set `replacelabels=False` in the method (it is set to `True` by default). After a merge, one normally likes to tabulate the merge variable. That is in the next section. \n\n## Stata-like tabulations and cross-tabulations (one-way and two-way)\n\n### One-way tabulations\n\nFirst, lets tabulate a merge variable. This will be a simple one-way tabulation with no weights or exclusions of rows (though we can exclude rows - this is shown further below):\n```\ndf_tab_m1 = hhkm.tab('_merge_hh', p=True)\ndf_tab_m2 = hhkm.tab('_merge_ind', p=True)\n```\n```\n count percent\n_merge_hh \n1.0 5 29.411765\n2.0 3 17.647059\n3.0 5 29.411765\nnan 4 23.529412\ntotal 17 100.000000\n count percent\n_merge_ind \n1 8 47.058824\n2 4 23.529412\n3 5 29.411765\ntotal 17 100.000000\n```\nThe `p=True` just means to display the output. Lets do a one-way tabulation of education:\n```\ndf_tab = hhkm.tab('educ', p=True)\n```\n```\n count percent\neduc \nbach 2 11.764706\nhi 3 17.647059\npri 4 23.529412\nsec 1 5.882353\nnan 7 41.176471\ntotal 17 100.000000\n```\nNow lets make it a bit more interesting: lets add weights, exclude some observations, and use the variable label instead of the variable name:\n```\nhhkm.set_variable_labels({'educ':'Level of education', 'house_rooms':'Number of rooms in the house'})\ndf_tab = hhkm.tab('educ', p=True, weightcolumn='weighthh', include=hhkm.df['age'] > 10, usevarlabels=True)\n```\n```\n count percent\nLevel of education \nbach 1.636364 18.181818\nhi 3.681818 40.909091\npri 2.863636 31.818182\nsec 0.818182 9.090909\ntotal 9.000000 100.000000\n```\n\n### Two-way tabulations\n\nFor two-way tabulations, just provide an interable (list or set) of variable names as the first argument:\n```\ndf_tab = hhkm.tab(['educ','house_rooms'], decimalplaces=5, usevarlabels=[False, False], p=True)\n```\n```\nStatistic count row percent column percent cell percent \nhouse_rooms 1.0 2.0 3.0 nan total 1.0 2.0 3.0 nan total 1.0 2.0 3.0 nan 1.0 2.0 3.0 nan total\neduc \nbach 1 0 1 0 2 50 0.00000 50.00000 0 100 50 0 14.28571 NaN 5.88235 0.00000 5.88235 0.00000 11.76471\nhi 0 1 2 0 3 0 33.33333 66.66667 0 100 0 100 28.57143 NaN 0.00000 5.88235 11.76471 0.00000 17.64706\npri 0 0 4 0 4 0 0.00000 100.00000 0 100 0 0 57.14286 NaN 0.00000 0.00000 23.52941 0.00000 23.52941\nsec 1 0 0 0 1 100 0.00000 0.00000 0 100 50 0 0.00000 NaN 5.88235 0.00000 0.00000 0.00000 5.88235\nnan 0 0 0 7 7 0 0.00000 0.00000 100 100 0 0 0.00000 NaN 0.00000 0.00000 0.00000 41.17647 41.17647\ntotal 2 1 7 7 17 NaN NaN NaN NaN NaN 100 100 100.00000 NaN 11.76471 5.88235 41.17647 41.17647 100.00000\n```\nBy default, it will display variable labels instead of variable names:\n```\ndf_tab = hhkm.tab(['educ','house_rooms'], decimalplaces=5, p=True)\n```\n```\nStatistic count row percent column percent cell percent \nNumber of rooms in the house 1.0 2.0 3.0 nan total 1.0 2.0 3.0 nan total 1.0 2.0 3.0 nan 1.0 2.0 3.0 nan total\nLevel of education \nbach 1 0 1 0 2 50 0.00000 50.00000 0 100 50 0 14.28571 NaN 5.88235 0.00000 5.88235 0.00000 11.76471\nhi 0 1 2 0 3 0 33.33333 66.66667 0 100 0 100 28.57143 NaN 0.00000 5.88235 11.76471 0.00000 17.64706\npri 0 0 4 0 4 0 0.00000 100.00000 0 100 0 0 57.14286 NaN 0.00000 0.00000 23.52941 0.00000 23.52941\nsec 1 0 0 0 1 100 0.00000 0.00000 0 100 50 0 0.00000 NaN 5.88235 0.00000 0.00000 0.00000 5.88235\nnan 0 0 0 7 7 0 0.00000 0.00000 100 100 0 0 0.00000 NaN 0.00000 0.00000 0.00000 41.17647 41.17647\ntotal 2 1 7 7 17 NaN NaN NaN NaN NaN 100 100 100.00000 NaN 11.76471 5.88235 41.17647 41.17647 100.00000\n```\nFinally, you can do two-way tabulations with weights and excluding selected rows:\n```\ndf_tab = hhkm.tab(['educ','house_rooms'], decimalplaces=5, usevarlabels=[True, True], \n\t\t\tp=True, include=hhkm.df['age'] > 10, weightcolumn='weighthh')\n```\n```\nStatistic count row percent column percent cell percent \nNumber of rooms in the house 1.0 2.0 3.0 total 1.0 2.0 3.0 total 1.0 2.0 3.0 1.0 2.0 3.0 total\nLevel of education \nbach 0.818182 0.000000 0.818182 1.636364 50 0.00000 50.00000 100 50 0 13.33333 9.09091 0.00000 9.09091 18.18182\nhi 0.000000 1.227273 2.454545 3.681818 0 33.33333 66.66667 100 0 100 40.00000 0.00000 13.63636 27.27273 40.90909\npri 0.000000 0.000000 2.863636 2.863636 0 0.00000 100.00000 100 0 0 46.66667 0.00000 0.00000 31.81818 31.81818\nsec 0.818182 0.000000 0.000000 0.818182 100 0.00000 0.00000 100 50 0 0.00000 9.09091 0.00000 0.00000 9.09091\ntotal 1.636364 1.227273 6.136364 9.000000 NaN NaN NaN NaN 100 100 100.00000 18.18182 13.63636 68.18182 100.00000\n```\n\n## Recode/Replace\n\nStata has `recode` and `replace` commands, which do similar operations. With the EasyFrames hhkit, it is one method:\n```\ninclude = pd.Series([True, False, True, False, True, True, False, True, \n\t\t\t\t\t True, True, False, True, False, True, False, False, True],\n\t\t\tindex=np.arange(17)) \nhhkm.rr('educ',{'pri':'primary','sec':'secondary','hi':'higher education','bach':'bachelor'}, include=include)\nhhkm.rr('has_fence', {0:2,1:np.nan,np.nan:-1}, include=include)\nhhkm.rr('has_car', {0:1,1:0,np.nan:-9}, include=include)\nprint(hhkm.df)\n```\n```\n age fridge hh house_rooms id male prov weighthh hhsize mean age in hh hhs_o22 _merge_hh empl _merge_ind educ has_fence has_car\n0 44 yes 1 3 1 1 BC 2 3 33.333333 2 1 ue 3 primary -1 0\n1 43 yes 1 3 2 0 BC 2 3 33.333333 2 1 ft 3 bach NaN 1\n2 13 yes 1 3 3 1 BC 2 3 33.333333 2 1 NaN 1 primary -1 0\n3 70 no 2 2 1 1 Alberta 3 1 70.000000 1 3 pt 3 hi 1 1\n4 23 yes 3 1 1 1 BC 2 2 21.500000 1 1 NaN 1 bachelor -1 1\n5 20 yes 3 1 2 0 BC 2 2 21.500000 1 1 NaN 1 secondary -1 1\n6 37 no 4 3 1 1 Alberta 3 4 23.750000 2 3 se 3 hi 0 1\n7 35 no 4 3 2 0 Alberta 3 4 23.750000 2 3 ft 3 higher education 2 0\n8 8 no 4 3 3 0 Alberta 3 4 23.750000 2 3 NaN 1 primary 2 0\n9 15 no 4 3 4 0 Alberta 3 4 23.750000 2 3 NaN 1 primary 2 0\n10 NaN NaN 5 NaN NaN NaN NaN NaN NaN NaN NaN 2 NaN 1 NaN 1 NaN\n11 NaN NaN 6 NaN NaN NaN NaN NaN NaN NaN NaN 2 NaN 1 NaN NaN -9\n12 NaN NaN 7 NaN NaN NaN NaN NaN NaN NaN NaN 2 NaN 1 NaN 0 NaN\n13 NaN NaN 1 NaN 4 NaN NaN NaN NaN NaN NaN NaN pt 2 NaN -1 -9\n14 NaN NaN 5 NaN 1 NaN NaN NaN NaN NaN NaN NaN ft 2 NaN NaN NaN\n15 NaN NaN 5 NaN 2 NaN NaN NaN NaN NaN NaN NaN pt 2 NaN NaN NaN\n16 NaN NaN 4 NaN 5 NaN NaN NaN NaN NaN NaN NaN se 2 NaN -1 -9\n```\nThere might be more, just have a look at the code (which I need to document better, but hopefully the variable names are helpful). Enjoy!", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/EasyFrames/", "keywords": null, "license": "LICENSE.txt", "maintainer": null, "maintainer_email": null, "name": "EasyFrames", "package_url": "https://pypi.org/project/EasyFrames/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/EasyFrames/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/EasyFrames/" }, "release_url": "https://pypi.org/project/EasyFrames/0.1.7/", "requires_dist": null, "requires_python": null, "summary": "Classes and methods for executing stata-like commands easily for pandas dataframes.", "version": "0.1.7" }, "last_serial": 1174909, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "baea2e987b3d34dd94e3dbd60c4321f8", "sha256": "237770e7e4ac8aeba999cb6616d59e505063bd57f69c044d494ad29db0207b30" }, "downloads": -1, "filename": "EasyFrames-0.1.0.tar.gz", "has_sig": false, "md5_digest": "baea2e987b3d34dd94e3dbd60c4321f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8324, "upload_time": "2014-07-20T22:03:31", "url": "https://files.pythonhosted.org/packages/9f/5e/1938a62cf1481c6553c0b09db110737179852bb46a2eb762031286faf67d/EasyFrames-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "fc0dec72de212a62434b843abd15166c", "sha256": "41f3e31d53738b82341e06aac0e86ee422cdc08f94ca2dc6832e04cc06630a25" }, "downloads": -1, "filename": "EasyFrames-0.1.1.tar.gz", "has_sig": false, "md5_digest": "fc0dec72de212a62434b843abd15166c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8344, "upload_time": "2014-07-21T01:05:04", "url": "https://files.pythonhosted.org/packages/88/dd/8d1ffa747aea8256effa34753f974b56faceed823723f4ac38b5ae95f14b/EasyFrames-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "1db0b9555d1b401064e6594d6fa91eb0", "sha256": "fd523db5213e37c6289fa84602136607565e1ee227ae6427af7e1a10b78d994d" }, "downloads": -1, "filename": "EasyFrames-0.1.2.tar.gz", "has_sig": false, "md5_digest": "1db0b9555d1b401064e6594d6fa91eb0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51610, "upload_time": "2014-07-22T03:37:43", "url": "https://files.pythonhosted.org/packages/37/c5/82cbf23eb23a8ef64617d4eb3eb3130f7d76d074ab270046dcbdb7c44809/EasyFrames-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "2583922fb6039ac0e460a1095071e3e5", "sha256": "0ee3e18d66375f60ca5d3419fc6294c69146ca93fb3ccff7b96b30d70b08f086" }, "downloads": -1, "filename": "EasyFrames-0.1.3.tar.gz", "has_sig": false, "md5_digest": "2583922fb6039ac0e460a1095071e3e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55396, "upload_time": "2014-07-23T03:56:05", "url": "https://files.pythonhosted.org/packages/c0/5a/8d38816bab94844a81f8ff3adff87f2c062e06135fa17b92af2b6ae6415d/EasyFrames-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "a493bc9abfb8b907caba8e6d17c3276e", "sha256": "9d3d15047b7630dc38746d462720580365a8d8fa83dc532d2bae6ad133e8b970" }, "downloads": -1, "filename": "EasyFrames-0.1.4.tar.gz", "has_sig": false, "md5_digest": "a493bc9abfb8b907caba8e6d17c3276e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55651, "upload_time": "2014-07-23T16:02:10", "url": "https://files.pythonhosted.org/packages/66/5c/b2da2dd2a3eb9baa8082f312fdc8be17fca50e7ef8f557a91af5f9569262/EasyFrames-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "9e5fbadb509d6821b134687cebd6934e", "sha256": "dfc3711e4c3200ee55f91366fccdc7a7dfe9141fbac8e9e59396ba99601b8929" }, "downloads": -1, "filename": "EasyFrames-0.1.5.tar.gz", "has_sig": false, "md5_digest": "9e5fbadb509d6821b134687cebd6934e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58246, "upload_time": "2014-07-24T21:20:54", "url": "https://files.pythonhosted.org/packages/08/12/2cf152feb8bca028633d1e14c9bd2ff74871a8b6e0ff738f693f36e7fad0/EasyFrames-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "a170a8c13ec2d7ae0a887876aa3b6362", "sha256": "9c7c2cc222de448c8ed90870d2f8057ac57682f6a52b16264ffbf1096aa1560b" }, "downloads": -1, "filename": "EasyFrames-0.1.6.tar.gz", "has_sig": false, "md5_digest": "a170a8c13ec2d7ae0a887876aa3b6362", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59822, "upload_time": "2014-07-26T04:55:18", "url": "https://files.pythonhosted.org/packages/9a/9e/edff9362d5329cf5b6562c3dd838fd6344079dbb184581312bb812bcb7f9/EasyFrames-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "a876424d8df2f71a850c6f28dfc735af", "sha256": "25add53d02c6fefd3b27c3374d58d5d94dadd3cbe3b13c53eb453986b1dff4f1" }, "downloads": -1, "filename": "EasyFrames-0.1.7.tar.gz", "has_sig": false, "md5_digest": "a876424d8df2f71a850c6f28dfc735af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62163, "upload_time": "2014-07-31T00:33:55", "url": "https://files.pythonhosted.org/packages/9a/c2/48d9df038877dac72eaa7196bd992729e09af5b0cc37138e386371857d9a/EasyFrames-0.1.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a876424d8df2f71a850c6f28dfc735af", "sha256": "25add53d02c6fefd3b27c3374d58d5d94dadd3cbe3b13c53eb453986b1dff4f1" }, "downloads": -1, "filename": "EasyFrames-0.1.7.tar.gz", "has_sig": false, "md5_digest": "a876424d8df2f71a850c6f28dfc735af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62163, "upload_time": "2014-07-31T00:33:55", "url": "https://files.pythonhosted.org/packages/9a/c2/48d9df038877dac72eaa7196bd992729e09af5b0cc37138e386371857d9a/EasyFrames-0.1.7.tar.gz" } ] }